Hallo Himitsu,
der Absturz ist mir auf der
IDE passiert, nicht bei laufendem Programm. Ich schaue mir deinen Code noch an, aber dazu brauche ich wohl länger.
Ich versuch's mal mit dem Showmodal-Fenster:
(die mich interessierende Stelle habe ich weiter unten nochmal editiert)
Delphi-Quellcode:
procedure TSimpTestRich_UA.ShowOptsEditor;
//mal bitte nicht den Sinn dieser Routine hinterfragen - normalerweise steckt sie in
//einer Komponente, die nach außen mit Window-Messages kommuniziert
//mit dem Editor kann mann die Oben Beschriebenen Komoponenten (SubRichEd,...) laden und wieder löschen
var i,l,t,checkwidth:integer;
tb:tbutton;
tf:tform;
begin
{das Modalfenster}
tf:=tform.create(application);
tf.name:='DockEinstellungen';
tf.Caption:='DockEinstellungen von '+ owner.name;
tf.AutoSize:=true;
tf.formstyle:=fsstayontop;
{die Checkbox-Box}
if not assigned(groupbox) //beim ersten Aufruf kann sie nicht assigned sein
then groupbox:=tgroupbox.create(owner);//Owner ist TSimpTestRich_UA
groupbox.parent:=tf;//der Anzeige-Ort für die Groupbox ist das modale Fenster
groupbox.name:='do_Groupbox';
l:=10; t:=20; checkwidth:=0;
{checkboxes zuordnen}
for I := integer(Low(tShowopt_UA)) to integer(High(tShowopt_UA)) do
begin
with tcheckbox.create(groupbox) do
begin
parent:=groupbox;
left:=l;top:=t;
caption:=DockOptsCaps_UA[tShowopt_UA(i)];
name:=DockOptsCaps_UA[tShowopt_UA(i)];
if checkwidth<height + length(caption)* groupbox.font.size then
checkwidth:=length(caption)* groupbox.font.size; //größte Breite mitrechnen
checked:= tShowopt_UA(i) in Showopts;
tag:=integer(tShowopt_UA(i));
inc(t,height);
OnClick:=onCheckboxclick; //was soll bei Clicken passieren
end;
end;
inc(t,20);
{eine Extra-Checkbox, um zu bestimmen, ob die Eigenschaft sofort gesetzt werden soll - True=Ja}
with tcheckbox.create(groupbox) do
begin
parent:=groupbox;
left:=l;top:=t;
checked:=false;
caption:='sofort anwenden';
name:='sofort_anwenden';
end;
inc(t,20);
{noch die obligaten Schließen-Knöpfe}
with tbutton.create(tf) do
begin
parent:=tf;
top:=t;left:=groupbox.left;
name:='DockOptsButton_OK';
Caption:='OK/Schliessen';
ModalResult:=mrOk;
end;
with tbutton.create(tf) do
begin
parent:=tf;
top:=t;left:=groupbox.left+Width;
name:='ShowOptsButton_Abbrechen';
Caption:='Abbrechen';
ModalResult:= mrCancel;
t:=t+Height;
end;
for i := 0 to groupbox.controlcount-1 do
groupbox.Controls[i].Width:=checkwidth; // alle Cjeckckboxen haben die gleich max. Breite -vielleicht nicht nötig
groupbox.width:=checkwidth;//Groupbox auch die größte Breite
groupbox.Height:=t+10;
groupbox.name:='Andockoptionen';
{Erscheinungsort errechenen - geht aber nicht}
tf.left:=left;
tf.top:=top;
if tf.showmodal=mrok then
onCheckboxclick(self);//normalerweise rufen die Checkboxen oncheckboxclick auf, hier vereinbarungsgemäß setzen dort ohne Prüfung sofortsetzen
tf.free;
{??lebt die Groupbox noch oder ist sie weg??
wenn ja, wie so - DER owner ist doch TSimpTestRich_UA?
}
if assigned(groupbox)
then
begin
try
groupbox.free; //ergibt Fehler
except
lines.add('groupbox scheint assigned, aber ist nicht löschbar');
groupbox:=nil;
end;
end;
// wenn ich GrouBox nicht nil setze und das Fenster neu aufrufe, gibts auch einen Fehler
//lesen von 000000 und das programm ist kaputt
end;
Wichtig für mich zum Verstehen ist nur dieser Teil:
Delphi-Quellcode:
// ....
if tf.showmodal=mrok then
onCheckboxclick(self);//normalerweise rufen die Checkboxen oncheckboxclick auf, hier vereinbarungsgemäß setzen dort ohne Prüfung sofortsetzen
tf.free;
{??lebt die Groupbox noch oder ist sie weg??
wenn ja, wie so - DER owner ist doch TSimpTestRich_UA?
}
if assigned(groupbox)
then
begin
try
groupbox.free; //ergibt Fehler
except
lines.add('groupbox scheint assigned, aber ist nicht löschbar');
groupbox:=nil;
end;
end;
// wenn ich GrouBox nicht nil setze und das Fenster neu aufrufe, gibts auch einen Fehler
//lesen von 000000 und das programm ist kaputt
// ....
Es fühlt sich so an , als ob beim Schließen dieses modalen Fensters TF ein Object (hier GroupBox) gelöscht wird, obwohl es dem Shomodal-Fenster TF nicht gehört, also nicht in der Owner-Liste steht.
Und auf dem Desktop auftauchen tut dieses Fenster wo es will
{Erscheinungsort errechenen - geht aber nicht}
tf.left:=left;
tf.top:=top;
Grüße Uwe