Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   Create mit eigenen Parametern will nicht (https://www.delphipraxis.net/179754-create-mit-eigenen-parametern-will-nicht.html)

TForm1 29. Mär 2014 19:47

Create mit eigenen Parametern will nicht
 
Hallo zusammen,
ich habe wieder ein Problem und zwar habe ich bei einer Bestimmten Klasse einen Constructor, der wie folgt aussieht:
Delphi-Quellcode:
constructor TMeineKlasse.Create(index: integer);
begin
   inherited Create;
   self.FIndex:= index;
   self.FWert:= StrToInt(VerwaltungsKlasse.Array[index].Wert);//Hier stürzt das Programm ab.
end;
Ich habe eigentlich schon alles gecheckt, VerwaltungsKlasse ist initialisiert, das Array ist gefüllt und eigentlich dürfte nichts schiefgehen, oder gibt es da wieder Regeln bezüglich bestimmter Dinge, die man beim Create nicht tun sollte?
Das Array ist übrigens gefüllt mit Records mit verschiedenen Werten.

mkinzler 29. Mär 2014 19:55

AW: Create mit eigenen Parametern will nicht
 
Übergib lieber den Wert und greife nicht auf ein externes Objekt zu. Du kannst Dir nicht seicher sein, ob dieses existiert, für die Unit sichtbar ist oder ein anderes Objekt im Scope ist.

hoika 30. Mär 2014 08:40

AW: Create mit eigenen Parametern will nicht
 
Hallo,

wie äußert sich der Absturz?
Wie viele Einträge hat das Array, welchen Wert hat Index ?
Womit beginnt das Array, mit 0 oder 1?
Den Parameter solltest die besser AIndex nennen,
Dann musst du nicht mit Self hantieren (hier ja eh nicht).

Setze mit F5 einen Breakpoint und schau dir deine Variablenwerte an.

Heiko

TForm1 30. Mär 2014 11:54

AW: Create mit eigenen Parametern will nicht
 
Also, in der VerwaltungsKlasse wird beim Create das Array aus einer Typisierten Datei geladen. Dazu wird einfach in einer Schleife von 0 hochgezählt. Da ich entsprechend synchron eine Liste mit Instanzen von TMeineKlasse benötige, wird noch in der Schleife jeweils ein Objekt von TMeineKlasse erzeugt und der Liste hinzugefügt. Schon beim 1. Create von TMeineKlasse kracht es, da ist der Index noch 0.
Fehlermeldung ist nur das bekannte EXC_BAD_ACCESS. Könnte es vielleicht daran liegen, dass ich das Create praktisch noch im Create von der VerwaltungsKlasse aufrufe? Wie ließe sich das sonst lösen, denn ich muss ja irgendwie doch auf die VerwaltungsKlasse zugreifen können?

DeddyH 30. Mär 2014 12:12

AW: Create mit eigenen Parametern will nicht
 
Zitat:

Zitat von TForm1 (Beitrag 1254000)
Wie ließe sich das sonst lösen, denn ich muss ja irgendwie doch auf die VerwaltungsKlasse zugreifen können?

Hier scheint ein Designfehler vorzuliegen. Man sollte das nach Möglichkeit so planen, dass zwar die Verwaltungsklasse die Datenklasse kennt, aber nicht umgekehrt.

jaenicke 30. Mär 2014 12:32

AW: Create mit eigenen Parametern will nicht
 
Zitat:

Zitat von TForm1 (Beitrag 1254000)
Könnte es vielleicht daran liegen, dass ich das Create praktisch noch im Create von der VerwaltungsKlasse aufrufe?

Die Variable VerwaltungsKlasse wird ja erst nach dem Aufruf von Create zugewiesen, denn zuerst muss der Rückgabewert (das erzeugte Objekt) durch die Funktion Create zurückgegeben werden.

Zitat:

Zitat von TForm1 (Beitrag 1254000)
Wie ließe sich das sonst lösen, denn ich muss ja irgendwie doch auf die VerwaltungsKlasse zugreifen können?

Theoretisch kannst du diese Klasse mit übergeben oder (wie es ohnehin sinnvoll ist) nicht im Konstruktor auf externe Abhängigkeiten zugreifen und das erst in einer separaten Initialisierungsmethode machen. Aber wie DeddyH schon schrieb ist das generell ungünstig.

Es gibt mehrere Möglichkeiten das zu lösen. Zum Beispiel kannst du einen direkten Zugriff auf die andere Klasse in der einen und Events in der anderen Richtung nutzen.

TForm1 30. Mär 2014 13:49

AW: Create mit eigenen Parametern will nicht
 
Zitat:

Zitat von DeddyH (Beitrag 1254005)
Hier scheint ein Designfehler vorzuliegen. Man sollte das nach Möglichkeit so planen, dass zwar die Verwaltungsklasse die Datenklasse kennt, aber nicht umgekehrt.

Ich habe das Problem jetzt so gelöst, indem ich beide Parameter mit übergebe und nicht nur den Index. Dann kann ich ja innerhalb der Create-Methode von der VerwaltungsKlasse problemlos auf das Array zugreifen. Ist ein bisschen mehr Schreibarbeit beim Aufrufen, aber dann tritt wenigstens kein Fehler auf.

sx2008 30. Mär 2014 19:56

AW: Create mit eigenen Parametern will nicht
 
Zitat:

Zitat von TForm1 (Beitrag 1254013)
Ich habe das Problem jetzt so gelöst, indem ich beide Parameter mit übergebe

Ja so ist es richtig.
Dazu noch ein kleines Beispiel:
Wenn du an einem Kiosk (Klasse TKiosk) eine Zeitung (TProduct) kaufen möchtest, übergibst du dann deinen Geldbeutel (TWallet) damit der Kioskbesitzer sich das Geld entnimmt oder übergibst du direkt den Geldbetrag (TMoney)?


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