![]() |
Unterproperty in Objektinstpektor
Wie man eine Standartproperty im Objektinspektor anlegt, hab ich bereits herausgefunden. Doch wie mach ich das, wenn ich ich wie, z. b. bei einen Label Anchors als einen Properte und durch das + Zeichen alle unterpropertys anzeigen lassen möchte?
|
Re: Unterproperty in Objektinstpektor
z.B.:
Delphi-Quellcode:
oder:
type
TMyComponent = class(TWinControl) private FVisible, FStayOnTop, FPopUp, FFlashing : Boolean; protected procedure SetValue(index : Integer; Value : Boolean); public published property Visible : Boolean index 0 read FVisible write SetValue; property StayOnTop : Boolean index 1 read FStayOnTop write SetValue; property PopUp : Boolean index 2 read FPopUp write SetValue; property Flashing : Boolean index 3 read FFlashing write SetValue; end; implementation procedure TMyComponent.SetValue(index : Integer; Value : Boolean); begin case index of 0: FVisible := Value; 1: FStayOnTop := Value; 2: FPopUp := Value; 3: FFlashing := Value; end; end;
Delphi-Quellcode:
type
TShowMode = (smVisible,smStayOnTop,smPopUp,smFlashing); TShowModeSet = set of TShowMode; TMyComponent = class(TWinControl) private FShowMode : TShowModeSet; FVisible, FStayOnTop, FPopUp, FFlashing : Boolean; protected procedure SetValue(Value : TShowModeSet); public property Visible : Boolean read FVisible ; property StayOnTop : Boolean read FStayOnTop; property PopUp : Boolean read FPopUp ; property Flashing : Boolean read FFlashing ; published property ShowMode : TShowModeSet read FShowMode write SetValue; end; implementation procedure TMyComponent.SetValue(Value: TShowModeSet); begin FShowMode := Value; FStayOnTop := (smVisible in FShowMode); FFlash := (smStayOnTop in FShowMode); FPopUp := (smPopUp in FShowMode); FFlashing := (smFlashing in FShowMode); end; Gruß |
Re: Unterproperty in Objektinstpektor
Hallo,
wenn das Ganze jetzt auch noch eine Antwort auf die Frage wäre, wäre alles O.K. nimoee |
Re: Unterproperty in Objektinstpektor
Wieso? Er hat doch ein Beispiel mit dem nötigen Code geliefert... was brauchst du mehr?
|
Re: Unterproperty in Objektinstpektor
hallo,
die Antwort ist unvollständig und funktioniert nicht! nimoee |
Re: Unterproperty in Objektinstpektor
hallo,
hier wurde eine Arry Eigenschaft definiert und erklärt. Gefragt war aber nach untergeordneten Properties. nimoee |
Re: Unterproperty in Objektinstpektor
Sofern ein Property ein Objekt ist, welches wiederum published Propertys hat, werden diese automatisch im Objekt-Inspektor angezeigt.
|
Re: Unterproperty in Objektinstpektor
er hat aber gefragt , wie man Unterproperties erstellt. Mit dem + Zeichen davor. So geht das auf jeden Fall nicht!
nimoee |
Re: Unterproperty in Objektinstpektor
Es gibt 2 Möglichkeiten solche Properties zu erstellen! Entweder mit einem Enumerations-Typ (zB. Anchors) oder aber eine Instanz eines Nachfolgers von TPersistent als published property!
Im ersten Fall bekommst du eine Auflistung aller Elemente der Enumeration als Boolean-Einträge die festlegen ob das Element in der Enumeration vorkommt oder nicht, im 2ten Fall kannst du im TPersistent-Nachfolger ganz normal alle möglichen Properties einführen die im OI dann eben als "Untereigenschaft" auftauchen - das ganze kann beliebig geschachtelt werden... |
Re: Unterproperty in Objektinstpektor
hallo,
sei bitte so freundlich und erklär das am 1. Beispiel! nimoee |
Re: Unterproperty in Objektinstpektor
Du meinst am ersten Beispiel von Leuselator..? Ok, das hat nix mit "Unterproperties" zu tun.. :oops: :roll: Hätte mir den Code vielleicht doch _vor_ dem posten genauer anschaun solln..
|
Re: Unterproperty in Objektinstpektor
@Nimoe: Nicht so Hitzig mein Bester - im Teil 2 (nach oder:)
verwende ich ein Set und das mach durchaus ein Plus+ im Objectinspector und statt hier rumzutösen, gib ihm doch einfach ein besseres Beispiel... |
Re: Unterproperty in Objektinstpektor
hallo,
der Fehler liegt bei dir, nicht bei mir! Anstatt deinen Fehler zuzugeben hackst du jetzt auf mir rum! Kein schöner Zug.... nimoee |
Re: Unterproperty in Objektinstpektor
Also nochmal: ich habe kein Problem damit, wenn hier jemand sagt, ich hätte Mist gebaut!
Nur wäre es in meinen Augen sinnvoller, das ganze für den eigentlichen Fragesteller auch produktiv zu gestalten, indem man ihm ein besseres Beispiel gibt, als sich vornehm, wissend lächelnd hinzustellen, d'raufzuzeigen und zu sagen: "Dös is aber Falsch!" Das bringt dem Fragesteller sehr wenig. Du verschwendest nun schon den 6. Beitrag an diesen Thread, ohne ein einziges Produktives Wort für den Fragesteller zu schreiben. Das kann man noch nichtmal als Besserwisserei abtun. Daher meine Reaktion. Die wird in gleicher Situation auch immer wieder so kommen! Wenn Du unserem Freund also etwas hilfreiches zu sagen hast, dann tu es! Wenn Du mir mitteilen möchtest, das Dir mein Bemühen, anderen hier zu helfen, so gut ich es eben kann, nicht passt, dann sag auch dies! |
Re: Unterproperty in Objektinstpektor
hallo,
ich versuch jetzt 6 Beiträge lang eine Antwort zu bekommen, wie man das macht. Bist du schon mal auf den Gedanken gekommen, dass ich das auch nicht kann? Antwort: nur Polemik ( vielleicht liegt das auch an meinem Ton! ) Vielleicht wärs günstig, wenn du das nochmal step bei step erklärst! nimoee |
Re: Unterproperty in Objektinstpektor
@Nimoee: wenn du gleich gesagt hättest, dass du auch keine Ahnung hast wie das geht, anstatt den Eindruck zu vermitteln du wüsstest es, sagst es aber nicht wäre es vielleicht einfacher gewesen... :roll: ;)
Aber ok, dann geb ich mal Code-Beispiele für beide Möglichkeiten: 1) Enumerations-Typ
Delphi-Quellcode:
2) TPersisten-Nachfolger
TMyEnumeration = (meFirst, meSecond, meThird, meFourth);
TMyObject = class(TComponent) private FMyEnumeration: TMyEnumeration; published property MyEnumeration: TMyEnumeration read FMyEnumeration write FMyEnumeration; end;
Delphi-Quellcode:
TMyPersistentObject = class(TPersistent)
private FIntegerProperty: Integer; FStringProperty: String; FColorProperty: TColor; public procedure Assign(Source: TPersistent); override; published property StringProperty: String read FStringProperty write FStringProperty; property IntegerProperty: Integer read FIntegerProperty write FIntegerProperty; property ColorProperty: TColor read FColorProperty write FColorProperty; {...} end; TMyObject = class(TComponent) private FMyPersistentObject: TMyPersistentObject; procedure SetMyPersistentObject(const Value: TMyPersistentObject); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property MyPersistenObject: TMyPersistentObject read FMyPersistentObject write SetMyPersistentObject; end; { TMyPersistentObject } procedure TMyPersistentObject.Assign(Source: TPersistent); begin if (Source <> nil) and (Source is TMyPersistentObject) then with TMyPersistentObject(Source) do begin Self.FIntegerProperty := FIntegerProperty; Self.FStringProperty := FStringProperty; Self.FColorProperty := FColorProperty; end else inherited Assign(Source); end; { TMyObject } constructor TMyObject.Create(AOwner: TComponent); begin inherited; FMyPersistentObject := TMyPersistentObject.Create; end; destructor TMyObject.Destroy; begin FMyPersistentObject.Free; inherited; end; procedure TMyObject.SetMyPersistentObject(const Value: TMyPersistentObject); begin FMyPersistentObject.Assign(Value); end; |
Re: Unterproperty in Objektinstpektor
Lol - komische Art zu betteln :)
|
Re: Unterproperty in Objektinstpektor
Also zur Vollständigkeit auch noch ein einfacher Propertyeditor, der zeigt, wie man zur Entwurfszeit in der IDE die Auswahl von möglichen Werten für ein Property einschränkt (Code so nicht funktional - fehlt z.b.Create/Destroy von TMeineKomponente etc) aber sollte das Prinzip veranschaulichen:
Delphi-Quellcode:
voila - Nun könnte man eine Komponente TMeineKomponente bauen, die zur entwurfszeit auf ein Panel "geworfen", im Objektinspektor im Property "MeinKumpel" nur all die Controls zur auswahl anbietet, die:
type
TMeinPropertyTyp = TWinControl; TMeinPropertyEditor = class(TComponentProperty) public function GetAttributes: TPropertyAttributes; override; procedure GetValues(Proc: TGetStrProc); override; end; TMeineKomponente = Class(TWincontrol) private FKumpel : TMeinPropertyTyp; published property MeinKumpel :TMeinPropertyTyp read FKumpel write FKumpel; end; function LieferPropertyString(EinControl: TControl): String; // wird vom Editor aufgerufen procedure Register; implementation function LieferPropertyString(EinControl: TControl): String; // wird vom Editor aufgerufen begin if Assigned(EinControl) then Result := EinControl.Name else Result := ''; end; function TMeinPropertyEditor.GetAttributes: TPropertyAttributes; begin Result := [paMultiSelect, paValueList, paSortList, paRevertable]; end; procedure TMeinPropertyEditor.GetValues(Proc: TGetStrProc); var i,j: Integer; SchonDa : Boolean; UnserParent : TWinControl; WirSelbst : TComponent; DerKonkurent : TComponent; DerKandidat : TControl; begin WirSelbst := nil; // wir gehen alle Componenten des // Designers durch, bis wir uns selbst // gefunden haben... for i := 0 to Designer.Form.ComponentCount - 1 do begin WirSelbst := Designer.Form.Components[i]; if (WirSelbst is TMeineKomponente) and ((WirSelbst as TComponent)=GetComponent(0)) then break; // wir haben uns selbst gefunden end; // nun suchen wir nach möglichen Kumpels für uns, // aber nur wenn sie das selbe Parent haben (z.B. // WirSelbst liegen auf einem Panel und wollen nur // Komponenten als Kumpel zulassen, die auch auf diesem // Panel liegen... UnserParent := (WirSelbst as TMeineKomponente).Parent; for i := 0 to UnserParent.ControlCount-1 do begin DasControl := UnserParent.Controls[i]; if (DasControl is TWincontrol) and not ((DasControl is TMeinPropertyEditor) or // keine Inzucht! (DasControl is TButton)) // Buttons sollen es auch nicht seein! then begin // Nun checken wir, ob unser potentieller Kumpel schon einen anderen // Freund unserer Art hat - wenn ja, dann fliegt er aus der Auswahl... SchonDa := False; for j := 0 to Designer.Form.ComponentCount-1 do begin DerKonkurent := Designer.Form.Components[j]; if (DerKonkurent is TMeineKomponente) then begin if ((DerKonkurent as TMeineKomponente).MeinKumpel = (DerKandidat as TWincontrol)) then begin SchonDa := True; end; end; end; // wenn der Kandidat noch keinen Freund unserer Art hat, // dann kommt er in die Liste des Objectinspetors: if not SchonDa then Proc(LieferPropertyString(DasControl)); end; end; Proc(LieferPropertyString(nil)); // bin gerade nicht sicher, ob das nötig ist end; // nun noch den PropertyEditor bei der IDE anmelden: procedure Register; begin RegisterPropertyEditor(TypeInfo(TMeinPropertyTyp), TMeineKomponente, //sagt IDE, für welche Komponentenklasse //der Editor zu verwenden ist 'MeinKumpel', // sagt IDE wie das Property dort heisst TMeinPropertyTyp); end; 1. Kein TButton sind (willkürlich gewähltes Beispiel ohne Sinn) 2. Nicht vom Typ TMeineKomponente sind, und 3. noch keinen Freund vom Typ TMeineKomponente haben, bei dem sie als "MeinKumpel" aufgeführt sind. hoffe, das hilft ein wenig weiter, bei der Entwicklung von eigenen saugeilen Komponenten :coder: |
Re: Unterproperty in Objektinstpektor
Hallo,
das klappt, nur werden die Parameter auf der IDE Seite nicht übernommen. Woran liegt das? Weiss das jemand. Bei einfachen Properties funktioniert das Ganze problemlos. Auch zur Laufzeit alles O.K. nimoee |
Re: Unterproperty in Objektinstpektor
Keep slow Nimoee, dein Tonfall ist sehr provizierend und du bist der der Hilfe sucht.
|
Re: Unterproperty in Objektinstpektor
@me funktionert es wie es soll. Leider sortiert er die Property´s selbständig, was ziemlich d... ist, unten mit einen bild anzufangen.
|
Re: Unterproperty in Objektinstpektor
Dann streng mal Deine Phantasie etwas an. :P Wie wärs, wenn Du die property ganz einfach Bild nennst und nicht picture :?:
P.S.: Bei eigenen Komponenten fällt mir noch das hier ein: ![]() Aber Vorsicht, ist sehr lang und noch nicht fertig! 8) |
Re: Unterproperty in Objektinstpektor
Moin Taladan,
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:05 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