![]() |
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. |
AW: Komponente mit ChildControls entwickeln
Zitat:
[edit] Ich hab den ![]() |
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: ![]() |
AW: Komponente mit ChildControls entwickeln
Delphi-Quellcode:
constructor TmyDataBar.Create(AOwner: TComponent);
begin inherited Create(AOwner); Parent := TwinControl(Owner); Self.Height := 43; ..... |
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. |
AW: Komponente mit ChildControls entwickeln
Versuche mal ...
Delphi-Quellcode:
FToolbar.Name := Name + '_DataToolbar';
|
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. |
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. |
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. |
AW: Komponente mit ChildControls entwickeln
Richtig, eine Namensvergabe kann aber beim Debuging hilfreich sein.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:36 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-2025 by Thomas Breitkreuz