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 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

Sidorion 18. Okt 2006 16:02

Re: Control mit Subcontrols designen
 
Alternativ kannst Du auch ne Property ala ActivePage machen, die die aktive Seite zurückgibt, dann hangelt sich der Inspektor delber duch (+ auf ActivePage drücken, dann kommen die published-Eigenschaften der aktiven Seite). Weiterhin kannst Du ne Property ActivePageIndex machen, mit der man die aktive Seite wechselt. Dann kannst Du noch ins Kontextmenü die Einträge 'nächste Seite' und 'vorige Seite' aufnehmen.
Dann kannst Du nämlich wieder den Owner auf den Container setzen, was wesentlich sauberer wäre.

xaromz 18. Okt 2006 16:10

Re: Control mit Subcontrols designen
 
Hallo,
Zitat:

Zitat von Sidorion
Alternativ kannst Du auch ne Property ala ActivePage machen, die die aktive Seite zurückgibt, dann hangelt sich der Inspektor delber duch (+ auf ActivePage drücken, dann kommen die published-Eigenschaften der aktiven Seite). Weiterhin kannst Du ne Property ActivePageIndex machen, mit der man die aktive Seite wechselt. Dann kannst Du noch ins Kontextmenü die Einträge 'nächste Seite' und 'vorige Seite' aufnehmen.

Ich habe selbstverständlich schon die ganzen aufgezählten Eigenschaften. Über "ActivePage" konnte ich auch bisher schon auf die Eigenschaften der Subkomponente zugreifen. Ich muss jedoch direkt im Form auf diese zugreifen können, sonst kann ich z. B. keine Controls darauf platzieren. Wenn ich den Owner auf den selben Owner wie meine Hauptkomponente setze (muss nicht mal das Form sein), dann funktioniert alles genauso, wie ich will.
Zitat:

Zitat von Sidorion
Dann kannst Du nämlich wieder den Owner auf den Container setzen, was wesentlich sauberer wäre.

Sauber ist das so auch. Die Komponenten verhalten sich genau so, wie sie sollen.

Gruß
xaromz

Sidorion 19. Okt 2006 09:19

Re: Control mit Subcontrols designen
 
Das mit den Controls platzieren muss gehen.. da gibt es auch Funktionen, die das geklickte Control zurückliefern, aber ich weiss leider nicht aus dem Kopf wie die heissen.
Od das mit dem Form als Owner gleich sauber ist, kann man streiten, da ja niemand den Programmierer hindert, den Container wegzuerfen und dann hängen die Elemente in der Luft. Imho sollten die .Controls[xy] auch in den .Components[xy] enthalten sein.

Ich such nochmal bei Gelegenheit.

Hawkeye219 19. Okt 2006 09:29

Re: Control mit Subcontrols designen
 
Zitat:

Zitat von Sidorion
Od das mit dem Form als Owner gleich sauber ist, kann man streiten, da ja niemand den Programmierer hindert, den Container wegzuerfen und dann hängen die Elemente in der Luft. Imho sollten die .Controls[xy] auch in den .Components[xy] enthalten sein.

Probleme sollten eigentlich nicht auftreten, die IDE macht es ja auch so. Ein TWinControl zerstört bei seiner Freigabe autmatisch alle in ihm liegenden Controls.

Gruß Hawkeye

Sidorion 19. Okt 2006 10:54

Re: Control mit Subcontrols designen
 
Delphi-Quellcode:
procedure CMDesignHitTest(var Message: TCMDesignHitTest); message CM_DESIGNHITTEST;
.. ist Dein Freund. 1 als Result der Message bedeutet: ja, Treffer und die IDE sucht nicht weiter. D.h. wenn eine Deiner Pages gedrückt wurde lieferst Du null und alles sollte sich in Wohlgefallen auflösen.

Habs aber nicht probiert, sondern nur den Code von TPageControl interpretiert.

xaromz 19. Okt 2006 13:14

Re: Control mit Subcontrols designen
 
Hallo,
Zitat:

Zitat von Sidorion
Delphi-Quellcode:
procedure CMDesignHitTest(var Message: TCMDesignHitTest); message CM_DESIGNHITTEST;
.. ist Dein Freund. 1 als Result der Message bedeutet: ja, Treffer und die IDE sucht nicht weiter. D.h. wenn eine Deiner Pages gedrückt wurde lieferst Du null und alles sollte sich in Wohlgefallen auflösen.

...ist leider nicht mein Freund. Damit kann ich zwar fest stellen, ob an der betreffenden Stelle ein Control liegt, aber das hilft mir ja nichts.

Gruß
xaromz

Sidorion 20. Okt 2006 08:37

Re: Control mit Subcontrols designen
 
Versuch mal csAcceptsControls in den ControlStyle deiner 'Seiten' aufzunehmen. Muddu im Konstruktor machen.

[edit]und natürlich auch in den Container[/edit]

xaromz 20. Okt 2006 09:42

Re: Control mit Subcontrols designen
 
Hallo,
Zitat:

Zitat von Sidorion
Versuch mal csAcceptsControls in den ControlStyle deiner 'Seiten' aufzunehmen. Muddu im Konstruktor machen.

[edit]und natürlich auch in den Container[/edit]

nochmal danke für Deine Bemühungen, aber erstens hab' ich alles (und ich meine alles) schon versucht, und zweitens funktioniert's ja inzwischen.
Ich werde die fertige Komponente demnächst auch veröffentlichen, es fehlt nur noch etwas Cleanup und ein Demo.

Gruß
xaromz

Sidorion 20. Okt 2006 12:28

Re: Control mit Subcontrols designen
 
Da dann bin ich schonmal sehr gespannt und erwarte das Demo mit Ungedult.

xaromz 20. Okt 2006 13:55

Re: Control mit Subcontrols designen
 
Hallo,
Zitat:

Zitat von Sidorion
Da dann bin ich schonmal sehr gespannt und erwarte das Demo mit Ungedult.

Hier findest Du ein kleines Demo!
Siehe auch hier.

Gruß
xaromz


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