Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Control mit Subcontrols designen (https://www.delphipraxis.net/79172-control-mit-subcontrols-designen.html)

xaromz 17. Okt 2006 15:22


Control mit Subcontrols designen
 
Hallo,

ich möchte sowas ähnliches wie ein TPageControl schreiben. Jetzt habe ich das Problem, dass Controls, die ich innerhalb der Komponente erstelle (meine "Seiten") nicht im Formdesigner klickbar sind. Wie bekomme ich es hin, dass ich diese Controls anklicken und verändern kann (so wie die TabSheets beim PageControl)?

Gruß
xaromz

Sidorion 17. Okt 2006 16:23

Re: Control mit Subcontrols designen
 
Da musst Du mal in der OH suchen. Zur Designtime gibt es zwei Events, die Du überschreiben musst(kannst). der eine liefert einige Kontextmenüeinträge (ähnlich 'neue Seite' bei PageControl) und im anderen gibst Du ein Component zurück, das an der geklickten Stelle liegt. Wie die genau heißen, weiß ich jetzt auch nicht, aber wenn du bissi wühlst, findest Dus.
p.s.: schau mal unter thema Komponentenentwicklung nach.

xaromz 17. Okt 2006 17:04

Re: Control mit Subcontrols designen
 
Hallo,
Zitat:

Zitat von Sidorion
Da musst Du mal in der OH suchen. Zur Designtime gibt es zwei Events, die Du überschreiben musst(kannst). der eine liefert einige Kontextmenüeinträge (ähnlich 'neue Seite' bei PageControl) und im anderen gibst Du ein Component zurück, das an der geklickten Stelle liegt. Wie die genau heißen, weiß ich jetzt auch nicht, aber wenn du bissi wühlst, findest Dus.
p.s.: schau mal unter thema Komponentenentwicklung nach.

danke für die Hinweise. Interessanterweise erscheinen die TabSheets aber auch in der Strukturansicht, genau so, als wären sie manuell auf das PageControl gezogen worden. Deshalb befürchte ich, es wird nicht reichen, wenn ich nur die Komponente unter dem Cursor zurückliefere.

Gruß
xaromz

xaromz 18. Okt 2006 09:26

Re: Control mit Subcontrols designen
 
Hallo,

ich habe mich jetzt in der OH umgesehen und auch stundenlang auf die VCL-Sourcen gestiert. Leider ist mir dabei keine Erleuchtung zuteil geworden.
Wenn also jemand weiß, wie ich per Programm Komponenten erzeugen kann, die sich im Designer so verhalten, wie vom Benutzer erstellte, dann soll er sich gefälligst melden :wink: .

Gruß
xaromz

Sidorion 18. Okt 2006 10:03

Re: Control mit Subcontrols designen
 
Also für zusätzliche Menüeinträge ala 'Neue Seite' beim PageControl hab ich was gefunden: GetVerbCount, GetVerb und ExecuteVerb. Die erste liefert die Anzahl der customer-Kontextmenüeinträge, die zweite die Einträge selber (über Index). Diese beiden Funktionen werden in Deiner Komponente greufen, wenn während der Designzeit jemand auf die Komponente rechtsklickt, die dritte, wenn einer der Einträge ausgewählt wird.
Delphi-Quellcode:
type
  THelloGoodByeComponentEditor = class(TComponentEditor)
    procedure ExecuteVerb(Index: Integer); override;
    function GetVerb(Index: Integer): string; override;
    function GetVerbCount: Integer; override;
  end;

procedure THelloGoodByeComponentEditor.ExecuteVerb(Index: Integer);
begin
  case Index of
    0 : ShowMessage('Hello');
    1 : ShowMessage('Goodbye');

  end;
end;

function THelloGoodByeComponentEditor.GetVerb(Index: Integer): string;
begin
  case Index of
    0: Result := 'Arrive';
    1 : Result := 'Depart';
  end;
end;

function THelloGoodByeComponentEditor.GetVerbCount: Integer;
begin
  Result := 2;
end;

xaromz 18. Okt 2006 10:31

Re: Control mit Subcontrols designen
 
Hallo,

Danke :thumb: . Das hilft mir schon mal weiter, um meine Seiten zu erstellen (wobei das auch schon bisher über die Header funktioniert, die sind eine Collection). Leider hilft mir das aber bei meinem eigentlichen Problem nicht weiter.
Weiß eigentlich jemand, wo der Quelltext des ComponentEditor für das PageControl steckt? Den hab' ich in den VCL-Quellen nicht gefunden.

Gruß
xaromz

kolbaschedder 18. Okt 2006 10:36

Re: Control mit Subcontrols designen
 
Ich bin mi nicht ganz sicher, allerdings benutzt der Object-Inspector die Unit TypInfo.pas und hangelt sich Anhand der TObject-eigenschaft Components[] durch die Compnenten.
Daher solltest du bei deinen Subcomponenten das Create(Aowner : TComponent) mit der erzeugenden Compnente aufrufen also
create(self)
, keinesfalls mit Create(application), oder create(nil).
Dann noch den Parent setzen, sollte funktionieren.
Die Frage ist, ob du die Subkomponenten nicht auch als published definieren musst. ungefähr so :
Delphi-Quellcode:
private
  fSubComponent : tWinControl;
published
  property subComponent : tWinControl read fSubComponent ;
Hab geradee kein Delphi zur Hand, kanns also nicht ausprobieren.

MfG

Kolbaschedder

xaromz 18. Okt 2006 11:01

Re: Control mit Subcontrols designen
 
Hallo,
Zitat:

Zitat von kolbaschedder
Ich bin mi nicht ganz sicher, allerdings benutzt der Object-Inspector die Unit TypInfo.pas und hangelt sich Anhand der TObject-eigenschaft Components[] durch die Compnenten.
Daher solltest du bei deinen Subcomponenten das Create(Aowner : TComponent) mit der erzeugenden Compnente aufrufen also
create(self)
, keinesfalls mit Create(application), oder create(nil).

Das mache ich natürlich.
Zitat:

Zitat von kolbaschedder
Dann noch den Parent setzen, sollte funktionieren.

Leider nein.
Zitat:

Zitat von kolbaschedder
Die Frage ist, ob du die Subkomponenten nicht auch als published definieren musst. ungefähr so :

Ich habe ja nicht nur eine Subkomponente, sondern beliebig viele. Und leider hilft es auch nichts, diese als published zu deklarieren.

Gruß
xaromz

kolbaschedder 18. Okt 2006 11:10

Re: Control mit Subcontrols designen
 
Delphi-Quellcode:
unit Containerdemo;

interface
 uses sysUtils, stdCtrls, extCtrls, classes ;

type tContainerDemo = class(TPanel)
  private
    fEdit : tEdit;
  public
    constructor Create(Aowner : Tcomponent);override;
    destructor Destroy;override;
  published
    property edit : tEdit read fEdit write fEdit;
  end;


procedure Register;
implementation
procedure Register;
begin
  registerComponents('demo', [tContainerDemo]);
end;

constructor tContainerDemo.Create(Aowner : Tcomponent);
begin
  inherited;
  fEdit := TEdit.Create(Aowner);
  fEdit.Parent := self;
  fEdit.Name := 'CD_Edit';
  fEdit.Top := 0;
  fEdit.width := self.Width ;
end;

destructor tContainerDemo.Destroy;
begin
  fEdit.Free;
  inherited;
end;

end.
funktioniert bei mir.
mit "fEdit.Name" musst du aufpassen, da der Name Eindeutig oder leer sein muss.

MfG

Kolbaschedder

xaromz 18. Okt 2006 15:28

Re: Control mit Subcontrols designen
 
Hallo,

ich habe das Problem gelöst. Man muss die Subkomponenten mit dem Form als Owner erzeugen, dann sind sie im Designer verfügbar.

Gruß
xaromz


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:00 Uhr.
Seite 1 von 2  1 2      

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