procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: boolean);
begin
// Timer1.enabled:=FALSE; ich würde hier auch den Timer stoppen, aber das scheint es nicht zu sein
StartUp:=TRUE; // damit nicht neu gezeichnet wird.
end;
Hi!
Guter Trick! Hätte von mir stammen können. Wenn ich Win10 hätte ...
af0815 hat geschrieben: Mi 12. Mai 2021, 16:28
Das Grundlegende Problem ist, das die OnPaint Routine laufend angesprungen wird und alles blockiert, auch das Close. Jetzt geht auch der Timer mit 10ms Zyklus und der Mond ändert sich rasch.
Hi!
Unter Win7 nicht. Wie gesagt: Das ist "Fortschritt."
Aber Danke für Deine Infos aus dem schnellen Rechner.
ProcessMessages wird "normalerweise" ja nicht benötigt und frisst CPU Zeit.
Wenn ich den Block mit den Icons rausnehme, geht das wunderbar auch ohne ProcessMessages
auch mit Timer Interval 10
Habe ich aber den Block mit den Icons drin, dann geht es ohne ProcessMesages garnicht mehr.
Wie kommt das denn ?
Bei den Icons liegt meiner Meinung nach das Hauptproblem...
Nehme ich das raus und auch ProcessMessages, dann gibt es keine Probleme, dann brauche ich auch
nicht die FormCloseQuery ändern...so scheint es zumindest bei mir zu sein.
Grüße von Siro Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Du stösst da auf einen kritischen Punkt unter Windows: Das zeichnen auf das Form.Icon, denn das Zeichnen auf das Application.Icon erledigt er klaglos.
Wie im Source schon vermerkt bringt ein copyRect auf den Form.Icon.Canvas die ganze App zum Stilstand - frozen. Die kann man nur noch mittels der IDE oder mit dem Taskmanager abwürgen. Anscheinend mag Windows das nicht, wenn man regelmässig auf das Form.Icon zeichnet. Aber da das Ganze ans Windows Widget Set übergeben wird, kann man es auch kaum entwanzen. Also das draw auf den Form.Ion.Canvas ausklammern. Schade.
Unter Linux/gtk2 gibt es keine Probleme.
Ach wenn sie doch endlich Windows aus Datenschutzgründen verbieten würden.. Die rechtliche Grundlage ist vorhanden, nur traut sich keiner. Die Macht der Monopole .....
Es ist aber trotz alledem ein sehr schönes Beispiel was Du da gebaut hast.
Hier kann man nämlich sehen, das der Mond nicht immer Sichelförmig ist, das hat ein Bekannter von mir nicht geglaubt.
Jetzt hab ich es schwarz auf weiss, bzw. Gelb auf Blau
Grüße von Siro Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bei mir tut es genau das was Winni beschrieben hat, kein Fehler kein Nebeneffekte.
Windows 10 Pro, Lazarus 2.0.11, fpc 3.2.1. alles 64 bit.
Wenn man aufpasst, dann kann man es auch bißchen effizienter machen z.B. in der Prozedur DrawMoon TBGRABITMAP nichtt ständig neu erstellen und freigeben. Mann kann es als globale objekt Variable deklarieren und die Zeit beim erzeugen und zerstören sparen. Gerade neue Speicher Anforderungen sind doch langsam.
Soner hat geschrieben: Mi 12. Mai 2021, 20:02
Wenn man aufpasst, dann kann man es auch bißchen effizienter machen z.B. in der Prozedur DrawMoon TBGRABITMAP nichtt ständig neu erstellen und freigeben. Mann kann es als globale objekt Variable deklarieren und die Zeit beim erzeugen und zerstören sparen. Gerade neue Speicher Anforderungen sind doch langsam.
Hi!
Ja - manchmal muss man sich entspannt zurücklehnen und sich sein Zeugs in Ruhe ansehen.
Die Var "sign" in CreateMoon kann man mit einem abs () auch überflüssig machen. Und bestimmt noch mehr. Ich hab das ziemlich runtergehauen. Die meiste Zeit hab ich mit den widerspenstigen Icons unter Windows verbracht.
Für eine naturalistische Ansicht bräuchte man natürlich noch den Breitengrad. Ich bin immer wieder erstaunt, wie der Mond im südlichen Mittelmeer auf dem Rücken liegt. Aber das sollte ja keine wissenschaftliche Abhandlung werden.
Ich hab mir die Probleme angesehen und jetzt eine Version erstellt, die auch auf schwachbrüstigen Rechnern laufen sollte:
* Die BGRAbitmap für den Mond wird nur bei einem resize neu erzeugt.
* Die BGRABitmap für die Icons wird separat erzeugt und nicht mehr aus der Mond-Bitmap erzeugt
* Für die Icons wird jetzt ein separates Polygon aus dem Mond-Polygon erzeugt
* Dem Problem beim Exit wird begegnet indem er 2*Timer.Intervall schläft, bevor er den Laden zumacht.
* Außerdem wird vor dem Exit das Zeichnen ausgestellt.
Für Geschwindigkeits-Fetischisten gibt es noch ein zweites Label, das die Millisekenden für Mond und Icons anzeigt. Wer das nicht sehen möchte, kann es mit Ctrl-T aus- (und wieder an-) schalten.
Wäre es nicht besser, sich zum Programmstart (oder evtl sogar vorher) eine ico-Datei mit sowas wie 36 Bildern zu erstellen (10-Grad-Schritte, oder feiner aufgelöst) und dem Application.Icon zuzuweisen anstatt zur Laufzeit im Icon herumzumalen, was Windows offenbar überhaupt nicht mag? Zur Laufzeit wählt man dann das zur aktuellen Mondphase passende Teilbild aus (icon.Current := ..., wenn ich mich recht erinnere).