Autor Beitrag
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 07.01.14 14:37 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var 
  Form1: TForm1;

procedure TForm1.MachZu;
  Form1.Close;
end;

Das funktioniert genau solange, wie eine Instanz von TForm1 in der globalen Variablen Form1 hinterlegt ist. Hier würde es knallen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var 
  Form1: TForm1;
  FormMain: TForm1;

...

FormMain := TForm1.Create(Applicaton);

...

procedure TForm1.MachZu;
  Form1.Close;
end;

Hier gibt es keine Instanz von TForm1 in Form1, sondern in FormMain. Und das ist der entscheidende Unterschied. Und selbst wenn es beide Instanzen gibt, wird immer auf dieselbe zugegriffen, das ist mit ziemlicher Sicherheit so nicht beabsichtigt.
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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
ausblenden 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. :wink:

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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Di 07.01.14 14:52 
Wird das Formular 1 genau wie Formular 2 erzeugt (in program pplasma):

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Di 07.01.14 14:59 
user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 07.01.14 15:25 
user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden 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):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
         cmp eax, 0         //Test auf Null
         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



BeitragVerfasst: Di 07.01.14 15:47 
Ich habe jetzt DIE Lösung, die auch unseren Mathematiker zufriedenstellen wird:

ausblenden 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//muss hier stehen, weil sonst der [X]-Button nicht funktioniert!
end;
...

///Rotationsschleife
   repeat
   if FCanClose = True then exit;
...

Für diesen Beitrag haben gedankt: Mathematiker
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 07.01.14 15:55 
Hallo,
user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe jetzt DIE Lösung, die auch unseren Mathematiker zufriedenstellen wird:

Danke, werde ich sofort ausprobieren.
Aber ...

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Lösen lässt sich das sehr einfach. Du musst die Abbruchbedingung der Schleife so schreiben:
ausblenden 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 :flehan: .

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 07.01.14 15:56 
user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
   if FCanClose = True then exit;
...

Ich hatte es zwar eben schon angesprochen, aber bitteschön: http://delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/typische-anfaengerfehler/

Für diesen Beitrag haben gedankt: Martok
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 07.01.14 16:28 
Hallo,
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconhathor in Schutz nehmen.
Er hat nur das gemacht, was ich schon begonnen hatte. Der Vergleich auf "true" usw. stammt aus meinem Beispielprogramm. :autsch:

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 07.01.14 16:32 
Dann schäme er sich, und ihm wird vergeben werden :zwinker:
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: 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.

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Der Vergleich auf "true" usw. stammt aus meinem Beispielprogramm. :autsch:


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 07.01.14 18:21 
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
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



BeitragVerfasst: Di 07.01.14 18:22 
user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
...

Ich hatte es zwar eben schon angesprochen, aber bitteschön: [url=delphi-treff.de/tuto...faengerfehler/[/url]


Wer sich ausgerechnet auf diese Seite bezieht, sollte mal das Gehirn einschalten!

ausblenden 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;

//Diese Function ist völlig ungeeignet, um die Boolean-Problematik darzustellen:

BoolToStr(GaaanzFieseAPIFunktion)); 
// ergibt eine Farbe: clLime, aber kein boolsches Äquivalent.
//Manchmal ist es auch rot:
Form1.Color:= Integer(GaaanzFieseAPIFunktion);


var
  b := Boolean;  //geht auch nicht! Was hat der Depp für ein DELPHI?


Zuletzt bearbeitet von hathor am Di 07.01.14 18:38, insgesamt 1-mal bearbeitet
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 07.01.14 18:32 
Du weißt schon, dass Niveau keine Handcreme ist?