Autor Beitrag
Bleagle
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 10.05.11 19:11 
Hi, ich habe Probleme mit einem Programm.
Es soll die Flugbahn eines Satelliten um die Erde berechnen und in Echtzeit anzeigen.
Das ist eigentlich nicht schwer, ich habe sogar ein ähnliches Programm auf dem Taschenrechner.
Nur gibt es in Delphi probleme mit dem Zeichnen, sobald die Simulation startet, scheint das prog. zu "hängen"..
Ich hatte ein ähnliches problem bei einer lottosimulation, die mehrere male eine ziehung simuliert und
das ergebnis präsentiert, es wurde immer nur das letzte ergebnis angezeigt, zwischendrin wurde das label nicht
aktualisiert.
Ich hab gelesen es soll mit application.processmessages funktionieren oder mit threads.
Mit ersterem scheint es auch nicht zu klappen, also hoffe ich, ihr könnt mir helfen!

(Das ganze programm funktionert wenn ich die schleife rausnehme, und die ist nur so aufgebaut: )

While radius>erdradius do
begin
punktzeichnen;
neuen punkt errechnen;
end;


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 10.05.2011 um 22:49


Zuletzt bearbeitet von Bleagle am Mi 11.05.11 15:15, insgesamt 1-mal bearbeitet
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Di 10.05.11 19:15 
Du musst das ganze auch neuzeichnen lassen. Dazu hilft die Funktion Application.Processmessages();.
Bleagle Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 10.05.11 19:31 
Habe ich ja versucht, also so:

While radius>erdradius do
begin
punktzeichnen;
neuen punkt errechnen;
application.processmessages;
end;

immer noch das selbe problem..
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 10.05.11 19:40 
Das ist so vom Prinzip her schon korrekt, deshalb wird dir ohne konkreten Quelltext kaum jemand dabei viel helfen können. :nixweiss:
Bleagle Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 10.05.11 19:56 
Ok, sry dachte ich hätte einfach das prinzip falsch verstanden.
Hier der Quelltext, ohne ihn funktioniert das programm perfekt,
also muss der fehler da liegen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure Tform2.simulation;
begin
  with satellit do
  begin
  r:=sqrt(p(abs(x),2)+p(abs(y),2));
    while r>erad do
    begin
    Isimulation.Canvas.Pixels[round(x+Mitte.x),round(y+Mitte.y)]:=clGreen;
    r:=sqrt(p(abs(x),2)+p(abs(y),2));
    ax:=(-gamma*emass/p(r,3))*x;
    ay:=(-gamma*emass/p(r,3))*y;
    vx:=vx+ax*dt;
    vy:=vy+ay*dt;
    x:=x+vx*dt;
    y:=y+vy*dt;
    application.ProcessMessages;
    end;
  end;
end;


Nur einfache Rechnungen, wobei P() dasselbe wie power() ist (potenzfunktion).
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 10.05.11 20:16 
Im Anhang liegt eine kleine Demo, die das ganz genau so macht. Ich weiß nicht was du da sonst noch machst, aber das klappt so. Du kannst es ja damit ausprobieren. :nixweiss:
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: Bleagle
Bleagle Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 10.05.11 20:34 
Hmm, vielen Dank für die Demo, genau so solls eigentlich funktionieren..
Hier mal das ganze Paket, aber haut mich nicht für die schlechte programmierung ^^
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 10.05.11 20:50 
Ohje, überall with, unübersichtlicher gehts ja kaum. :shock:
Na gut, aber da brauche ich gar nichts ausprobieren, mir sticht sofort ins Auge (aua :D), dass du die Schleife ausführst bevor du das Formular anzeigst. Das kann nicht gehen...

OnShow wird ausgeführt, wenn das Fenster gerade angezeigt wird, aber bevor es wirklich da ist. Das hättest du eigentlich auch beim Debuggen merken müssen.

Nimm einfach die Anzeige aus dem OnShow heraus und pack das in den Button:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  with form2 do
  begin
    ...
    if not visible then // besser gleich richtig...
      Show;
    imagecreate; // immer ausführen, nicht nur in else
    simulation;
  end;
Bleagle Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 10.05.11 21:28 
Warum ist with unübersichtlich? Ist doch besser als jedes mal das Objekt nochmal zu schreiben.
Es scheint zwar immer noch einen Fehler zu geben, aber das krieg ich hin.
Ja, ich hab gemerkt, dass das Fenster nicht gezeigt wurde, aber ich konnte mir nicht erklären warum..

