Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr.
Seite 1 von 2  1 2      

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