![]() |
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:
Problemstelle habe ich markiert.
...
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 ... ... Danke für Unterstützung EB |
Re: Wie mache ich ein dyn. Array eines Objects
Zitat:
Was lief denn bei der Objectlist nicht 'sicher'? Das wäre mit Sicherheit doch der bessere Weg. |
Re: Wie mache ich ein dyn. Array eines Objects
Zitat:
Was meckert der denn? (Fehlermeldung) |
Re: Wie mache ich ein dyn. Array eines Objects
Delphi-Quellcode:
sollte funktionieren ;)
TDCMlist :array of TDCM;
siehe Beitrag von Phoenix |
Re: Wie mache ich ein dyn. Array eines Objects
Zitat:
|
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:
|
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:
mit i:=1,2,3...
DCMlist[i].feldA:=123;
Ich vermute, irgendwie fehlt dem ein Listenindex des beherbergenden Arrays TDCMlist in der obigen procedure TDCM.setfeldA(const value:integer); derart
Delphi-Quellcode:
Da ich mit solchen Strukturen noch nie gearbeitet habe brauche ich Eure Hilfe.
procedure TDCM.setfeldA(const value:integer);
begin TDCMlist[i].FfeldA := value; end; Was habe ich falsch gemacht? Danke und Grüße EB |
Re: Wie mache ich ein dyn. Array eines Objects
hab das eben mal in meinem Delphi getestet
Delphi-Quellcode:
also das geht bei mir relativ reibungslos.
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; 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:
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 |
Re: Wie mache ich ein dyn. Array eines Objects
Zitat:
(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; |
Re: Wie mache ich ein dyn. Array eines Objects
Delphi-Quellcode:
mit i:=1,2,3...
DCMlist[i].feldA:=123;
Aus meiner Sicht, ist diese Methode unsinnig.
Delphi-Quellcode:
Denn Dein Object TDCM kennt die Liste TDCMListe nicht.
procedure TDCM.setfeldA(const value:integer);
begin TDCMlist[i].FfeldA := value; end; TDCMListe ist ein Array of TDCM Also musst Du für jedes Element eine Instanz erzeugen.
Delphi-Quellcode:
Grüße
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; Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 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