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/)
-   -   Komponente mit ChildControls entwickeln (https://www.delphipraxis.net/155395-komponente-mit-childcontrols-entwickeln.html)

torud 21. Okt 2010 13:37

Komponente mit ChildControls entwickeln
 
Hallo Wissende,

ich möchte eine eigene DataBar entwickeln. Das soll wie folgt aussehen.

Als Mutter soll ein TPanel zum Einsatz kommen. Darauf soll eine Combobox und 2 Buttons platziert werden. Also eigentlich eine Toolbar. Die Buttons sollen später zum Navigieren in der Combobox dienen, falls nötig. Die Combobox soll gespeicherte Einträge aufnehmen und OnItemSelect die passenden Inhalte des Eintrages aus einer IniDatei laden. So viel nur als Background für Euch zum wissen. Das Ganze habe ich schon sehr oft so gemacht, nur nervt es mich, dass ich das Ganz immer über die Objektablege in jeden Dialog einpflegen muss. Aus diesem Grund möchte ich nun eine Komponente daraus machen.

Zur Zeit scheitere ich leider daran, dass mir unklar ist, wie ich die Combobox auf dem Panel platziere. Ich erhalte leider immer eine Fehlermeldung von Delphi7.

Hier mal mein Code, der sicher noch nicht optimal ist. Ich würde mich freuen, wenn mir der Ein oder Andere ein paar Tipps geben könnte. Die verwendeten Komponenten sind zum Teil von TMS, aber ich könnte es Testweise auch auf Standard-Controls von Delphi umschreiben.

Delphi-Quellcode:
unit myDataBar;

interface

uses
  SysUtils, Classes, Controls, AdvToolBar, StdCtrls;

type
  TmyDataBar = class(TAdvDockPanel)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    FToolbar : TAdvToolbar;
    FDataCombo : TCombobox;
    Fbtn_next : TAdvToolBarButton;
    Fbtn_previous : TAdvToolBarButton;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published-Deklarationen }
  end;

procedure Register;

implementation
{$R mydatabar.dcr}

procedure Register;
begin
  RegisterComponents('Beispiel', [TmyDataBar]);
end;

constructor TmyDataBar.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  Self.Height       := 43;
  Self.Align        := daTop;

  FToolbar          := TAdvToolBar.Create(AOwner);
  FToolbar.Parent   := Self;
  FToolbar.FullSize := True;

  FDataCombo := TComboBox.Create(FToolbar);
  FDataCombo.Parent := FToolbar;
  FDataCombo.Width  := 200;

  Fbtn_next         := TAdvToolBarButton.Create(FToolbar);
  Fbtn_next.Parent  := FToolbar;
  Fbtn_next.Caption := 'Next';

  Fbtn_previous         := TAdvToolBarButton.Create(FToolbar);
  Fbtn_previous.Parent  := FToolbar;
  Fbtn_previous.Caption := 'Previous';
end;

destructor TmyDataBar.Destroy;
begin
  inherited;
end;

end.

DeddyH 21. Okt 2010 14:00

AW: Komponente mit ChildControls entwickeln
 
Zitat:

Zitat von torud (Beitrag 1056932)
Ich erhalte leider immer eine Fehlermeldung von Delphi7.

Und welche? In welcher Zeile? Ansonsten gibt es irgendwo hier in der DP einen Link zu einem Video, das sich mit Composite Controls beschäftigt. Du solltest einmal danach suchen, das war IMO sehr interessant.

[edit] Ich hab den Link wiedergefunden. [/edit]

torud 21. Okt 2010 16:06

AW: Komponente mit ChildControls entwickeln
 
Cooler Tipp!

FlashMovie läuft schon. Scheint genau das zu sein, was ich brauche!!!

Für alle Suchfaulen hier nochmal der Link zu einem Zip-File, indem sich das FlashDesktopMovie befindet:
http://video.codegear.com/CodeRageII...clControls.zip

Bummi 21. Okt 2010 16:23

AW: Komponente mit ChildControls entwickeln
 
Delphi-Quellcode:
constructor TmyDataBar.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Parent := TwinControl(Owner);
  Self.Height := 43;
.....

torud 21. Okt 2010 19:12

