![]() |
Parent Problem
Hallo zusammen,
ich habe ein Problem wofür ich keine Lösung weiss. Ich habe eine eigene Komponente auf Basis eines Panels. Auf diesem liegt eine Combobox. Diese lege ich beim Erzeugen der Klasse an, und versuche die Items zu ändern. Ich erzeuge die Klasse in meinem Programm mit: x := TMyClass.Create(self); x.Parent := self; Leider bleibt er schon beim Create hängen und zwar beim Items.Clear der Combobox. Was muss ich nun tun? Muss ich das Parent nach dem Create auf Parent := TWinControl(AOwner) oder die Items.Clear später ausführen? Wenn ja, wann? Ich bin ein bisschen ratlos. Danke für eure Hilfe. Oliver |
Re: Parent Problem
Hi,
die Combobox arbeitet nicht so richtig rund ohne übergeordenetes Fenster. Du solltest also die Items immer nur dann verändern (egal wie), wenn Du die Combobox (oder die Hierachie von möglichen Parents) in einem Fenster liegt. In diesem Fall muss das Panel also auf einem Fenster platziert werden (bzw. ebend ein der Parent des Panel oder dessen Parent...). Gruß Der Unwissende |
Re: Parent Problem
Soweit hatte ich mir das schon gedacht.
Die Frage ist, ob es eine Funktion gibt die ich überladen kann, wenn das Parent zugewiesen wird. |
Re: Parent Problem
es wäre doch möglich über den ersten parameter ein owner zu übergeben (z.B. Form1)
Delphi-Quellcode:
x := TMyClass.Create(Form1);
with x do begin Parent := Form1; [...] end; x.Free; |
Re: Parent Problem
Zitat:
|
Re: Parent Problem
Am Besten Du überschreibst einfach die Parent-Property deiner Klasse (TMyClass). Denn wenn Du dann deinen Parent lädst, kannst Du (im Setter deiner eigenen Parent-Property) schon eine Zeile darunter ohne weitere Probs die Items deiner ComboBox clearen:
Delphi-Quellcode:
TMyClass = class(TPanel)
AComboBox : TComboBox; constructor Create(AOwner : TComponent); override; private function getAParent : TWinControl; procedure setAParent(AParent: TWinControl); public property Parent read getAParent write setAParent; end; . . function TMyClass.getAParent : TWinControl; begin Result := inherited Parent; end; procedure TMyClass.setAParent(AParent : TWinControl); var lastParent : TWinControl; begin lastParent := inherited Parent; inherited Parent := AParent; if lastParent = nil then // nur beim aller ersten Parent-Laden AComboBox.Items.Clear; end; edit: minimale Schönheitskorrektur am Code |
Re: Parent Problem
Ich verstehe wohl das Problem nicht .... :roll:
Du hast eine Klasse TMyClass, die aus einem Panel mit einer ComboBox darauf besteht. Dann solltest du auch alle notwendigen Schritte der Erstellung im Konstruktor deiner Klasse vornehmen.
Delphi-Quellcode:
Dann kannst du anschließend also nach dem X:=TMyClass.Create(Form1); im Hauptteil des Programms tun und lassen was du möchtest.
constructor TMyClass.Create(Compo:TComponent);
begin inherited; parent:=TWinControl(Compo); combo:=TCombobox.Create(self); combo.Parent:=self; end; |
Re: Parent Problem
Der Owner des Objektes muss aber nicht zwingend auch sein Parent sein. Gut vorstellbar wäre z.B. auch die Situation bei der dieses Panel-ComboBox-Objekt selbst wieder auf einem anderen Panel Platz mehmen soll...
|
Re: Parent Problem
Zitat:
Zitat:
Ebensogut könnte man nach dem Erzeugen den Parent verbiegen:
Delphi-Quellcode:
Oder man könnte im Konstruktor den Parent fest einbrennen:
X:=TMyClass.Create(Form1);
X.Parent:=Panel2:
Delphi-Quellcode:
Als letztes könnte man auch einen Parent getrennt mit übergeben (so würde ich es wahrscheinlich machen):
constructor TMyClass.Create(Compo:TComponent);
begin inherited; parent:=Panel2; combo:=TCombobox.Create(self); combo.Parent:=self; end;
Delphi-Quellcode:
Wichtig für sein Problem ist nur, dass die Eigenschaft Parent direkt beim Erzeugen belegt wird. Mehr wollte ich nicht ausdrücken.
X:=TMyClass.Create(Form1, Panel2);
............... constructor TMyClass.Create(Compo:TComponent; WinC: TWinControl); begin inherited create(Compo); parent:=WinC; combo:=TCombobox.Create(self); combo.Parent:=self; end; |
Re: Parent Problem
Zitat:
Das Problem (das Du nach eigener Aussage nicht verstehst) für das Du hier eine Lösung anbietest ist nicht das, das der Thread-Steller hat. Wie vorhin schon gesagt wurde, wird ein Fenster in der Hierachie der Parents benötigt. Probier es einfach mal aus, erstell Dir dyn. eine Combobox (mit einem Parent), wobei weder die Combobox noch die Parent-Komponente der Combobox auf einer Form liegen. Das geht ohne Probleme, dann greif auf die Items Eigenschaft der Combobox schreibend zu. Genau darin liegt das Problem, das geht nicht (ohne Fehler). Das eigentliche Problem ist und bleibt also, woher weiß man, wann der Parent der Komponente sich ändert. Sagen wir mal die Combobox wird zuerst auf Panel1 gesetzt, Panel1 hat noch keinen Parent, das kann die Combobox ohne Probleme feststellen. Wie merkt sie aber jetzt, das Panel1 auf Panel2 gelegt wurde? Schließlich darf sie erst gefüllt werden, wenn sich über die Parent-Eigenschaft eine Form erreichen lässt (also auch rekursiv mittels if Combo.Parent.Parent is TForm). Und genau das muss man irgendwie wissen, wenn es eine allgemeine Komponente ist, die man z.B. vermarkten möchte. Würde ich eine solche Komponente kaufen, die hier feste Werte in der Combobox stehen hat (was weiß ich, vielleicht Monate), dann möchte ich nicht nach dem platzieren auf einer Form nochmal die Funktion "füllen" aufrufen, damit da auch was drinsteht. Ich würde dann gerne die Möglichkeit haben, die einfach auf einem beliebigen Parent zu platzieren und fertig (z.B. auch dyn.). Und für das Problem sehe ich hier keine Lösung (mag auch sein, dass es für den Threadsteller möglich ist, diese Methode aufzurufen, aber das eigenltiche Problem wäre ebend nicht gelöst). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz