Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie mache ich ein dyn. Array eines Objects (https://www.delphipraxis.net/128304-wie-mache-ich-ein-dyn-array-eines-objects.html)

EccoBravo 27. Jan 2009 16:56


Wie mache ich ein dyn. Array eines Objects
 
Hallo,

Bin an einer ObjectList verzagt (läuft nicht sicher) und will nun ein dynamisches Artray eines Objects machen.
Dabei ärgern mich Compilermeldungen, die ich nicht deuten kann.

Mit einem dyn. Array eines records bin ich nicht zufrieden, da ich Daten Kapseln möchte und einiges (wie feldspezifische Formatkontrollen) im Hintergrund laufen lassen will.

Daher die Frage an Euch: Wie wird sauber ein dynamisches Array eines TObject im Interface und implementation programmiert?

Mein Codefragment:
Delphi-Quellcode:
...
interface
...
type
  TDCM = class(TObject)
        private
           FfeldA:integer;
           FfeldB:single;
           FfeldC:string;
           function getfeldA:integer;
           procedure setfeldA(value:integer);
           function getfeldB:single;
           procedure setfeldB(value):single;
           function getfeldC:string;
           procedure setfeldC(value:string);
        published
           property feldA:integer read getfeldA write setfeldA;
           property feldB:single read getfeldB write setfeldB;
           property feldC:string read getfeldC write setfeldC;
       end;

       TDCMlist = array of TDCM; // dieses mag wohl
                                  // der Compiler nicht
...
implementation
...
...
Problemstelle habe ich markiert.

Danke für Unterstützung

EB

Phoenix 27. Jan 2009 16:58

Re: Wie mache ich ein dyn. Array eines Objects
 
Zitat:

Zitat von EccoBravo
Bin an einer ObjectList verzagt (läuft nicht sicher) und will nun ein dynamisches Artray eines Objects machen.

Dynamische Arrays gehen nur als Variablen, nicht jedoch als Typen (da muss die Länge bekannt sein, damit der Speicher entsprechend reserviert werden kann).

Was lief denn bei der Objectlist nicht 'sicher'? Das wäre mit Sicherheit doch der bessere Weg.

himitsu 27. Jan 2009 16:59

Re: Wie mache ich ein dyn. Array eines Objects
 
Zitat:

dieses mag wohl der Compiler nicht
komisch, mein Compiler hat sowas sehr gern und meckert garnicht rum.

Was meckert der denn? (Fehlermeldung)

blink182 27. Jan 2009 17:00

Re: Wie mache ich ein dyn. Array eines Objects
 
Delphi-Quellcode:
TDCMlist :array of TDCM;
sollte funktionieren ;)

siehe Beitrag von Phoenix

himitsu 27. Jan 2009 17:03

Re: Wie mache ich ein dyn. Array eines Objects
 
Zitat:

Zitat von blink182
Delphi-Quellcode:
TDCMlist :array of TDCM;
sollte funktionieren ;)

als Definition einer Variable vielleicht, aber als Typendeklaration ist es, so wie im ersten Post, richtig.

blink182 27. Jan 2009 17:20

Re: Wie mache ich ein dyn. Array eines Objects
 
okay, mein Fehler, das sollte auch gehen.
mhm für mich sieht das Codefragment ehr falsch aus, anstatt die typendeklaration von TDCMList

z.b.
Zitat:

Delphi-Quellcode:
 procedure setfeldB(value):single;

also vllt das nochmal bearbeiten, dann sollte das andere auch vllt klappen

EccoBravo 28. Jan 2009 09:34

Re: Wie mache ich ein dyn. Array eines Objects
 
Hallo,
ich kann jetzt genau sagen, wo der Fehler in meiner Objectliste auftritt,
weiss aber nicht genau, was ich falsch gemacht habe.

Schaut mal in mein Codefragment:

Delphi-Quellcode:
...
interface
...
type
  TDCM = class(TObject)
        private
           FfeldA:integer;
           FfeldB:single;
           FfeldC:string;
           function getfeldA:integer;
           procedure setfeldA(value:integer);
           function getfeldB:single;
           procedure setfeldB(value):single;
           function getfeldC:string;
           procedure setfeldC(value:string);
        published
           property feldA:integer read getfeldA write setfeldA;
           property feldB:single read getfeldB write setfeldB;
           property feldC:string read getfeldC write setfeldC;
       end;

       TDCMlist = array of TDCM;
...
implementation
...
...
procedure TDCM.setfeldA(const value:integer);
begin
    FfeldA := value;  // ! hier tritt der Fehler auf !
                       // wenn aus dem Hauptprogramm ein Feld
                       // geschrieben werden soll
                       // Fehlermeldung folgt untenstehend
end;
...
...

Fehlermeldung des Debuggers:
Im Project P_DCM.exe ist eine Exception der Klasse EAccessViolation mit der Meldung Zugriffsverletzung bei Adresse xxxxxxx in Modul P_DCM.exe 'Schreiben von Adresse yyyyyy' aufgetreten.

Ausgelöst wird der Fehler durch den Aufruf aus dem Hauptprogramm

Delphi-Quellcode:
DCMlist[i].feldA:=123;
mit i:=1,2,3...

Ich vermute, irgendwie fehlt dem ein Listenindex des beherbergenden Arrays TDCMlist in der obigen procedure TDCM.setfeldA(const value:integer);
derart
Delphi-Quellcode:
procedure TDCM.setfeldA(const value:integer);
begin
    TDCMlist[i].FfeldA := value;  
end;
Da ich mit solchen Strukturen noch nie gearbeitet habe brauche ich Eure Hilfe.
Was habe ich falsch gemacht?

Danke und Grüße

EB

