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

Array als Published Property

  Alt 12. Jun 2005, 17:02
Hallo. Ich möchte gern ein Array als published property erstellen. Laut OH geht dies, jedoch nur, wenn man ein Komponenteneditor erstellt. Das wäre ja alles kein Problem, jedoch funktionieren die funktionen nicht so wie ich will, nämlich gar nicht. Ich kann nicht über
Database1.Liste(0).id auf den Record zu greifen. Kann mir einer sagen warum?

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

type
   TFeldListe = class(TPersistent)
    private
      FListe: array of TFeldRecord;
      procedure SetField(Index: Integer; Value: TFeldRecord);
      function GetField(Index: Integer): TFeldRecord;
    public
       property Liste[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;
Marco
Wer Rechtschreibfehler findet, der darf sie behalten

Carpe Diem - Nutze den Tag (und zwar den ganzen!)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Array als Published Property

  Alt 12. Jun 2005, 17:13
was für ein Fehler kommt? estellst du überhaupt die Instanz von TFeldliste (fListe)?
und wo setzt du überhaupt die Länge (SetLength) von "FListe" in TFeldListe?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Array als Published Property

  Alt 12. Jun 2005, 17:14
Hallo taladan,

Zitat von taladan:
Ich kann nicht über Database1.Liste(0).id auf den Record zu greifen. Kann mir einer sagen warum?
du hast deine Klassen so entworfen, dass du nur mit Database1.Liste.Liste[0].ID zugreifen kannst. Außerdem fehlt eventuell ein Konstruktor in der Klasse TFeldListe.

Grüße vom marabu
  Mit Zitat antworten Zitat
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, 17: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
Benutzerbild von Taladan
Taladan

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

Re: Array als Published Property

  Alt 12. Jun 2005, 17:37
Wenn ich z.b. so zu greifen will, steht da immer, das der linken Seite nichts zu gewiesen werden kann

ffelder.Feld[0].id := 0;

Natürlich will ich später auch auf die einzelnen Array-Elemente zu greifen können.
Marco
Wer Rechtschreibfehler findet, der darf sie behalten

Carpe Diem - Nutze den Tag (und zwar den ganzen!)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Array als Published Property

  Alt 12. Jun 2005, 18:16
das liegt daran das das property den gesamten record zurück gibt. Es müsste also wenn dan so heißen
Delphi-Quellcode:
var LRecord: TFeldRecord;
begin
  LRecord := ffelder.Feld[0];
  LRecord.id := 0;
  ffelder.Feld[0] := LRecord;
wenn also dein Property vom Typ "TFeldRecord" ist dann kannst du auch nur immer den gesamten Recored lesen oder schreiben.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
meierotto

Registriert seit: 20. Mai 2005
Ort: Cottbus
73 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Array als Published Property

  Alt 24. Jun 2005, 11:34
Ist zwar nicht mehr aktuell, aber vielen Dank Sir Thornberry
Einfach die Felder der Records einzeln als array propertys anlegen und schon gehts!
  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 15:29 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