Autor Beitrag
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Fr 20.02.15 11:50 
Hallo,
ich versuche mich gerade an einem nichtmodalen Fenster und schon gibt es wieder Probleme.
Das Formular2 darf nicht bei Programmstart, sondern erst bei direktem Aufruf zur Laufzeit erzeugt werden. Ein modales Fenster geht leider nicht.
Das funktioniert erst einmal ohne Probleme. Das Formularfenster kann auch minimiert und bei Bedarf wieder angezeigt werden. Hier gibt es noch kein Problem.
Um ein mehrfaches Erzeugen zu verhindern, merke ich mir in der Variablen form2aktiv den Status. Die Variable liegt global in einer übergeordneten Unit, ist also stets verfügbar.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure form2starten;
begin
  if not form2aktiv then begin
    form2aktiv:=true;
    Application.CreateForm(Tpform2, pform2);
    pform2.show;
  end
  else begin
    pform2.windowstate:=wsnormal;
    pform2.bringtofront;
  end;
end;

Da das Formular2 vom Anwender ja auch geschlossen werden kann (x-Button rechts oben, ALT+F4, Menüeintrag "Schließen"), setze ich in der close-Methode des Formulars 2 die Variable form2aktiv auf false.
Und hier liegt mein Problem. Will ich das Formular2 nun doch wieder verwenden, müsste es wieder erzeugt und angezeigt werden. Das funktioniert aber nicht korrekt. Es wird zum zweiten Mal das Formular hergestellt und fehlerhaft angezeigt.
Im Debugger-Modus sehe ich, dass pform2 vor dem erneuten Erzeugen nicht nil ist. Ist ja auch logisch, da nirgends pform2.release gerufen wird.
Was mache ich falsch? Wo ist mein Denkfehler?

Vielen Dank für Hinweise und beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19329
Erhaltene Danke: 1750

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 20.02.15 12:24 
Ich würde einfach im OnDestroy die Variable auf nil setzen und prüfen, ob diese schon zugewiesen ist. Im OnClose musst du dann nur Action auf caFree setzen.

Besser wäre aber denke ich eine zentrale Verwaltungsklasse, die das ohne globale Variablen richtig umsetzt...

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

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Fr 20.02.15 12:47 
Hallo,
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ich würde einfach im OnDestroy die Variable auf nil setzen und prüfen, ob diese schon zugewiesen ist. Im OnClose musst du dann nur Action auf caFree setzen.

Danke, das war's.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Mo 23.02.15 19:24 
Hallo,
ich muss noch einmal auf das Thema zurückkommen, da es leider Schwierigkeiten gibt.
Ich habe nun
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure form2starten;
begin
  if form2=nil then begin
    Application.CreateForm(Tform2, form2);
    form2.show;
  end else begin
    form2.windowstate:=wsnormal;
    form2.bringtofront;
  end;
end;
und
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure Tform2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ...
  action:=cafree;
end;
procedure Tform2.FormDestroy(Sender: TObject);
begin
  form2:=nil;
end;

Auf meinem Rechner mit Win 8.1 (6 GB Speicher) läuft alles perfekt. Beim Test auf einem älteren Gerät mit XP (2 GB) startet die Form2 nur höchstens einmal und ergibt dann EAccessViolation. Auf einem 3.PC mit Win 7 (4 GB) läuft scheinbar alles, bis zum Programmende. Mit deutlicher Verzögerung (etwa 1 s) erscheint dann aber eine Meldung mit einem Runtime-Error 216, also wohl auch ein EAccessViolation.
Das Dumme ist, dass auf beiden Rechnern kein Delphi installiert ist und ich daher die entsprechende Stelle, wo es "knallt", nicht lokalisieren kann.
Ich habe auch mit FastMM4 geprüft, ob bei Programmende irgendwelche Speicherlecks übrig bleiben. Nichts.
Irgendetwas mache ich immer noch falsch. Aber was?

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Muck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 98
Erhaltene Danke: 8

Win 8, Win 7, Vista, Win XP
Delphi XE3, Delphi 2009, Delphi 2007, Delphi 5
BeitragVerfasst: Mo 23.02.15 20:12 
Hi, ich glaube dieser link sollte helfen.

www.swissdelphicente...showcode.php?id=1693

Markus

_________________
Computers are like air conditioners. They work fine until you start opening windows!

Für diesen Beitrag haben gedankt: Mathematiker
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19329
Erhaltene Danke: 1750

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 23.02.15 20:42 
Ohne Quelltext lässt sich da nicht so viel zu sagen, aber am geposteten Teil des Quelltextes liegt das nicht.

Du könntest madExcept einbinden, das ist für die non-kommerzielle Verwendung kostenlos und funktioniert ab Delphi 4.

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

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Mo 23.02.15 21:56 
Hallo,
Danke für Eure Hilfe.
madExCept liefert sofort beim Start des Programms einen Fehler, dass auf irgendeiner Adresse fehlerhaft gelesen wird. D.h., ich werde jetzt suchen, bis ich die Ursache finde.

Beste Grüße
Mathematiker

Nachtrag: Unter D7 kommt die Meldung nicht, nur unter D5. D.h., irgendetwas funktioniert unter D5 nicht.
Sollte es gar nichts werden, lasse ich das nichtmodale Fenster wieder als eigene Exe laufen und rufe es so auf. Ist zwar nicht elegant, aber das funktionierte bisher problemlos.

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19329
Erhaltene Danke: 1750

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 23.02.15 22:12 
Eigentlich zeigt das aber auch genau an wo das Problem auftritt (als Stacktrace). :gruebel:

Und FastMM kannst du auch einbinden und auf einem anderen PC die Meldung bekommen. Einige Meldungen sind nur standardmäßig so eingestellt, dass sie nur beim Debuggen bzw. wenn Delphi läuft angezeigt werden, aber das lässt sich in der .inc auch anpassen.

Für diesen Beitrag haben gedankt: Mathematiker