Und ich dachte modal verhindert einfach nur ein zugriff auf das hauptfenster. aber es unterbricht ja auch die anwendung..

Naja, danke!

PS: Hast du sonst noch irgendeinen Tipp für einen besseren Stil?
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mi 11.05.11 00:46 
user profile iconBleagle hat folgendes geschrieben Zum zitierten Posting springen:
Warum ist with unübersichtlich? Ist doch besser als jedes mal das Objekt nochmal zu schreiben.


Es mag zwar weniger schreibarbeit sein, aber übersichtlicher keinenfalls. Folgendes Beispiel:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TFormMain.DoSomething();
begin
  with SomeObject do begin
    width := 500;
  end;
end;


So, jetzt ist die Frage: Ist nun die FormMain.Width-Eigenschaft gemeint, oder vielleicht die SomeObject.Width-Eigenschaft? Das kann man nicht mehr so klar rauslesen (was dann auch öfter zu problemen führt, weil eben genau das falsche ausgeführt wird).

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 11.05.11 01:46 
user profile iconBleagle hat folgendes geschrieben Zum zitierten Posting springen:
Und ich dachte modal verhindert einfach nur ein zugriff auf das hauptfenster. aber es unterbricht ja auch die anwendung..

Da fehlt wieder das Hintergrundwissen über die Interna. Die Messagebox wird modal angezeigt und so lange sie angezeigt wird, wird auch die Nachrichtenschleife des übergeordneten Fensters unterbrochen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 11.05.11 05:10 
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Die Messagebox wird modal angezeigt und so lange sie angezeigt wird, wird auch die Nachrichtenschleife des übergeordneten Fensters unterbrochen.
Sorry, aber das stimmt nicht. ;-)

Wie würde dann das übergeordnete Fenster derweil neu gezeichnet? Zudem kannst du es leicht ausprobieren: Schick dir einfach aus dem modal angezeigten Fenster eine Message an das übergeordnete Fenster und lass dort daraufhin z.B. eine MessageBox anzeigen. Das wird funktionieren.

Was intern passiert ist grob gesagt einfach nur, dass das Fenster in eine entsprechende Liste eingetragen und mit Show angezeigt wird. Danach wartet ShowModal in einer Schleife darauf, dass die Anwendung beendet wurde oder ModalResult des Formulars gesetzt wurde, wobei immer wieder Application.HandleMessage aufgerufen wird, damit derweil auch alle Messages behandelt werde.

Durch die Schleife wird der Programmablauf der aufrufenden Routine unterbrochen, da man in ShowModal drin bleibt. Messages hingegen werden weiter abgearbeitet.
Bleagle Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 11.05.11 12:06 
Naja, ich war es bisher gewohnt die programme möglichst kurz zu halten, deshalb das with. aber auf dem pc macht das wohl nix aus. werde es mir merken. kenne delphi bisher auch nur aus der schule bzw. dem grundlagen kurs aus delphi-treff. ich lerne lieber während ich ein programm schreibe, hat mir bisher am meisten gebracht.
ich weiß, das schweift vom eigentlichen thema ab, aber gibt es irgendwelche tutorials/kurse die ihr empfehlen könntet?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 11.05.11 12:28 
Für die Schreibweise von Delphi-Quelltext gibt es hier einen Styleguide:
dn.codegear.com/article/10280 (englisch)
www.delphi-treff.de/delphi-styleguide/ (deutsch)
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Mi 11.05.11 12:52 
Noch kurz zum with:

Wir haben das aus historischen Gründen über das ganze Programm verteilt und wenn ich die Zeit habe baue ich das auch aus. Da sind dann teilweise mehrere Objekte mit behandelt *graus*.

Wir haben z.B. mehrere Datenmodule auf denen globale SQL-Queries liegen (auch nicht gerade best-practice aber nicht eben zu ändern), so dass z.B. folgender Code entsteht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  with dmModul1, dmModul2 do
  begin
    Query1.SQL.Add('...');
    Query1.Open;

    Query2.SQL.Add('...');
    Query2.SQL.Exec;

    Variable1 := 7.5;
  end;


Auf welchem der beiden Datenmodule jetzt die Queries liegen ist nicht ersichtlich, auch hatten wir das Problem mit Variablen öfter, so dass derselbe Variablenname sowohl in dmModul1 als auch lokal genutzt wurde. In der Regel ist es dann immer die falsche Variable die verwendet wird. :)

Also: Finger weg von with!