AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Wie mache ich ein dyn. Array eines Objects
Thema durchsuchen
Ansicht
Themen-Optionen

Wie mache ich ein dyn. Array eines Objects

Ein Thema von EccoBravo · begonnen am 27. Jan 2009 · letzter Beitrag vom 29. Jan 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von EccoBravo
EccoBravo

Registriert seit: 19. Okt 2004
Ort: Neuruppin
524 Beiträge
 
Delphi 2007 Architect
 
#1

Wie mache ich ein dyn. Array eines Objects

  Alt 27. Jan 2009, 17:56
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
Wahre Aussage :=
Katzen, die bellen sind keine Kaninchen.

Der Kreisverkehr ist eine spezielle Form der Einbahnstraße
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#2

Re: Wie mache ich ein dyn. Array eines Objects

  Alt 27. Jan 2009, 17:58
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: Wie mache ich ein dyn. Array eines Objects

  Alt 27. Jan 2009, 17:59
Zitat:
dieses mag wohl der Compiler nicht
komisch, mein Compiler hat sowas sehr gern und meckert garnicht rum.

Was meckert der denn? (Fehlermeldung)
$2B or not $2B
  Mit Zitat antworten Zitat
blink182

Registriert seit: 19. Jun 2007
126 Beiträge
 
Delphi 5 Standard
 
#4

Re: Wie mache ich ein dyn. Array eines Objects

  Alt 27. Jan 2009, 18:00
TDCMlist :array of TDCM; sollte funktionieren

siehe Beitrag von Phoenix
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: Wie mache ich ein dyn. Array eines Objects

  Alt 27. Jan 2009, 18:03
Zitat von blink182:
TDCMlist :array of TDCM; sollte funktionieren
als Definition einer Variable vielleicht, aber als Typendeklaration ist es, so wie im ersten Post, richtig.
$2B or not $2B
  Mit Zitat antworten Zitat
blink182

Registriert seit: 19. Jun 2007
126 Beiträge
 
Delphi 5 Standard
 
#6

Re: Wie mache ich ein dyn. Array eines Objects

  Alt 27. Jan 2009, 18:20
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:
 procedure setfeldB(value):single;
also vllt das nochmal bearbeiten, dann sollte das andere auch vllt klappen
  Mit Zitat antworten Zitat
Benutzerbild von EccoBravo
EccoBravo

Registriert seit: 19. Okt 2004
Ort: Neuruppin
524 Beiträge
 
Delphi 2007 Architect
 
#7

Re: Wie mache ich ein dyn. Array eines Objects

  Alt 28. Jan 2009, 10:34
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

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
Wahre Aussage :=
Katzen, die bellen sind keine Kaninchen.

Der Kreisverkehr ist eine spezielle Form der Einbahnstraße
  Mit Zitat antworten Zitat
blink182

Registriert seit: 19. Jun 2007
126 Beiträge
 
Delphi 5 Standard
 
#8

Re: Wie mache ich ein dyn. Array eines Objects

  Alt 28. Jan 2009, 11:00
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

Re: Wie mache ich ein dyn. Array eines Objects

  Alt 28. Jan 2009, 11:11
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;
$2B or not $2B
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: Wie mache ich ein dyn. Array eines Objects

  Alt 28. Jan 2009, 11:20
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
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:27 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