AW: Komponente mit ChildControls entwickeln
 
Hallo,

das geänderte Creating half schonmal!

Nun erhalte ich aber folgende Fehlermeldung, wenn ich versuche die einem Formular hinzugefügte Komponente zu kompilieren:

Im Projekt Project2.exe ist eine Exception der Klasse EComponentError aufgetreten. Meldung: 'Komponente mit der Bezeichnung DataToolbar existiert bereits'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.

Folgenden Code benutze ich aktuell:

Delphi-Quellcode:
unit myDataBar;

interface

uses
  SysUtils, Classes, Controls, AdvToolBar, StdCtrls, Dialogs;

type
  TmyDataBar = class(TAdvDockPanel)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    FToolbar : TAdvToolbar;
    FDataCombo : TCombobox;
    Fbtn_next : TAdvToolBarButton;
    Fbtn_previous : TAdvToolBarButton;
    Ftb_sep : TAdvToolBarSeparator;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure GoNext(Sender: TObject);
  published
    { Published-Deklarationen }
  end;

procedure Register;

implementation
{$R mydatabar.dcr}

procedure Register;
begin
  RegisterComponents('THRU-Soft', [TmyDataBar]);
end;

constructor TmyDataBar.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Parent := TwinControl(Owner);
  Self.Height := 43;

  Self.Align        := daTop;

  FToolbar          := TAdvToolBar.Create(AOwner);
  FToolbar.Name     := 'DataToolbar';
  FToolbar.Parent   := Self;
  FToolbar.FullSize := True;

  FDataCombo := TComboBox.Create(FToolbar);
  FDataCombo.Name   := 'FDataCombo';
  FDataCombo.Text   := 'Dummy';
  FDataCombo.Parent := TWinControl(FToolbar);
  FDataCombo.Width  := 200;

  Ftb_sep              := TAdvToolBarSeparator.Create(FToolbar);
  Ftb_sep.Parent       := TWinControl(FToolbar);
  Ftb_sep.Width        := 20;

  Fbtn_next            := TAdvToolBarButton.Create(FToolbar);
  Fbtn_next.Name       := 'btn_Next';
  Fbtn_next.Parent     := TWinControl(FToolbar);
  Fbtn_next.Caption    := 'Next';
  Fbtn_next.ShowCaption := True;

  Fbtn_previous         := TAdvToolBarButton.Create(FToolbar);
  Fbtn_previous.Name    := 'btn_prev';
  Fbtn_previous.Parent  := TWinControl(FToolbar);
  Fbtn_previous.Caption := 'Previous';
  Fbtn_previous.ShowCaption := True;
  Fbtn_previous.OnClick := GoNext;
end;

procedure TmyDataBar.GoNext(Sender: TObject);
begin
  ShowMessage('Next');
end;

destructor TmyDataBar.Destroy;
begin
  inherited;
end;

end.

stahli 21. Okt 2010 19:25

AW: Komponente mit ChildControls entwickeln
 
Versuche mal ...
Delphi-Quellcode:
FToolbar.Name := Name + '_DataToolbar';

torud 21. Okt 2010 19:58

AW: Komponente mit ChildControls entwickeln
 
hm, Name scheint leer zu sein.

Siehe nun etwas andere Fehlermeldung:

Im Projekt Project1.exe ist eine Exception der Klasse EComponentError aufgetreten. Meldung: 'Komponente mit der Bezeichnung _DataToolbar existiert bereits'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.

stahli 21. Okt 2010 20:34

AW: Komponente mit ChildControls entwickeln
 
Wenn Du einer Komponente einen Namen gibst, muss der in der Anwendung eindeutig sein.
Wenn Du Komponenten zur Laufzeit erzeugst, wird dieser jedoch erst mal kein Name zugewiesen.

Ich habe das mal so gelöst:

Delphi-Quellcode:
constructor TXyz.Create(AOwner: TComponent);
begin
  inherited;
  Name := FindUniqueName(ClassName);
end,
Delphi-Quellcode:
unit ssClasses;

interface

function FindUniqueName(BaseName: String; OwnerName: String = ''): String;

implementation

uses
  SysUtils, Forms, Windows;

