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 Unterproperty in Objektinstpektor (https://www.delphipraxis.net/8314-unterproperty-objektinstpektor.html)

Taladan 2. Sep 2003 11:26


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?

Leuselator 2. Sep 2003 11:49

Re: Unterproperty in Objektinstpektor
 
z.B.:

Delphi-Quellcode:
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;
oder:

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ß

Nimoee 2. Sep 2003 17:18

Re: Unterproperty in Objektinstpektor
 
Hallo,

wenn das Ganze jetzt auch noch eine Antwort auf die Frage wäre, wäre alles O.K.

nimoee

Motzi 2. Sep 2003 17:23

Re: Unterproperty in Objektinstpektor
 
Wieso? Er hat doch ein Beispiel mit dem nötigen Code geliefert... was brauchst du mehr?

Nimoee 2. Sep 2003 17:26

Re: Unterproperty in Objektinstpektor
 
hallo,

die Antwort ist unvollständig und funktioniert nicht!

nimoee

Nimoee 2. Sep 2003 17:33

Re: Unterproperty in Objektinstpektor
 
hallo,

hier wurde eine Arry Eigenschaft definiert und erklärt. Gefragt war aber nach untergeordneten Properties.

nimoee

Phoenix 2. Sep 2003 17:36

Re: Unterproperty in Objektinstpektor
 
Sofern ein Property ein Objekt ist, welches wiederum published Propertys hat, werden diese automatisch im Objekt-Inspektor angezeigt.

Nimoee 2. Sep 2003 17:40

Re: Unterproperty in Objektinstpektor
 
er hat aber gefragt , wie man Unterproperties erstellt. Mit dem + Zeichen davor. So geht das auf jeden Fall nicht!

nimoee

Motzi 2. Sep 2003 17:48

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

Nimoee 2. Sep 2003 17:53

Re: Unterproperty in Objektinstpektor
 
hallo,

sei bitte so freundlich und erklär das am 1. Beispiel!

nimoee

Motzi 2. Sep 2003 18:00

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

Leuselator 2. Sep 2003 20:00

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

Nimoee 3. Sep 2003 06:29

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

Leuselator 3. Sep 2003 07:39

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!

Nimoee 3. Sep 2003 07:52

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

Motzi 3. Sep 2003 08:09

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:
  TMyEnumeration = (meFirst, meSecond, meThird, meFourth);

  TMyObject = class(TComponent)
    private
      FMyEnumeration: TMyEnumeration;
    published
      property MyEnumeration: TMyEnumeration read FMyEnumeration write FMyEnumeration;
  end;
2) TPersisten-Nachfolger
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;

Leuselator 3. Sep 2003 12:07

Re: Unterproperty in Objektinstpektor
 
Lol - komische Art zu betteln :)

Leuselator 3. Sep 2003 12:48

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

Nimoee 5. Sep 2003 06:32

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

negaH 5. Sep 2003 10:02

Re: Unterproperty in Objektinstpektor
 
Keep slow Nimoee, dein Tonfall ist sehr provizierend und du bist der der Hilfe sucht.

Taladan 5. Sep 2003 10:23

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.

Hansa 5. Sep 2003 10:40

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:

http://www.delphipraxis.net/topic439...&highlight=oop

Aber Vorsicht, ist sehr lang und noch nicht fertig! 8)

Christian Seehase 5. Sep 2003 19:03

Re: Unterproperty in Objektinstpektor
 
Moin Taladan,

Zitat:

Zitat von Taladan
Leider sortiert er die Property´s selbständig, was ziemlich d... ist, unten mit einen bild anzufangen.

und ohne die Eigenschaften umzubenennen kannst Du das auch nicht beeinflussen.


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