| Autor |
Beitrag |
Bleagle
Hält's aus hier
Beiträge: 10
|
Verfasst: 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 Narses: 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
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Di 10.05.11 19:15
Du musst das ganze auch neuzeichnen lassen. Dazu hilft die Funktion Application.Processmessages();.
|
|
Bleagle 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 19335
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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. 
|
|
Bleagle 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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:
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
      
Beiträge: 19335
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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. 
Einloggen, um Attachments anzusehen!
Für diesen Beitrag haben gedankt: Bleagle
|
|
Bleagle 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 19335
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 10.05.11 20:50
Ohje, überall with, unübersichtlicher gehts ja kaum.
Na gut, aber da brauche ich gar nichts ausprobieren, mir sticht sofort ins Auge (aua  ), 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: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| with form2 do begin ... if not visible then Show; imagecreate; simulation; end; |
|
|
Bleagle 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mi 11.05.11 00:46
Bleagle hat folgendes geschrieben : | | 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:
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
|
Verfasst: Mi 11.05.11 01:46
Bleagle hat folgendes geschrieben : | | 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
      
Beiträge: 19335
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 11.05.11 05:10
Luckie hat folgendes geschrieben : | | 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 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 19335
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: 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:
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!
|
|
|