var
  UN: LongWord = 0;

function FindUniqueName(BaseName: String; OwnerName: String = ''): String;
var
  N: String;
begin
  if OwnerName <> '' then
    BaseName := OwnerName + '_' + BaseName;
  BaseName := BaseName + '_';
  Inc(UN);
  N := BaseName + IntToStr(UN);
  Result := N;
  //OutputDebugString(PChar(N));
end;

end.

himitsu 21. Okt 2010 21:03

AW: Komponente mit ChildControls entwickeln
 
Jede Komponente, welche als "Owner" fungiert, kann bei ihren Childs keine mehrfachen Namen verwalten.
>>> Namen müssen eindeutig sein.

Einzige Ausnahme ist "kein Name", ala
Delphi-Quellcode:
''
.

Dynamisch erstellte Komponenten müssen/können eh ohne Name genutzt werden, da man sie auch über ihre Instanz referenzieren/verwalten kann.
(ist auch schneller/optimaler, als FindComponent)

Es ist also nicht nötig an seine SubKomponenten Namen zu vergeben.

stahli 21. Okt 2010 21:07

AW: Komponente mit ChildControls entwickeln
 
Richtig, eine Namensvergabe kann aber beim Debuging hilfreich sein.

Bummi 21. Okt 2010 21:45

AW: Komponente mit ChildControls entwickeln
 
ich kann hier nichts testen aber wenn Du Namen verwenden willst
warum erzeugst Du hier auf AOwner und nicht auf self?
FToolbar := TAdvToolBar.Create(AOwner);
FToolbar.Name := 'DataToolbar';
Wenn Du wg. Eigenheiten des TAdvToolBar tatsächlich auf Owner "Createn" muß knallt es bei vergebenem Namen auf dem Owner.

stahli 21. Okt 2010 21:49

AW: Komponente mit ChildControls entwickeln
 
Bei mehreren Instanzen würde dann mehrfach der gleiche Name vergeben. Das ist unzulässig.

Bummi 21. Okt 2010 22:11

AW: Komponente mit ChildControls entwickeln
 
@stahli
jepp, allerdings nur wenn er wie in seinem bisherigen Code Owner verwendet...

Die Namen müssen nur innerhalb des Owners eindeutig sein, bei Self wäre es jedes mal ein neuer Owner.

torud 22. Okt 2010 07:15

AW: Komponente mit ChildControls entwickeln
 
Das mit dem Self tat Wunder!
Die Namensvergabe habe ich nun auch weggelassen.
Aktuell läufts erstmal!

torud 27. Okt 2010 11:33

AW: Komponente mit ChildControls entwickeln
 
Hallo Wissende,

nun habe ich doch noch ein Problem bzw. eine Frage. Wenn ich die erstellte Komponente nun einem Projekt hinzufügen möchte, würde ich das gern NICHT ausschließlich auf einem Formular tun, sondern auch mal auf einem Panel. In dem Fall soll die Komponenten nur die unterstützten Child-Controls des Panels sichern. Sobald ich aber versuche die DataBar auf einem Panel zu platzieren, wird die Komponente automatisch auf dem Formular platziert. Ich kann das dann nur Faken, indem ich die Komponente vom Formular ausschneide und dann auf dem Panel einfüge.

Liegt das vielleicht an diesem Code hier?

Delphi-Quellcode:
constructor TmyDataBar.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  [b]Parent := TWinControl(Owner);[/b]
  Self.Align        := daTop;
  self.Height       := 25;
Also an TWinControl? Was müsste ich machen, damit ich die Komponente auch auf anderen Controls platzieren kann?

Und als weitere Frage. Warum werden die Buttons der Toolbar beim erstmaligen erzeugen korrekt erstellt und wenn ich später das Projekt mit der Komponente lade, sind diese immer "durcheinander"?

Ich stelle auch gern nochmal den gesamte KomponentenCode hier ein, wollte aber erstmal keinen mit dem Lesen überfordern. Auch kann ich gern den ein oder anderen Screenshot als Beleg anheften, für diejenigen, die die Komponente nicht nach-kompilieren können, weil die ADV-Komponenten nicht vorhanden sind.


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