blink182 28. Jan 2009 10:00

Re: Wie mache ich ein dyn. Array eines Objects
 
hab das eben mal in meinem Delphi getestet

Delphi-Quellcode:
  TDCM = class(TObject)
        private
           FfeldA:integer;
//           FfeldB:single;
//           FfeldC:string;
           function getfeldA:integer;
           procedure setfeldA(value:integer);
//           function getfeldB:single;
//           procedure setfeldB(value:single);
//           function getfeldC:string;
//           procedure setfeldC(value:string);
        published
           property feldA:integer read getfeldA write setfeldA;
//           property feldB:single read getfeldB write setfeldB;
//           property feldC:string read getfeldC write setfeldC;
       end;

       TDCMlist = array of TDCM;



var
  Form1: TForm1;
 bla:TDCM;
implementation

{$R *.DFM}

procedure TDCM.setfeldA(value:integer);
begin
    FfeldA := value;  // ! hier tritt der Fehler auf !
                       // wenn aus dem Hauptprogramm ein Feld
                       // geschrieben werden soll
                       // Fehlermeldung folgt untenstehend
end;


function TDCM.getfeldA:integer;
begin
result:=FfeldA;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
bla:=TDCM.Create;
bla.setfelda(5);
showmessage(inttostr(bla.getfelda));
end;
also das geht bei mir relativ reibungslos.
Bei deinem Quelltext solltest du das const entweder in der Klasse mit in die Prozedur einbauen, oder unten bei der Definition weglassen.
was ich jetzt nicht weiß, ob

Zitat:

Delphi-Quellcode:
procedure TDCM.setfeldA(const value:integer);
begin
    TDCMlist[i].FfeldA := value;  
end;

funktioniert. Aber ich denke ehr nicht, aber die obige Prozedur sollte das ja übernehmen.

vllt solltest du um die letze Prozedur zu verwirklichen noch was an deiner Klasse TDCMlist machen, prozeduren-mässig.
hoffe das kannst du jetzt gebrauchen

himitsu 28. Jan 2009 10:11

Re: Wie mache ich ein dyn. Array eines Objects
 
Zitat:

Zitat von blink182
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  bla:=TDCM.Create;
  bla.setfelda(5);
  showmessage(inttostr(bla.getfelda));
end;

außerhalb der Klasse solltest du nicht auf Privates zugreifen
(OK, geht hier zwar, daß beides in der gleichen Unit liegt, aber so isses ja nich gedacht)
Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
  bla:=TDCM.Create;
  [b]bla.feldA[/b] := 5;
  showmessage(inttostr([b]bla.feldA[/b]));
end;

Klaus01 28. Jan 2009 10:20

Re: Wie mache ich ein dyn. Array eines Objects
 
Delphi-Quellcode:
DCMlist[i].feldA:=123;
mit i:=1,2,3...


Aus meiner Sicht, ist diese Methode unsinnig.
Delphi-Quellcode:
procedure TDCM.setfeldA(const value:integer);
begin
    TDCMlist[i].FfeldA := value;  
end;
Denn Dein Object TDCM kennt die Liste TDCMListe nicht.


TDCMListe ist ein Array of TDCM

Also musst Du für jedes Element eine Instanz erzeugen.

Delphi-Quellcode:
var
  DCMList: TDCMListe

...

  setlength(DMCListe,5);

  // Listenelemente erzeugen
  for i:=0 to 4 do
    DCMListe[i]:= TDCM.create;
  // nutzen
  DCMListe[1].setFeldA(45);

  //freigeben
  for i:=0 to 4 do
    DCMListe[i].free;
Grüße
Klaus

EccoBravo 28. Jan 2009 13:36

Re: Wie mache ich ein dyn. Array eines Objects
 
Danke Klaus01,

das war die Lösung die ich suche.

Grüße

EB

DasZiesel 28. Jan 2009 14:06

Re: Wie mache ich ein dyn. Array eines Objects
 
Hallo,

ich verstehe nicht warum du nicht TObjectList verwendest und den Umweg über Dyn. Arrays vorziehst?

Aus der Delphi Hilfe...
Zitat:

TObjectList verwaltet eine Liste der (eigenen) Objekte.

Mit TObjectList können Sie eine Liste von Objekten speichern und verwalten. Die Komponente stellt Eigenschaften und Methoden für das Hinzufügen, Löschen, Umsortieren, Suchen, Zugreifen und Sortieren von Objekten zur Verfügung. Ist die Eigenschaft OwnsObjects auf true gesetzt (Voreinstellung), verwaltet TObjectList den Speicher seiner Objekte, das heißt, ein Objekt wird freigegeben, wenn sein Index neu zugewiesen wird, wenn es mit der Methode Delete, Remove oder Clear aus der Liste entfernt wird oder wenn die Instanz TObjectList selbst aufgelöst wird.
P.S.
Alternativ würde natürlich auch TList gehen, nur dort musst du eben vor der Zerstörung der TList Klasse deine eigenen Objekte freigeben, was dir bei TObjectList erspart bleibt.

EccoBravo 29. Jan 2009 08:37

Re: Wie mache ich ein dyn. Array eines Objects
 
Hallo DasZiesel,

hatte ursprünglich das Projrct mit TObjectList angefangen und dann leider wieder aufgeben müssen.
Mit ObjectList hat das Programm unsauber gearbeitet, also einige Oblectfelder falsch oder gar nicht geladen/gespeichert. Mit dyn.Array läuft es hingegen wunderbar und ohne Probleme. Deshalb werde ich bei dyn.Array bleiben.

Es sei denn, Du hat eine Idee, warum TObjectList unsauber laufen könnte.

Danke und Grüße

EB


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:39 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