![]() |
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 |
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. |
Re: Control mit Subcontrols designen
Hallo,
Zitat:
Gruß xaromz |
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 |
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; |
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 |
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:
Hab geradee kein Delphi zur Hand, kanns also nicht ausprobieren.
private
fSubComponent : tWinControl; published property subComponent : tWinControl read fSubComponent ; MfG Kolbaschedder |
Re: Control mit Subcontrols designen
Hallo,
Zitat:
Zitat:
Zitat:
Gruß xaromz |
Re: Control mit Subcontrols designen
Delphi-Quellcode:
funktioniert bei mir.
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. mit "fEdit.Name" musst du aufpassen, da der Name Eindeutig oder leer sein muss. MfG Kolbaschedder |
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 |
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. |
Re: Control mit Subcontrols designen
Hallo,
Zitat:
Zitat:
Gruß xaromz |
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. |
Re: Control mit Subcontrols designen
Zitat:
Gruß Hawkeye |
Re: Control mit Subcontrols designen
Delphi-Quellcode:
.. 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.
procedure CMDesignHitTest(var Message: TCMDesignHitTest); message CM_DESIGNHITTEST;
Habs aber nicht probiert, sondern nur den Code von TPageControl interpretiert. |
Re: Control mit Subcontrols designen
Hallo,
Zitat:
Gruß xaromz |
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] |
Re: Control mit Subcontrols designen
Hallo,
Zitat:
Ich werde die fertige Komponente demnächst auch veröffentlichen, es fehlt nur noch etwas Cleanup und ein Demo. Gruß xaromz |
Re: Control mit Subcontrols designen
Da dann bin ich schonmal sehr gespannt und erwarte das Demo mit Ungedult.
|
Re: Control mit Subcontrols designen
Hallo,
Zitat:
![]() ![]() Gruß xaromz |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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 by Thomas Breitkreuz