Entwickler-Ecke

Sonstiges (Delphi) - Fehler beim Erzeugen eines Fensters


matt - Mi 31.07.02 13:34
Titel: Fehler beim Erzeugen eines Fensters
Ich arbeite noch mit Delphi 1. Das Programm besteht aus einem Hauptformular und einer Reihe von Unterformularen vom Typ fsNormal die über ShowModal aufgerufen werden. Alle Formulare werden automatisch beim Programmstart mit CreateForm erstellt.

Nun habe ich verstärkt das Problem, dass beim Anzeigen des achten oder neunten Fensters plötzlich die Meldung "Fehler beim Erzeugen eines Fensters" erscheint und nichts mehr angezeigt wird.

Das Problem muss irgendwie mit der Ressourcen-Verteilung zusammen hängen. Ich habe schon mit den Stack- und Heap-Vorgaben gespielt, aber eine endgültige Lösung hat das auch nicht gebracht. Wer kann helfen?


GPF - Mi 31.07.02 14:48

Ich kann nur vermuten - den Quelltext bzw. das Programm müßte ich schon sehen um eine genaue Fehleranalyse zu starten.
Deine Fehlerbeschreibung läßt mich allerdings vermuten, daß Du zuviele Windowshandles benutzt. Alle Komponenten, die von TWinControl abgeleitet sind benötigen Windows Handles.
Windows 3.1 und Windows 95 können nur eine begrenzte Anzahl von Handles verwalten. Danach stürzt das System unweigerlich ab (Windows NT und Nachfolger haben diese Beschränkung nicht). Ich vermute mal, daß dies Dein Problem sein könnte. Versuche einfach mal das Programm unter Win NT/2000/XP zu starten. Tritt dann der Fehler immer noch auf?

Die einzigste Lösung besteht darin die Handleanzahl zu minimieren. Erstelle nur die Formulare, die Du wirklich benötigst. Eine andere Möglichkeit diese Limitierung zu umgehen besteht leider nicht.


matt - Do 01.08.02 08:05

In der Tat tritt das Problem bei Windows XP nicht auf. Allerdings muss ich auch für Windows 95 etc. eine Lösung finden, da dass Programm auch hier laufen muss.

Ich habe jetzt den Aufruf der Fenster verändert von

Quelltext
1:
MyForm.ShowModal;                    

nach

Quelltext
1:
2:
3:
Application.CreateForm(TMyForm, MyForm);
MyForm.ShowModal;
MyForm.Free;

Damit sollten doch die Ressourcen beim Schließen des Fensters wieder freigegeben werden, oder? In der Praxis verhält sich das Programm jetzt auch stabiler, wenn auch noch nicht 100prozentig.


Renegade - Do 01.08.02 12:36

So sollte es funktionieren :D


matt - Fr 02.08.02 07:17

In anderen Beiträgen finde ich immer wieder folgendes Konstrukt:

Quelltext
1:
2:
3:
4:
5:
6:
7:
Var 
  MyForm: TMyForm; 
begin 
  MyForm := TMyForm.Create(self); 
  MyForm.ShowModal; 
  MyForm.Free;          
end;

Gibt es da einen wesentlichen Unterschied zu dem von mir verwendeten oder sind die beiden Versionen gleichwertig?

Quelltext
1:
2:
3:
4:
5:
begin
  Application.CreateForm(TMyForm, MyForm); 
  MyForm.ShowModal;  
  MyForm.Free;
end;


Renegade - Fr 02.08.02 08:37

Moin

Ich muß ganz ehrlich gestehen, daß ich dein Konstrukt vorher noch nicht gesehen habe :oops: !

Wenn ich das jetzt richtig in der eile in der Hilfe überflogen habe, sollte im endeffekt zwischen den beiden Varianten kein großer Unterschied bestehen.

Allerdings ist die letztere Variante in meinen Augen die mit Abstand gängigere Version.

Gruß