Delphi-PRAXiS

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 Eigene Komponenten innerhalb einer anderen anzeigen lassen (https://www.delphipraxis.net/123000-eigene-komponenten-innerhalb-einer-anderen-anzeigen-lassen.html)

CWBudde 25. Okt 2008 17:32


Eigene Komponenten innerhalb einer anderen anzeigen lassen
 
Hallo,

ich möchte gerne eine seblstgeschriebene Komponenten in dr Strukturübersicht als untergeordnete Komponente anzeigen lassen. Ich gebe zu das ist jetzt etwas blöd erklärt, aber wenn man sich mal TPageControl anschaut (siehe Bild), dann wisst ihr sicher was gemeint ist.

http://www.savioursofsoul.de/Christi...Components.png

Die TabSheet Komponente ist hier die untergeordnete Komponente von TPageControl. Genau das möchte ich auch. Bei GLScene sieht man so etwas auch, aber die Komponenten sind hier der Form untergeordnet. Schlüssiger wäre es sicherlich diese der GLScene-Komponente unterzuordnen.
Oder ein einfaches Menu. Dort sind dir TMenuItems dem jeweils übergeordneten TMenuItem untergeordnet.

Ich habe bereits versucht den Quelltext zu verstehen, bzw. die Stelle zu finden, die relevant ist. Es scheint aber so, als hätten die 3 gennanten Beispiele nicht sonderlich viel gemeinsam, bzw. nichts, was auf diese Funktion hindeuten würde.

Soweit ich weiß ist das auch kein "Property Editor", der das Verhalten erzeugt.

Hat jemand da eine Idee, bzw. weiß wie man das auch selber hinbekommt?

Gruß,

Christian

PS: Ich arbeite mit Turbo Delphi für Win32

SirThornberry 25. Okt 2008 19:06

Re: Eigene Komponenten innerhalb einer anderen anzeigen lass
 
Könntest du bitte das Bild dem Beitrag anhängen damit der Beitrag seine Bedeutung nicht verliert wenn du das Bild irgendwann wieder von dem externen Webspace löschst. :-)

Das was du da bei TTabSheet siehst ist eigentlich recht einfach. Und zwar wird einfach nur ein TTabSheet erzeugt welches als Parent das TPageControl zugwiesen bekommt. So als würde man ein Panel auf das Form packen und darauf andere Komponenten wie Buttons. Das wird dann genau so dargestellt. Zu beachten ist eigentlich nur das der Owner und der Parent stimmen.

Jakob Ullmann 25. Okt 2008 19:10

Re: Eigene Komponenten innerhalb einer anderen anzeigen lass
 
Das Thema interessiert mich auch brennend.

Wie sieht das ganze von der Seite des PageControls aus? So, dass das TabSheet richtig positioniert wird etc.? Und wie würde das für eigene Komponenten gehen?

CWBudde 30. Okt 2008 16:28

Re: Eigene Komponenten innerhalb einer anderen anzeigen lass
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo nochmal,

ich glaube ich bin hier falsch verstanden worden. Ich will nicht wissen, warum das Tabsheet in dem Pagecontrol erscheint, sondern warum es in der Strukturübersicht erscheint. Das bekomme ich zwar selbst mit der schönsten "Parent-Zuweisung" nicht hin.

Hier nochmal ein Codeschnipsel, das den Kern verdeutlicht:

Delphi-Quellcode:
unit TestUnit;

interface

uses
  Windows, Mssages, SysUtils, Classes;

type
  TTestSubComponent = class(TComponent)
  private
    FSomeProperty: string;
    procedure SetSomeProperty(const Value: string);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property SomeProperty: string read FSomeProperty write SetSomeProperty;
  end;

  TTestComponent = class(TComponent)
  private
    FTestSubComponent : TTestSubComponent;
    FAnotherProperty : string;
    procedure SetAnotherProperty(const Value: string);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property AnotherProperty: string read FAnotherProperty write SetAnotherProperty;
  end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents('Test', [TTestSubComponent, TTestComponent]);
end;

{ TTestSubComponent }

constructor TTestSubComponent.Create(AOwner: TComponent);
begin
// SetSubComponent(True);
 inherited;
end;

procedure TTestSubComponent.SetSomeProperty(const Value: string);
begin
  FSomeProperty := Value;
end;

{ TTestComponent }

constructor TTestComponent.Create(AOwner: TComponent);
begin
 inherited;
 FTestSubComponent := TTestSubComponent.Create(Self);
// InsertComponent(FTestSubComponent);
end;

destructor TTestComponent.Destroy;
begin
 FreeAndNil(FTestSubComponent);
 inherited;
end;

procedure TTestComponent.SetAnotherProperty(const Value: string);
begin
 FAnotherProperty := Value;
end;

end.
Wenn ich nun ein Objekt des Typs TTestComponent in einer kleinen Testanwendung reinclicke, dann wir diese als kleines ja als kleines Icon in der Form angezeigt (ist ja eine nicht grafische Komponente). In der Strukturübersich erscheint die auch.

Soweit so gut!

Gleichzeitig wird im Konstruktor aber auch noch ein Objekt des Typs TTestSubComponent angelegt. Das möchte ich nun auch bitte schön in der Strukturübersicht angezeigt bekommen, aber wie?

Ich hab' mir da schon echt die Zähne dran ausgebissen, aber vielleicht fällt einem von euch ja hier etwas ein.

Gruß,

Christian

PS: anbei übrigens nochmal das der Screenshot von oben. Falls noch Zweifel bestehen, wo die TTestSubComponent auftauchen soll, es ist an der Stelle, die ich mit gelb im Screenshot markiert habe.

SirThornberry 30. Okt 2008 17:45

Re: Eigene Komponenten innerhalb einer anderen anzeigen lass
 
Ich habe dich verstanden. Das Zauberwort lautet Owner :-D Beim instanzieren einer Komponente (.Create) übergibst du Create einen Owner. Und auf diesen kommt es an. Wenn du zum Beispiel ein Panel mit Buttons hast und willst das diese mit auftauchen dann muss es so aussehen:
Delphi-Quellcode:
constructor TYourSuperPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  fButton := TButton.Create(AOwner);
  fButton.Parent := Self;
end;
Somit sollte der Button dann auch in der Übersicht auftauchen.

CWBudde 30. Okt 2008 23:54

Re: Eigene Komponenten innerhalb einer anderen anzeigen lass
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke, damit bin ich der Sache nun schonmal einen Schritt weiter.

Jetzt taucht die Komponente in der Tat in der Übersicht auf, ist allerdings zum einen dem Formular untergeordnet und zum anderen Taucht die als echte Komponente auch auf dem Form mit auf.

Ich hätte das aber gerne noch so, dass die als unsichtbare Komponente (so weiß-gepixelt) wie im ersten Bild als Unterkomponente der anderen auftaucht. Ich hab's dazu schon mit SetSubComponent(True) ausprobiert, aber das ist es leider nicht.

Noch irgendwelche Ideen?

Gruß,

Christian


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:11 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