Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Parent Problem (https://www.delphipraxis.net/84462-parent-problem.html)

backdraft 17. Jan 2007 10:25


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

Der_Unwissende 17. Jan 2007 10:34

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

backdraft 17. Jan 2007 10:55

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.

p0w3r5tr34m3r 17. Jan 2007 11:00

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;

backdraft 17. Jan 2007 11:06

Re: Parent Problem
 
Zitat:

Zitat von p0w3r5tr34m3r
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;

er geht ja beim "x := TMyClass.Create" schon kaputt wenn kein Parent da ist.

TStringlist 17. Jan 2007 11:42

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

IngoD7 17. Jan 2007 12:20

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:
constructor TMyClass.Create(Compo:TComponent);
  begin
  inherited;
  parent:=TWinControl(Compo);
  combo:=TCombobox.Create(self);
  combo.Parent:=self;
  end;
Dann kannst du anschließend also nach dem X:=TMyClass.Create(Form1); im Hauptteil des Programms tun und lassen was du möchtest.

TStringlist 17. Jan 2007 12:31

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...

IngoD7 17. Jan 2007 12:55

Re: Parent Problem
 
Zitat:

Zitat von TStringlist
Der Owner des Objektes muss aber nicht zwingend auch sein Parent sein.

Richtig. Das hat aber mit seinem Problem erstmal nichts zu tun.

Zitat:

Zitat von TStringlist
Gut vorstellbar wäre z.B. auch die Situation bei der dieses Panel-ComboBox-Objekt selbst wieder auf einem anderen Panel Platz mehmen soll...

Ja, aber selbst wenn. Auch das berührt sein geschildertes Problem nicht. Soll das Panel-Combo-Objekt auf einem Panel2 sitzen, so könnte er das mit X:=TMyClass.Create(Panel2); direkt angeben. Panel2 wäre dann Owner und Parent, was ja durchaus machbar wäre. Ich würde das so zwar auch nicht tun, aber möglich ist es.

Ebensogut könnte man nach dem Erzeugen den Parent verbiegen:
Delphi-Quellcode:
X:=TMyClass.Create(Form1);
X.Parent:=Panel2:
Oder man könnte im Konstruktor den Parent fest einbrennen:
Delphi-Quellcode:
constructor TMyClass.Create(Compo:TComponent);
  begin
  inherited;
  parent:=Panel2;
  combo:=TCombobox.Create(self);
  combo.Parent:=self;
  end;
Als letztes könnte man auch einen Parent getrennt mit übergeben (so würde ich es wahrscheinlich machen):
Delphi-Quellcode:
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;
Wichtig für sein Problem ist nur, dass die Eigenschaft Parent direkt beim Erzeugen belegt wird. Mehr wollte ich nicht ausdrücken.

Der_Unwissende 17. Jan 2007 13:05

Re: Parent Problem
 
Zitat:

Zitat von IngoD7
Wichtig für sein Problem ist nur, dass die Eigenschaft Parent direkt beim Erzeugen belegt wird. Mehr wollte ich nicht ausdrücken.

Das ist aber so falsch!
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 22:07 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz