AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Parent Problem

Ein Thema von backdraft · begonnen am 17. Jan 2007 · letzter Beitrag vom 17. Jan 2007
Antwort Antwort
Seite 1 von 3  1 23      
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
335 Beiträge
 
Delphi 11 Alexandria
 
#1

Parent Problem

  Alt 17. Jan 2007, 11:25
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
Oliver
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Parent Problem

  Alt 17. Jan 2007, 11:34
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
  Mit Zitat antworten Zitat
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
335 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Parent Problem

  Alt 17. Jan 2007, 11:55
Soweit hatte ich mir das schon gedacht.
Die Frage ist, ob es eine Funktion gibt die ich überladen kann, wenn das Parent zugewiesen wird.
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von p0w3r5tr34m3r
p0w3r5tr34m3r

Registriert seit: 18. Aug 2003
Ort: Monheim am Rhein
153 Beiträge
 
RAD-Studio 2009 Pro
 
#4

Re: Parent Problem

  Alt 17. Jan 2007, 12:00
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;
Florian Cülter
ich bin ein notorischer alles-klein-schreiber!

der 100. Beitrag nach 3 Jahren 25 Wochen und einem Tag
  Mit Zitat antworten Zitat
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
335 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Parent Problem

  Alt 17. Jan 2007, 12:06
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.
Oliver
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Parent Problem

  Alt 17. Jan 2007, 12:42
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
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Parent Problem

  Alt 17. Jan 2007, 13:20
Ich verstehe wohl das Problem nicht ....

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.
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Parent Problem

  Alt 17. Jan 2007, 13:31
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...
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Parent Problem

  Alt 17. Jan 2007, 13:55
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 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.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#10

Re: Parent Problem

  Alt 17. Jan 2007, 14:05
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).
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 Uhr.
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