Einzelnen Beitrag anzeigen

DrUArn

Registriert seit: 20. Mär 2003
130 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Wann sind objecte auf der IDE fertig initialisert?

  Alt 28. Feb 2018, 14:14
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
  Mit Zitat antworten Zitat