AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array als Published Property

Ein Thema von Taladan · begonnen am 12. Jun 2005 · letzter Beitrag vom 24. Jun 2005
Antwort Antwort
Benutzerbild von Taladan
Taladan

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

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:01 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