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 Besitzt eine Komponente eine bestimmte Eigenschaft??? (https://www.delphipraxis.net/102953-besitzt-eine-komponente-eine-bestimmte-eigenschaft.html)

dot 7. Nov 2007 14:33


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

Deep-Sea 7. Nov 2007 14:36

Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
 
Delphi-Quellcode:
uses TypInfo;

IsPublishedProp(...)

dot 7. Nov 2007 14:51

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:
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]);
im fettmarkierten klappt es nicht, keine Ahnung weshalb

Deep-Sea 7. Nov 2007 14:55

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:

dot 7. Nov 2007 15:04

Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
 
das bedeutet das ich mit "SetPropValue"
beim create vom Object dem TComponent eine neue Property zuweisen kann?

Deep-Sea 7. Nov 2007 15:08

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

sirius 7. Nov 2007 15:08

Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
 
Was hindert dich an:
Delphi-Quellcode:
fPopUpMenuCreated := not Assigned(TControl(fComponent).PopUpMenu);
Edit: vergiss es, ist ja protected

dot 7. Nov 2007 15:16

Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
 
also das Cast klappt leider nicht, weil er meint der Bezeichner wäre undefiniert :gruebel:

Deep-Sea 7. Nov 2007 15:20

Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
 
Zitat:

Zitat von dot
also das Cast klappt leider nicht, weil er meint der Bezeichner wäre undefiniert :gruebel:

Lies sirius sein Edit:
Zitat:

Zitat von sirius
Edit: vergiss es, ist ja protected

Und auch so: "fComponent" muss nicht vom Typ TControl sein (wenn man schon castet, müsste man noch "If fComponent is TControl then" schreiben)

dot 7. Nov 2007 15:29

Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
 
d.h ich muss in meiner Objectdeklaration ein fPopUpValue einführen und dann

Delphi-Quellcode:
If IsPublishedProp(fcomponent, 'PopUpMenu') then
  SetPropValue(fcomponent, 'PopUpMenu', fPopUpValue);
und dann immer auf fPopUpValue abfragen anstatt fComponent.popupmenu ???

Deep-Sea 7. Nov 2007 15:33

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?

sirius 7. Nov 2007 15:37

Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
 
Zitat:

Zitat von Deep-Sea
Willst du nur wissen ob sie eine Eigenschaft Namens "PopupMenu" haben, oder willst du die Eigenschaft auslesen/setzen?

Er will ja eben schauen, ob ein PopUpmenu existiert.
Und was sagt getProValue?

dot 7. Nov 2007 15:37

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;

Deep-Sea 7. Nov 2007 15:39

Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
 
Zitat:

Zitat von dot
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

Naja, und zum Prüfen ob es die Eigenschaft gibt, nimmst du IsPublishedProp, zum setzen SetPropValue und zum lesen GetPropValue.

samson 7. Nov 2007 16:05

Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
 
Hallo Zusammen,

was haltet ihr denn von folgendem Ansatz:

1. neue Klasse erstellen

Delphi-Quellcode:
type
  TMyControl = class (TControl)
    public
      property PopupMenu;
  end;
2. Function zum überprüfen erstellen

Delphi-Quellcode:
function hasPopup(Sender :TObject) :boolean;
begin
  if Sender is TControl then
    result := assigned((Sender as TMyControl).PopupMenu);
end;
Probier mal aus.

Gruß


Frank

dot 7. Nov 2007 16:22

Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
 
danke der ansatz sieht fein aus,

leider bekomme ich beim

Delphi-Quellcode:
    result := assigned((Sender as TMyControl).PopupMenu);
eine zugriffsverletzung

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;

sirius 7. Nov 2007 17:51

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

dot 8. Nov 2007 09:10

Re: Besitzt eine Komponente eine bestimmte Eigenschaft???
 
super sirius

jetzt klappt es wunderbar!!!

:thumb:


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