Hallo miteinander
Bei mir happert's irgendwie an einer Komponente, die ich geschrieben habe. Mir ist irgendwie (nicht) mehr klar, in welcher Reihenfolge was wann erstellt wird.
Und zwar hab ich folgendes Szenario:
Ich habe eine Komponente (abgeleitet von TComponent) die ich zu Designtime auf mein Form oder Frame knalle. Diese Komponente hat die Eigenschaft "active". Ist dies gesetzt, soll beim Aufruf des Form/Frames die Komponente beginnen zu arbeiten.
In diesem active-property werden alle Unterkomponenten des Parents durchgeloopt. Wenn die Komponente also auf einem Frame liegt, werden alle Komponenten (wie Edits, Labels, etc) dieses Frames abgearbeitet.
Dies funktioniert gut, bis auf das Popupmenu. Dies findet er einfach nicht. Gebe ich die Anzahl Komponenten zurück, so hat er viel weniger als wenn ich die Komponentenanzahl z.B. bei einem Buttonklick anzeige.
Daher meine Vermutung: Das active-property wird gesetzt bevor alle Komponenten wirklich gezeichnet wurden.
Dazu muss ich noch sagen, dass die Komponente auf dem geerbten Form/Frame liegt und das Popupmenu auf dem abgeleiteten Frame.
Handelt es sich um ein Form könnte ich mich irgendwie ins OnFormCreate oder so einklinken, aber beim Frame gibt es sowas nicht.
Hat da jemand eine Idee?
Verkürzter Code:
Delphi-Quellcode:
TcTrans = class(TComponent)
private
FActive: Boolean;
FForm: TComponent;
protected
procedure SetActive(const Value: Boolean);
public
constructor Create( _owner: TComponent ); override;
destructor Destroy; override;
published
property Active: Boolean read FActive write SetActive default false;
end;
constructor TcTrans.Create(_owner: TComponent);
begin
inherited;
FForm:= _owner;
FActive:= false;
end;
procedure TcTrans.SetActive(const Value: Boolean);
var
i: Integer;
begin
if Value then begin
for i:= 0 to FForm.ComponentCount - 1 do begin
if FForm.Component[ i ] is TPopupMenu then
ShowMessage('Chewbacca!');
end;
ShowMessage(IntToStr(FForm.ComponentCount));
end;
end;