Autor |
Beitrag |
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 07.01.14 14:24
Close oder Form1.Close
Was spielt das für eine Rolle?
Wenn Du schon was zu meckern hast, dann begründe es!
|
|
WasWeißDennIch
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 07.01.14 14:37
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 07.01.14 14:51
Hallo,
Danke für die Hinweise.
Einen Ausstiegsschalter in der beschriebenen Form hatte ich schon eingefügt und der funktionierte auch fehlerfrei.
Scheinbar gibt es nur die eine Möglichkeit, während einer nicht timergesteuerten Animation in einem modularen Fenster, den X-Button der Titelzeile aufzurufen (und darum geht es mir ja). Also habe ich bei jeder derartigen Animation wieder
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm.WndProc(var msg:TMessage); begin case Msg.Msg of WM_CLOSE: begin if not sofortabbruch then sofortabbruch:=true; close; end Else inherited; end; end; |
eingefügt und massiv getestet. FastMM zugeschaltet und immer wieder an den unmöglichsten Stellen während der Animation auf X gedrückt, ergab bei keiner der Routinen Probleme. Bisher jedenfalls nicht.
Mal sehen, ob in der nächsten Zeit auf irgendeinem Rechner doch Schwierigkeiten auftreten. Wenn ja, ist es ärgerlich, aber es gibt ja keine fehlerfreie Software und von mir(!) schon gar nicht.
Außerdem habe ich angefangen, einige Animationen doch mit einem Timer zu steuern. Es wird etwas langsamer, aber bei den heutigen Rechnern immer noch schnell genug.
Beste Grüße und Danke für die Hilfe
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Di 07.01.14 14:52
Wird das Formular 1 genau wie Formular 2 erzeugt (in program pplasma):
Delphi-Quelltext 1: 2: 3: 4: 5:
| Application.Initialize; Application.Title := 'Plasma'; Application.CreateForm(TForm2, Form2); Application.CreateForm(TForm1, Form1); Application.Run; |
und wird das Formular 1 in unit plasmaaufrufen so aufgerufen:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm2.Button1Click(Sender: TObject); begin form1.show end; |
, dann läßt sich das Formular 1 auch einfach und sauber beenden (inkl. Schleifenabbruch). Heureka?!
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Di 07.01.14 14:59
Mathematiker hat folgendes geschrieben : | Außerdem habe ich angefangen, einige Animationen doch mit einem Timer zu steuern. Es wird etwas langsamer, aber bei den heutigen Rechnern immer noch schnell genug. |
Zwar steht es mir nicht zu, Dich zu bevormunden, Mathematiker, aber wenn ich etwas dazu loslassen darf: Bitte nicht. Das ist unelegant. Gerade hohe Rechengeschwindigkeit begründet oft erst den eigentlichen Augenschmaus. Tendenziell, solange wir mit Computern zu tun hattenn, waren diese bisher immer doch eher zu langsam als zu schnell. Auch Deine Farbrotation wird umso beeindruckender, je schneller sie abläuft (natürlich nur bis zu einer gewissen Grenze). Insofern wäre es schade, ein wertvolles Potential zu verschenken.
Außerdem haben Timer gerade nicht(s) mit der Rechengeschwindigkeit zu tun, schon gar nicht bei "heutigen Rechnern", die "immer noch schnell genug" sind. Höchstens umgekehrt wird ein Schuh daraus: Wenn ein Computer zu langsam ist, kann es sein, daß der Timer nicht mehr hinterherkommt und auslösende Ereignisse ausgelassen werden ("unter den Tisch fallen").
Zuletzt bearbeitet von Delphi-Laie am Di 07.01.14 17:44, insgesamt 2-mal bearbeitet
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 07.01.14 15:25
Mathematiker hat folgendes geschrieben : | Ich habe ein älteres Programm etwas verändert und hänge es einmal 'ran. Die Plasmadarstellung ist in einem modalen Fenster, so wie meine eigentliche Animation.
Startet man nach dem Zeichnen die Farbrotation hat der X-Button "keine Wirkung" mehr. |
Lösen lässt sich das sehr einfach. Du musst die Abbruchbedingung der Schleife so schreiben: Delphi-Quelltext 1:
| until not rotation or (ModalResult <> mrNone); | Hintergrund ist, dass du das aus einem ShowModal aufrufst und dementsprechend in einer neuen Nachrichtenwarteschlange.
Dein Assemblercode in der Funktion farbmitte ist jedenfalls nicht korrekt. Richtig (ohne genauer geschaut zu haben was der macht): Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| cmp eax, 0 jz @null jmp @end @null: mov eax, 1 @end: nop end; | Hintergrund:
Das ret kommt beim end automatisch. Dadurch, dass du noch ein eigenes einfügst, zerschießt du dir den Stack, und zwar gründlich...
Für diesen Beitrag haben gedankt: Delphi-Laie, Mathematiker
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 07.01.14 15:47
Ich habe jetzt DIE Lösung, die auch unseren Mathematiker zufriedenstellen wird:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| ... private FCanClose : Boolean; procedure WMNCLBUTTONDOWN(var msg: TMessage); message WM_NCLBUTTONDOWN;
... procedure TForm1.WMNCLBUTTONDOWN(var msg: TMessage); begin if msg.wParam = HTCLOSE then BEGIN Windows.Beep(800,50); FCanClose:=true; Close; END; inherited; end; ...
repeat if FCanClose = True then exit; ... |
Für diesen Beitrag haben gedankt: Mathematiker
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 07.01.14 15:55
Hallo,
hathor hat folgendes geschrieben : | Ich habe jetzt DIE Lösung, die auch unseren Mathematiker zufriedenstellen wird: |
Danke, werde ich sofort ausprobieren.
Aber ...
jaenicke hat folgendes geschrieben : | Lösen lässt sich das sehr einfach. Du musst die Abbruchbedingung der Schleife so schreiben: Delphi-Quelltext 1:
| until not rotation or (ModalResult <> mrNone); | Hintergrund ist, dass du das aus einem ShowModal aufrufst und dementsprechend in einer neuen Nachrichtenwarteschlange. |
"Sehr einfach"? Ja, es ist sehr einfach, aber auf so etwas wäre ich nie gekommen. Es funktioniert absolut perfekt.
Besten Dank und tiefe Verbeugung .
jaenicke hat folgendes geschrieben : | Dein Assemblercode in der Funktion farbmitte ist jedenfalls nicht korrekt. ... |
Super. Bei einem Problem bekomme ich gleich die Lösungen für zwei Sachen.
Nochmals vielen Dank.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Di 07.01.14 15:56
Kann nicht dieser redundante und hinsichtlich binärer Interna genaugenommen sogar falsche (weil fehlerträchtige) Vergleich boolescher Variablen mit "true" bzw. "false" endlich mal aufhören?
Zuletzt bearbeitet von Delphi-Laie am Di 07.01.14 15:57, insgesamt 1-mal bearbeitet
Für diesen Beitrag haben gedankt: Martok
|
|
WasWeißDennIch
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 07.01.14 15:56
Für diesen Beitrag haben gedankt: Martok
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 07.01.14 16:28
Hallo,
Delphi-Laie hat folgendes geschrieben : | Kann nicht dieser redundante und hinsichtlich binärer Interna genaugenommen sogar falsche (weil fehlerträchtige) Vergleich boolescher Variablen mit "true" bzw. "false" endlich mal aufhören? |
Ich muss hathor in Schutz nehmen.
Er hat nur das gemacht, was ich schon begonnen hatte. Der Vergleich auf "true" usw. stammt aus meinem Beispielprogramm.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
WasWeißDennIch
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 07.01.14 16:32
Dann schäme er sich, und ihm wird vergeben werden
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Di 07.01.14 17:35
Nunja, ich bin mir sicher, daß das Helferlein es besser wußte und nehme zu seinem Gunsten an, daß nur Flüchtigkeit die Ursache war. Allerdings wurde das in dieser Diskussion auch schon vorher moniert.
Mathematiker hat folgendes geschrieben : | Der Vergleich auf "true" usw. stammt aus meinem Beispielprogramm. |
Vermutlich aber letztlich aus Deinem übergeordneten Programm. Programmierstile schleifen sich über Jahre ein und verfestigen sich, man schleppt einiges ewig mit sich umher - sei es mental, sei es in Form so mancher Quelltexte.
Auch die In-/Dekrementierung integrer Variablen geht übrigens eleganter als mit den Rechenoperationen. Allerdings soll der Compiler das ohnehin erkennen und optimieren.
Warum Dein (scheinbar unbeendbares) Fenster, das uns so sehr beschäftigte, modal sein soll, erschließt sich mir nicht. Klar, es wird erst zur Laufzeit (besser: bei Bedarf) erzeugt, aber welchen Vorteil hat das? Speicherbedarfsreduktion? Konsequenterweise sollte es dann beim X-Druck auch zur Laufzeit "zerstört" werden.
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 07.01.14 18:21
Delphi-Laie hat folgendes geschrieben : | Warum Dein (scheinbar unbeendbares) Fenster, das uns so sehr beschäftigte, modal sein soll, erschließt sich mir nicht. Klar, es wird erst zur Laufzeit (besser: bei Bedarf) erzeugt, aber welchen Vorteil hat das? |
Schnellerer Start? Bei vielen Formularen dauert der Start sonst ewig, vom Speicherverbrauch ganz abgesehen.
Und modal, damit man an das aufrufende Fenster derweil nicht herankommt, dafür ist modal ja da.
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 07.01.14 18:22
Wer sich ausgerechnet auf diese Seite bezieht, sollte mal das Gehirn einschalten!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function GaaanzFieseAPIFunktion: Boolean; asm mov eax, -$01 end;
BoolToStr(GaaanzFieseAPIFunktion)); Form1.Color:= Integer(GaaanzFieseAPIFunktion);
var b := Boolean; |
Zuletzt bearbeitet von hathor am Di 07.01.14 18:38, insgesamt 1-mal bearbeitet
|
|
WasWeißDennIch
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 07.01.14 18:32
Du weißt schon, dass Niveau keine Handcreme ist?
|
|