Delphi-PRAXiS
Seite 1 von 2  1 2      

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 property mit Combobox im Objektinspektor (Typ String) (https://www.delphipraxis.net/6234-property-mit-combobox-im-objektinspektor-typ-string.html)

danielA 4. Jul 2003 11:20


property mit Combobox im Objektinspektor (Typ String)
 
Hallo alle zusammen,

ich versuche gerade einer Komponente ein property vom Typ String hinzuzufügen, in dem die möglichen Werte bereits an anderer Stelle definiert wurden. Wie erreiche ich, daß mir im Objektinspektor nur diese Werte in einer Combobox dargestellt werden so wie Fieldname bei TFieldelementen z.B. DataField in TDBEdit.

Ich vermute mal, daß es irgendwie so funktionieren muß.

Delphi-Quellcode:
private
  FMeineAuswahl : String;
  Function GetMeineAuswahl: String;
published
  // Refferenz auf die Klasse, die die Strings in einer Collection hält
  property MeineReferenz : TMeineKompo read FMeineReferenz write FMeineReferenz;
  // hier soll sich im Objektinspektor die Combobox öffnen
  property MeineAuswahl : String read GetMeineAuswahl write FMeineAuswahl;

   .
   .
   .

  Function MeineKlasse.GetMeineAuswahl: String;
  begin
    if assigned(FMeineReferenz) then
    begin
      for i:=0 to FMeineReferenz.Collection.count-1 do
      begin
           ???
      end;
    end;
  end;
Ich währe euch unendlich Dankbar wenn ihr mir hier weiterhelfen könnt, denn ich grübel hier schon eine halbe Ewigkeit,wie ich das lösen könnte.

Gruß Daniel

Hansa 4. Jul 2003 11:34

Wo ist denn das da her ? Ist das eine Unit, oder ein Package ?

sakura 4. Jul 2003 11:52

Dazu musst Du einen Property-Editor schreiben und registrieren. Hier ein kleines Beispiel, aber leider nicht die Zeit, es großartig zu erklären.

In der Procudure Register, in welcher Du Deine Komponente registrierst, musst Du nach deren Registrierung den Editor registrieren.
Delphi-Quellcode:
// Beispiel
  RegisterPropertyEditor(TypeInfo(String), TMeineKomponente,
      'MeineAuswahl', TComponentMeineAuswahlEditor);
Hier noch die Klasse des Editors:
Delphi-Quellcode:
type
  TComponentMeineAuswahlEditor = class(TStringProperty)
  public
    procedure GetValues(Proc: TGetStrProc); override;
    function GetAttributes: TPropertyAttributes; override;
  end;

function TComponentMeineAuswahlEditor.GetAttributes: TPropertyAttributes;
begin
  // the property editor will provide a sorted list of possible values
  Result := [paValueList, paSortList];
end;

procedure TComponentMeineAuswahlEditor.GetValues(Proc: TGetStrProc);
begin
  // for each possibility call proc with the string
  Proc('Wert 1');
  Proc('Wert 2');
  Proc('Wert 3');
  Proc('Wert 4');
  Proc('Wert 5');
  Proc('Wert 6');
end;
...:cat:...

danielA 4. Jul 2003 12:11

Hallo nochmal
Danke erstmal für die schnellen Antworten

@Hansa

Der Quelltext da oben ist selbstverständlich kein Realer Quelltext. Ich wollte damit nur mein Problem verdeutlichen.
Das was ich damit erreichen will, soll an mehreren Stellen in einer eigenen Komponentensammlung Anwendung finden. Bisher nötige ich den Nutzer dieser Komponenten, die entsprechenden Werte immer wieder neu einzutippen, was nicht gerade auf viel gegenliebe stößt.

@sakura

Ich werde mir das gleich mal anschauen. Jetzt habe ich ja einen realen Ansatz,
Danke.

Gruß Daniel

Nalincah 13. Mai 2004 10:18

Zitat:

Zitat von sakura
Dazu musst Du einen Property-Editor schreiben und registrieren. Hier ein kleines Beispiel, aber leider nicht die Zeit, es großartig zu erklären.

In der Procudure Register, in welcher Du Deine Komponente registrierst, musst Du nach deren Registrierung den Editor registrieren.
Delphi-Quellcode:
// Beispiel
  RegisterPropertyEditor(TypeInfo(String), TMeineKomponente,
      'MeineAuswahl', TComponentMeineAuswahlEditor);
Hier noch die Klasse des Editors:
Delphi-Quellcode:
type
  TComponentMeineAuswahlEditor = class(TStringProperty)
  public
    procedure GetValues(Proc: TGetStrProc); override;
    function GetAttributes: TPropertyAttributes; override;
  end;

function TComponentMeineAuswahlEditor.GetAttributes: TPropertyAttributes;
begin
  // the property editor will provide a sorted list of possible values
  Result := [paValueList, paSortList];
end;

procedure TComponentMeineAuswahlEditor.GetValues(Proc: TGetStrProc);
begin
  // for each possibility call proc with the string
  Proc('Wert 1');
  Proc('Wert 2');
  Proc('Wert 3');
  Proc('Wert 4');
  Proc('Wert 5');
  Proc('Wert 6');
end;
...:cat:...

So, das hab ich gleich mal versucht. Hab die "DesignIntf" eingebunden und meine Proc Register sieht so aus:

Code:
procedure Register;
begin
  RegisterComponents('QuickRep 4 (SK)',[TSKQRAdressLabel]);
  RegisterPropertyEditor(typeinfo(string), TSKQRAdressLabel, 'Strings', TAdressLabelPropertyEditor);
end;
Als ich dann den Type "TAdressLabelPropertyEditor" deklarieren wollte ging es nicht. Der Code:

Code:
type TAdressLabelPropertyEditor = class(TStringProperty)
  public
    procedure GetValues(Proc: TGetStrProc); override;
    function GetAttributes: TPropertyAttributes; override;
  end;
Problem: Der Type "TStringProperty" ist undefiniert. Hab zwar die Unit gefunden (DesignEditors.pas) aber wenn ich die einbinde, findet er in der Unit DesignEditors.pas die Datei "Proxies.dcu /.pas" nicht. Was soll ich machen?? Kann die Datei nirgends finden

Frage: Reicht das was du geschrieben hast um ne Property vom Typ String auszulesen und zu schreiben?

sakura 13. Mai 2004 10:26

Re: property mit Combobox im Objektinspektor (Typ String)
 
Property-Editoren müssen ab Delphi 6 in eine eigene Unit! Zusätzlich musst Du zwei Packages erstellen. Ein Design-Time-only Package mit Komponente und Editoren und ein Run-Time-only Package OHNE Property-Editoren. Dann verschwindet auch die Fehlermeldung. [dp]proxies*[/dp]

...:cat:...

P.S.: Du musst nicht immer gleich den kompletten Beitrag zitieren :roll:

Nalincah 13. Mai 2004 10:48

Re: property mit Combobox im Objektinspektor (Typ String)
 
Also ich hab jetzt ein Package in dem ich unter "Optionen/Beschreibung/Verwenden für" die Einstellung von "Entwurf und Laufzeit" in "Entwurf" geändert hab.

Hab ne neue Unit angelegt:

uSKQRAdressLabelPropEd.pas

Code:
unit uSKQRAdressLabelPropEd;

interface

uses DesignIntf, DesignEditors;

type TAdressLabelPropertyEditor = class(TStringProperty)
  public
    procedure GetValues(Proc: TGetStrProc); override;
    function GetAttributes: TPropertyAttributes; override;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterPropertyEditor(typeinfo(string), TSKQRAdressLabel, 'Strings', TAdressLabelPropertyEditor);
end;

end.
Aus der Hauptunit hab ich den PropertyEditor komplett entfernt, aber der Fehler kommt immernoch

sakura 13. Mai 2004 10:52

Re: property mit Combobox im Objektinspektor (Typ String)
 
Erster Teil okay.

Zweiter Teil: Hast Du den Suchlink genutzt? Dann wärst Du auch bei folgendem Beitrag gekommen: Komponenten unter Delphi 6 und neuer

...:cat:...

Nalincah 13. Mai 2004 11:02

Re: property mit Combobox im Objektinspektor (Typ String)
 
Hab ich auch so gemacht:

2 Packages

pSKQRComposDesign.dpk als Entwurf

Mit 2 Komponenten (Ganz normal, ohne irgendwas von einem PropertyEditor drin)
und eine Unit für den PropEditor (Die Unit die ich grad gepostet habe

pSKQRComposRun.dpk als Laufzeit

Dort hatte ich beide Units (Die mit den Komponenten) eingebunden. Die hat er jedoch im DesignPackage gefunden und hinzugefügt, die die da auch vorhanden sind.

sakura 13. Mai 2004 11:05

Re: property mit Combobox im Objektinspektor (Typ String)
 
Hast Du auch das gemacht?

Zitat:

Daraus ergibt sich, dass dass das Package DesignIde.dcp zu dem Komponentenpackage hinzugefügt werden muss.
...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:17 Uhr.
Seite 1 von 2  1 2      

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