![]() |
Besitzt eine Komponente eine bestimmte Eigenschaft???
Hallo Leute,
wie stelle ich fest, ob eine Komponente eine bestimmte Eigenschaft besitzt? Ich schreibe ein Object, dessen Instanz erzeugt wird und ein Parameter davon TComponent ist. Es dreht sich alles um die Property "PopUpMenu" ich will feststellen, ob mein übergebenes TComponent überhaupt diese Eigenschaft besitzt? Sprich an mein Objekt dürfen nur TComponents übergeben werden, die diese Eigenschaft ausweisen! :gruebel: danke für die hilfe dot |
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
Delphi-Quellcode:
uses TypInfo;
IsPublishedProp(...) |
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
danke leider kann ich aber irgendwie nicht beim TComponent die Eigenschaft ansprechen, muss ich in der Hierarchie höher gehen?
Delphi-Quellcode:
im fettmarkierten klappt es nicht, keine Ahnung weshalb
constructor TMyObject.Create(AOwner: TComponent; aImage : TImage; aImgList : TImagelist; aImgListIndex : Integer);
begin inherited Create(AOwner); Assert(Assigned(AOwner),Self.ClassName + ' : Objekt AOwner darf nicht NIL sein.'); Assert(aImgList <> nil, Self.ClassName + ' : Parameter Imageliste darf nicht NIL sein.'); Assert(aImgListIndex <> null, Self.ClassName + ' : Parameter ImagelistIndex darf nicht NULL sein.'); fComponent:= AOwner; if IsPublishedProp(fComponent, 'PopupMenu') then fPopUpMenuCreated := not Assigned([b]fComponent.PopUpMenu[/b]); |
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
TComponent hat keine Eigenschaft PopupMenu, was ja dein Problem ist.
Höher gehen eigentlich ja, aber das wird dir nicht gelingen. Schau dir die anderen Funktionen in TypInfo mal an. U.a. findest du da auch SetPropValue :wink: |
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
das bedeutet das ich mit "SetPropValue"
beim create vom Object dem TComponent eine neue Property zuweisen kann? |
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
Nein. Wie der Funktionsname verrät, kannst du damit eine Eigenschaft, die über deren Name identifiziert wird, einen Wert zuweisen.
Delphi-Quellcode:
If IsPublishedProp(DasObject, NameDerEigenschaft) then
SetPropValue(DasObject, NameDerEigenschaft, WertDerEigenschaft); |
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
Was hindert dich an:
Delphi-Quellcode:
Edit: vergiss es, ist ja protected
fPopUpMenuCreated := not Assigned(TControl(fComponent).PopUpMenu);
|
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
also das Cast klappt leider nicht, weil er meint der Bezeichner wäre undefiniert :gruebel:
|
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
Zitat:
Zitat:
|
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
d.h ich muss in meiner Objectdeklaration ein fPopUpValue einführen und dann
Delphi-Quellcode:
und dann immer auf fPopUpValue abfragen anstatt fComponent.popupmenu ???
If IsPublishedProp(fcomponent, 'PopUpMenu') then
SetPropValue(fcomponent, 'PopUpMenu', fPopUpValue); |
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
Willst du nur wissen ob sie eine Eigenschaft Namens "PopupMenu" haben, oder willst du die Eigenschaft auslesen/setzen?
|
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
Zitat:
Und was sagt getProValue? |
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
ich versuche zu setzen und zu lesen, wenn ich z.b Tbutton ans object gebe dann klappt es, aber ich will es pauschal für alle haben die PopUpMenu können
Delphi-Quellcode:
fComponent:= AOwner;
fPopUpMenuCreated := not Assigned(fComponent.PopUpMenu); if fPopUpMenuCreated then begin fPopUpMenu := TPopUpMenu.Create(self); fPopUpMenu.Name := CompName('PopUpMenu'); fComponent.PopUpMenu := fPopUpMenu; end else begin fPopUpMenu := fComponent.PopUpMenu; end; |
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
Zitat:
|
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
Hallo Zusammen,
was haltet ihr denn von folgendem Ansatz: 1. neue Klasse erstellen
Delphi-Quellcode:
2. Function zum überprüfen erstellen
type
TMyControl = class (TControl) public property PopupMenu; end;
Delphi-Quellcode:
Probier mal aus.
function hasPopup(Sender :TObject) :boolean;
begin if Sender is TControl then result := assigned((Sender as TMyControl).PopupMenu); end; Gruß Frank |
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
danke der ansatz sieht fein aus,
leider bekomme ich beim
Delphi-Quellcode:
eine zugriffsverletzung
result := assigned((Sender as TMyControl).PopupMenu);
sonst hätte ich das so gemacht:
Delphi-Quellcode:
fComponent:= AOwner;
fPopUpMenuCreated := not hasPopUp(fComponent); if fPopUpMenuCreated then begin fPopUpMenu := TPopUpMenu.Create(self); fPopUpMenu.Name := CompName('PopUpMenu'); (fComponent as TMyControl).PopupMenu := fPopUpMenu; end else begin fPopUpMenu := (fComponent as TMyControl).PopupMenu; end; |
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
Vielleicht so:
Delphi-Quellcode:
const Propname='Popupmenu';
... if ispublishedprop(fcomponent,Propname)and (proptype(fcomponent,Propname)=tkClass) then begin fpopupmenu:=TPopupmenu(getordprop(fcomponent,PropName)); if not assigned(fpopupmenu) then begin fpopupmenu:=TPopupmenu.create(self); fPopUpMenu.Name := CompName('PopUpMenu'); setordprop(fcomponent,Propname,integer(fPopupmenu)); end; ... |
Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
super sirius
jetzt klappt es wunderbar!!! :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:21 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