Delphi-PRAXiS
Seite 1 von 3  1 23      

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 Komponenten-Entwicklung: xyz[i].name (https://www.delphipraxis.net/14892-komponenten-entwicklung-xyz%5Bi%5D-name.html)

lkz633 17. Jan 2004 14:54


Komponenten-Entwicklung: xyz[i].name
 
Hallo,

bin Anfänger in Komponentenentwicklung und würde jetzt gerne eine Struktur erzeugen, so dass ich darauf mit

Code:
componentname.xyz[i].name;
componentname.xyz[i].id
etc darauf zugreifen kann.

Wie mache ich das am besten, es klappt einfach nicht.

Im construktor möchte ich dies auch dann komplett füllen, was muss ich alles erzeugen? Wahrscheinlich eine abgeleiteten Typ von Stringlist für das xyz?

Danke und Gruss
lkz633

Skiron 17. Jan 2004 15:25

Re: Komponenten-Entwcilung: xyz[i].name
 
du kannst folgendes Machen:

Delphi-Quellcode:
type
  Typ1 = record
    Name: string;
    ID: string;
  end;

  MeineComp = class
    xyz: array of Typ1;
  end;

//im constructor:
begin
  setLength(xyz, 4); //Oder wie viel du halt drinnenhaben willst
  //Dann kannst du alles initialisieren...
end;

//außerhalb der komponente:
var
  h: MeineComp;

//irgendwo in einer prozedur
  h.xyz[1].Name := 'xxx';

Christian Seehase 17. Jan 2004 15:25

Re: Komponenten-Entwcilung: xyz[i].name
 
Moin lkz,

ist halt die Frage, ob xyz bei Dir wiederum ein Objekt, oder einfach nur ein Recordtyp sein soll.
In jedem Falle müsstest Du wohl ein (dynamisches) Array für xyz vorsehen

Beispiel:

Delphi-Quellcode:
type
  TMyRecord = packed record
    name : string;
    id  : integer;
  end;

  TMyComponent = class(TObject)
  private
    FMyList : array of TMyRecord;
      function Getxyz(index: integer): TMyRecord;
      procedure Setxyz(index: integer; const Value: TMyRecord);
  public
    constructor Create;
    procedure Add(const AsName : string;AiId : integer);
    property xyz[index : integer] : TMyRecord read Getxyz write Setxyz;
  end;

implementation

{$R *.DFM}

{ TMyComponent }

procedure TMyComponent.Add(const AsName: string; AiId: integer);
begin
  SetLength(FMyList,length(FMyList)+1);
  FMyList[high(FMyList)].name := AsName;
  FMyList[high(FMyList)].Id  := AiId;
end;

constructor TMyComponent.Create;
begin
  inherited;
  SetLength(FMyList,0);
end;

function TMyComponent.Getxyz(index: integer): TMyRecord;
begin
  Result := FMyList[index];
end;

procedure TMyComponent.Setxyz(index: integer; const Value: TMyRecord);
begin
  FMyList[index] := Value;
end;
Das Beispiel enthält keinerlei Sicherheitsprüfungen (Index), und das Array immer um einen Wert zu vergrössern, ist auch nicht besonders geschickt, aber es zeigt einen Weg auf, wie es grundsätzlich machbar wäre.

lkz633 17. Jan 2004 15:41

Re: Komponenten-Entwcilung: xyz[i].name
 
Hallo, das letzte soll auch ein record sein, habe es so mal hinbekommen(alles unwichtige weggelassen):

Code:
type tcontactitem = class
  private
    Fname: string;
    procedure Setname(const Value: string);
  public
  property name: string read Fname write Setname;
end;

type tContactItemList = class(TList)
  private
    function GetItems(Index: Integer): tcontactitem;
    procedure SetItems(Index: Integer; const Value: tcontactitem);
  public
    property Items[Index : Integer]: tcontactitem read GetItems write SetItems;
end;

type
  Toutextract = class(TComponent)
  private
    FOutlookVersion: outlookversion;
    Fcontacts: TContactItemList;
    procedure getcontacts;
    procedure Setcontacts(const Value: TContactItemList);
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    constructor create(AOwner: TComponent); override;
    destructor destroy;
    property contacts: TContactItemList read Fcontacts write Setcontacts;
  end;
Jetzt greife ich aber darauf zu mit outextract1.contacts.Items[1].name, ich will aber direkt outextract1.contacts[1].name, wie bekomme ich das denn hin?

Herzlichen Dank
lkz633

lkz633 17. Jan 2004 16:07

Re: Komponenten-Entwcilung: xyz[i].name
 
Hab das jetzt mit
Code:
property contacts[Index : Integer]: TContactItem read Getcontacts write Setcontacts;
hinbekommen, das ich mit
Code:
contacts[1].name
darauf zugreifen kann, jedoch geht
Code:
contacts.name
auch. Warum?

Dadurch ist jetzt aber
Code:
tcontactlist=class(tlist)
rausgefallen, dies hätte ich aber gerne, so dass ich autom. auch Eigenschaften wie Index und Count habe.

Wie kann ich diese beiden Vorstellungen kombinieren?

Gruss lkz633

Jens Schumann 17. Jan 2004 16:25

Re: Komponenten-Entwcilung: xyz[i].name
 
Hallo,
das bekommst Du so hin (achte darauf das default hinter den Semikolon steht)
Delphi-Quellcode:
property Items[Index : Integer]: tcontactitem read GetItems write SetItems; default;
Den Vorschlag von lkz633 anstatt Records Objekte und anstatt dyn. Array's TList zu verwenden kann ich voll unterstützen.
Meine Grundsatz lautet: Verwende niemals Records. Es sei denn irgendein API verlangt einen Record als Parameter

An der Stelle habe ich mal meinen Senf zum Thema Speichern von Records abgegeben
http://www.delphipraxis.net/internal...399&highlight=

Dabei habe ich einen entscheidenden Vorteil vergessen zu erwähnen.
Wenn eine Datei als File of Record gespeichert wird und der Record wird mit der nächsten Version des Programms erweitert können die alten Dateien nicht mehr ohne weiteres gelesen werden. Wenn jedoch Objekte in Verbindung mit Write-/ReadComponent verwendet werden ist das kein Problem

lkz633 17. Jan 2004 16:31

Re: Komponenten-Entwcilung: xyz[i].name
 
:wall: :wall:

Ich hatte es schon so, nur das default ist mir noch nie über den Weg gelaufen..Naja wieder was gelernt :-)

Danke an alle die geholfen haben

Gruss lkz633

lkz633 17. Jan 2004 16:44

Re: Komponenten-Entwcilung: xyz[i].name
 
Kriegs irgendwie doch nicht gebacken......

Brauch ich tContactList noch oder nicht? Und wiso kann ich auch immer contacs.name benutzen?

Max

Jens Schumann 17. Jan 2004 16:47

Re: Komponenten-Entwcilung: xyz[i].name
 
Hallo,
es scheint so, also ob Du Deinen Source geändert hast.Poste doch mal den kompletten Source.

lkz633 17. Jan 2004 16:49

Re: Komponenten-Entwcilung: xyz[i].name
 
Den hab ich jetzt 5 mal hin und hergeändert....

Ich möchte halt 3 dinge erreichen:

- ich möchte mit contacts[1].name darauf zugreifen
- contacs.count sollte es auch geben
- contacs.name sollte aber nicht funktionieren

Geht das?

Max


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 Uhr.
Seite 1 von 3  1 23      

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