Einzelnen Beitrag anzeigen

Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#4

Re: Array als Published Property

  Alt 12. Jun 2005, 16:28
Also. Hier meine Komponentenunit:
Delphi-Quellcode:
unit DataBaseControls;

interface

uses
  Classes, Controls, Forms, Graphics, StdCtrls, Dialogs;

type
    TFeldRecord = record
          ID : Integer;
          Name : String;
          Typ : Integer;
end;

type
   TFeldListe = class
    private
      FListe: array of TFeldRecord;
      procedure SetField(Index: Integer; Value: TFeldRecord);
      function GetField(Index: Integer): TFeldRecord;
    public
       property Feld[Index: Integer]: TFeldRecord read GetField write SetField;
    end;

type
  TDataBase = class(TComponent)
  private
    { Private-Deklarationen }
    FPfad : string;
    FDatei : String;
    FListe : TFeldListe;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }   // Zur Laufzeit
    constructor Create (AOwner: TComponent); override;
  published
    { Published-Deklarationen }          // Zur Designzeit
    property Pfad : String Read FPfad Write FPfad;
    property Datei : String Read FDatei Write FDatei;
    property Liste : TFeldliste read fListe write fliste;
  end;

implementation

// TDatabase

constructor TDataBase.Create(AOwner:TComponent);
begin
  inherited Create(AOwner);
  FListe := TFeldliste.Create;
end;

//TFeldliste

procedure TFeldliste.SetField(Index: Integer; Value: TFeldRecord);
var l : Integer;
begin
    L := Length(FListe);
    if (L >= Index) then
    begin
         Index := Index - 1;
         FListe[Index].ID := (Index+1);
         FListe[Index].Name := value.Name;
         FListe[Index].typ := value.Typ;
    end
    else
    begin
         L := (length(FListe) + 1);

         SetLength(FListe, L);

         FListe[High(FListe)].ID := Index;
         FListe[Index].Name := value.Name;
         FListe[Index].typ := value.Typ;
    end;

end;

function TFeldliste.GetField(Index: Integer): TFeldRecord;
begin
  result := Fliste[index];
end;



end.
und hier mein Editor:

Delphi-Quellcode:
unit FeldEditor;

interface

uses
  Windows, Classes, Graphics, Forms, Controls, Buttons, DesignIntf,
  DesignWindows, StdCtrls, ComCtrls, DesignEditors, DataBaseControls, SysUtils;


type
  TFeldEditorDlg = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button3Click(Sender: TObject);
  private
    FFelder : TFeldListe;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure FormCreate(Sender: TObject);
    property EditorFelder : TFeldListe read FFelder write FFelder;
  end;

  TFeldProperty = class(TClassProperty)
  public
    procedure Edit; override;
    function GetAttributes: TPropertyAttributes; override;
  end;

  TFeldEditor = class(TDefaultEditor)
  protected
    procedure EditProperty(const PropertyEditor: IProperty;
      var Continue: Boolean); override;
  public
    procedure ExecuteVerb(Index: Integer); override;
    function GetVerb(Index: Integer): string; override;
    function GetVerbCount: Integer; override;
  end;

procedure Register;

implementation
{$R *.dfm}


  { TFeldProperty }

procedure TFeldProperty.Edit;
var
  Felder: TFeldListe;
  FeldEditor: TFeldEditorDlg;
begin
  Felder := TFeldListe(GetOrdValue);
  FeldEditor := TFeldEditorDlg.Create(Application);
  try
    FeldEditor.FFelder := Felder;
    FeldEditor.ShowModal;
  finally
    FeldEditor.Free;
  end;
end;

function TFeldProperty.GetAttributes: TPropertyAttributes;
begin
  Result := [paDialog, paSubProperties];
end;


  { TFeldEditor - Verbindungen/Objektinspektor }

procedure TFeldEditor.EditProperty(const PropertyEditor: IProperty;
  var Continue: Boolean);
var
  PropName: string;
begin
  PropName := PropertyEditor.GetName;
  if (CompareText(PropName, 'Felder') = 0) then
  begin
    PropertyEditor.Edit;
    Continue := False;
  end;
end;

function TFeldEditor.GetVerb(Index: Integer): string;
begin
  if Index = 0 then
    Result := 'Felder'
  else Result := '';
end;


function TFeldEditor.GetVerbCount: Integer;
begin
  Result := 1;
end;


procedure TFeldEditor.ExecuteVerb(Index: Integer);
begin
  if Index = 0 then Edit;
end;

  { Sonnstige }


procedure Register;
begin
  RegisterComponents('DataBaseControls', [TDataBase]);
  RegisterComponentEditor(TDataBase, TFeldEditor);
  RegisterPropertyEditor(TypeInfo(TFeldliste), nil, '', TFeldProperty);
end;

  { TFeldEditorDlg - Formular }

procedure TFeldEditorDlg.FormCreate(Sender: TObject);
begin
  FFelder := TFeldListe.Create;
end;


procedure TFeldEditorDlg.Button3Click(Sender: TObject);
begin
  ffelder.Feld[0].id := 0;
end;

end.
Ziel soll es sein. Ein Array zu haben, welches folgendermaßen zugegriffen wird.

DataBase1.Liste[0].ID oder DataBase1.Liste.Feld[0].id

Irgendwie muß so was ja gehen, da eine Stringlist ja auch nix anderes ist, als ein Array von Strings.
Marco
Wer Rechtschreibfehler findet, der darf sie behalten

Carpe Diem - Nutze den Tag (und zwar den ganzen!)
  Mit Zitat antworten Zitat