Autor Beitrag
hans mans
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 38

Win XP, SuSE 10.0
D7 Pers, D2005 Pers
BeitragVerfasst: Fr 02.12.05 19:59 
Hallo Leute!

Ich bin dabei eine Simulation einer Enigma mit Delphi zu schreiben. Ich habe mich dazu entschlossen das ganze Objektorientiert umzusetzen. Dabei ist jede Walze ein Objekte, das eine Variable "Position" besitzt, die anzeigt, in welche Position die Walze gedreht wurde. Die Unit mit der Klasse Walze sieht so aus:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
Unit enigma;

Interface

Type
  TWalze = Class(TObject)
    Private
      zPosition : Byte;
    Public
      Constructor Init(pBuchstabe:Byte);
      Procedure setzeAuf(pBuchstabe:Byte);
      Function leseAus:Byte;
      Destructor Free;
    End;

Implementation

  Constructor TWalze.Init(pBuchstabe:Byte);
  Begin
    zPosition := pBuchstabe
  End;

  Procedure TWalze.setzeAuf(pBuchstabe:Byte);
  Begin
    self.zPosition := pBuchstabe
  End;
  
  Function TWalze.leseAus:Byte;
  Begin
    result := self.zPosition
  End;

  Destructor TWalze.Free;
  Begin
  End;

End.


Ich versuche nun von einer anderen Unit aus die Variable zPosition zu ändern. Dabei ruft das Programm eine Exception der Klasse EAccessViolation hervor, sobald es "setzeAuf" ausführt. Ich muss dazu noch sagen, dass das mein erster richtiger Versuch mit einer Klasse ist. Ist halt zum lernen gedacht. Kann mir bitte jemand sagen, was ich falsch mache?
I.MacLeod
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 109



BeitragVerfasst: Sa 03.12.05 12:38 
Hast du vielleicht sowas wie hierdas gemacht?

ausblenden Delphi-Quelltext
1:
2:
walze.init(10);
walze.setzeAuf(42);


dann liegt der Fehler wahrscheinlich in der ersten Zeile (beim constructor bin ich mir nicht so ganz sicher)

Versuchs mal so:

ausblenden Delphi-Quelltext
1:
2:
walze := TWalze.Init(10);
walze.setzeAuf(42);


Und... der constructor heißt in der Regel "Create"

Cheers

_________________
{$APPTYPE CONSOLE}uses SysUtils;const a='{$APPTYPE CONSOLE}uses SysUtils;const a=%s;begin write(Format(a,[#39+a+#39]))end.';begin write(Format(a,[#39+a+#39]))end.
Amateur
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 777

(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
BeitragVerfasst: Sa 03.12.05 13:33 
wie wäre es wenn du für deine klasse eine property machst die public ist. im moment hast du eine procedure und eine funktion die die feldvarible ändern.
das geht auch als read und write von einer property. wenn du nicht weisst wovon ich rede findest du eine sehr gute erklärung mit beispiel im
Crashkurs Delphi.
ansonsten der constructor sollte create sein. der destructor ist destroy nicht free. free ruft destroy auf.
hast du in deinem programm auch alles ordentlich createt und gefreet?
ansonsten um zu wissen wo der fehler liegt: mach vier buttons und ruf in den entsprechenden onclicks eine der methoden auf. also im ersten create dann das setzen dann das auslesen und am ende free welches dann destroy aufruft. wenn die exception schon beim button mit create kommt initialisierst du was nicht richtig, kommt die bei den anderen methoden ist die feldvariable nicht richtig initialisiert und kommts bei free dann zerstörst du nicht richtig.
wenn es wirklich erst bei der set methode kommt dann haste was nicht richtig initialisiert. ich denk mal entweder liegts daran dass du init nicht create genommen hast. oder lass mal das zuweisen des wertes im constructor weg und setzt den wert als standartwert am anfang auf 0 oder so. dann weisst du mit der setmethode den wert zu...
wenn ich zeit hab teste ich mal deinen code und versuch es auszubessern aber geht grad nicht.... vielleicht findest du den fehler ja selbst...

_________________
"Kein dummes Gerede. Kein Rumrätseln. Denkt an nichts anderes mehr, nur noch an das, was vor euch liegt. Das ist die wahre Herausforderung. Ihr müßt euch vor euch selbst schützen, Leute." (Rennes in "Cube")
Beiträge: >700
hans mans Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 38

Win XP, SuSE 10.0
D7 Pers, D2005 Pers
BeitragVerfasst: Sa 03.12.05 15:50 
Danke, für die Tips. Das Problem war, dass ich den Construtor nicht richtig aufgerufen habe.