Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Zugriffsproblem bei verschiedenen Klassen


DP - Di 30.05.06 20:33
Titel: Zugriffsproblem bei verschiedenen Klassen
Hallo erstmal, ich hätte da mal eine Frage bezüglich des Zugriffs von Buttons auf Prozeduren anderer Klassen: Ich bin im Moment dabei, ein Würfelprogramm zu schreiben, wobei ich die Klassen Cube = TCube und Form1 = TForm verwende. Nun habe ich unter Cube die procedure dice stehen, kann diese jedoch mit einem Button, der auf Form1 liegt, nicht abrufen...vielleicht könnt ihr mir ja weiterhelfen, Quellcode ist unten nochmal mitbei.
Das Problem habe ich übrigens auch insgesamt, also es sind noch mehrere Befehle, die so arbeiten sollen ;)


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:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  Buttons;

type

  TCube = class
   Statistic: ARRAY[1..6of Integer;
   C: ARRAY[1..7of TShape;
   az, iRand: integer;
   procedure dice;
   procedure delete;
   procedure one;
   procedure two;
   procedure three;
   procedure four;
   procedure fife;
   procedure six;
  end;
   

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
   Shape1: TShape;
   Shape2: TShape;
   Shape3: TShape;
   Shape4: TShape;
   Shape5: TShape;
   Shape6: TShape;
   Shape7: TShape;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end

var
  Form1: TForm1; 
  C1: TCube;

implementation

procedure TForm1.Button2Click(Sender: TObject);
  begin
   application.terminate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  dice;
end;

procedure TForm1.FormCreate(Sender: TObject);
  begin
   C1.C[1]:= Shape1;
   C1.C[2]:= Shape2;
   C1.C[3]:= Shape3;
   C1.C[4]:= Shape4;
   C1.C[5]:= Shape5;
   C1.C[6]:= Shape6;
   C1.C[7]:= Shape7;
end;

procedure TCube.one;
  begin
   C[1].visible:= true;
end;

procedure TCube.two;
  begin
   C[3].visible:= true;
   C[5].visible:= true;
end;

procedure TCube.three;
  begin
   C[4].visible:= true;
   two;
end;

procedure TCube.four;
  begin
   C[1].visible:= true;
   C[4].visible:= true;
   two;
end;

procedure TCube.fife;
  begin
   four;
   one;
end;

procedure TCube.six;
  begin
   C[2].visible:= true;
   C[6].visible:= true;
   four;
end;

procedure TCube.dice;
  begin
   Randomize;
   iRand:= Round(Random(5)+1);
end;

procedure TCube.delete;
  var
   i: integer;
  begin
   FOR i := 1 TO 7 DO C[i].visible := false;
end;

initialization
  {$I unit1.lrs}

end.



Die kritische Stelle ist eben unter TForm1.Button1Click, dort kriege ich beim kompilieren die Fehlermeldung Identifier not found 'dice'

Moderiert von user profile iconjasocul: Delphi-Tags hinzugefügt


mkinzler - Di 30.05.06 20:45

Zuerst mußt du mal eine Instanz der Klasse TCube erzeugen. Am besten machst du das in TForm1.FormCreate.


Delphi-Quelltext
1:
C1 := TCube.Create();                    


In .Button1Click mußt du dann wie folgt ergänzen:


Delphi-Quelltext
1:
C1.Dice();                    


Warum machst du C1 nicht zum Member der Klasse TForm1?

BTW. Dein Source-Code wäre besser lesbar, wenn du ihn in Delpi-Tgas setzen würdest.


DP - Di 30.05.06 20:53

Erstmal danke für die Antwort, hat auch funktioniert, allerdings hab ich, als ich den Button1 nun angeklickt habe, die Fehlermeldung 'Project raised exception class 'External: SIGSEGV'' bekommen..woran liegt das nun wieder? Ich habe den in den Quelltext oben nur eingefügt: C1.TCube.Create() und eben das andere, C1.dice()


_frank_ - Di 30.05.06 20:57

naja TForm hat keine dice-methode...

entweder rufst die dice-methode eines Würfels auf oder schreibst dir eine dice-methode für dein form...

1:

Delphi-Quelltext
1:
c1.dice;                    


2

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
...class(TForm)
...
private
  procedure dice;
end;


procedure TFormx.dice;
begin
  //irgendwelche zusätzlichen Anweisungen
  C1.dice;
end;



Gruß Frank

//edit: hats mich auch mal erwischt...zu spät

//2. edit: hast du C1.TCube.Create() geschrieben oder C1:=TCube.Create()?

Moderiert von user profile iconjasocul: Delphi-Tags hinzugefügt


mkinzler - Di 30.05.06 21:08

Wie user profile icon_frank_ schon geschrieben hat. muß es

Delphi-Quelltext
1:
C1 := TCube.Create();                    

heißen. Außerdem sollte man Randomize nur einmal aufrufen, sonst wird immer die selbe Zufallszahl erzeugt. Deshalb würde ich die Funktion im Konstruktor der TCube-Klasse aufrufen.


DP - Di 30.05.06 21:20

Nun ja, ich habe es verändert, hatte mich auch nur verschrieben, aber das ändert nichts daran, dass das Programm abstürzt, wenn ich auf Button1 klicke, mit der Fehlermeldung, die ich auch schonmal gepostet hatte...woran liegt das nun? Sicherheitshalber hier nochmal der Quellcode:



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:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  Buttons;

type

  TCube = class
    Statistic: ARRAY[1..6of Integer;
    C: ARRAY[1..7of TShape;
    az,iRand: Integer;
    procedure dice;
    procedure delete;
    procedure one;
    procedure two;
    procedure three;
    procedure four;
    procedure fife;
    procedure six;
  end;

  
  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Shape1: TShape;
    Shape2: TShape;
    Shape3: TShape;
    Shape4: TShape;
    Shape5: TShape;
    Shape6: TShape;
    Shape7: TShape;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end

var
  Form1: TForm1; 
  C1: TCube;
  
implementation

procedure TForm1.FormCreate(Sender: TObject);
  begin
   C1 := TCube.Create();
   C1.C[1]:= Shape1;
   C1.C[2]:= Shape2;
   C1.C[3]:= Shape3;
   C1.C[4]:= Shape4;
   C1.C[5]:= Shape5;
   C1.C[6]:= Shape6;
   C1.C[7]:= Shape7;
   Randomize;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  C1.Dice();
end;

procedure TCube.one;
  begin
   C[1].visible:= true;
end;

procedure TCube.two;
  begin
   C[3].visible:= true;
   C[5].visible:= true;
end;

procedure TCube.three;
  begin
   C[4].visible:= true;
   two;
end;

procedure TCube.four;
  begin
   C[1].visible:= true;
   C[4].visible:= true;
   two;
end;

procedure TCube.fife;
  begin
   four;
   one;
end;

procedure TCube.six;
  begin
   C[2].visible:= true;
   C[6].visible:= true;
   four;
end;

procedure TCube.dice;
  begin
   iRand:= Round(Random(5)+1);
end;

procedure TCube.delete;
var
 i: integer;
 begin
  FOR i := 1 TO 7 DO C[i].visible := false;
end;

initialization
  {$I unit1.lrs}

end.


Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt


_frank_ - Di 30.05.06 21:43

also bei mir passiert gar nix, wenn ich auf den button klicke da da nur eine Zufallszahl erstellt wird (in dice) keine zuweisung...

was steht denn in der include-datei (initialization)?

mal meine Dice-procedure...(funktioniert)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TCube.dice;
begin
  delete;
  iRand:= Round(Random(5)+1);
  case iRand of
    1:one;
    2:two;
    3:three;
    4:four;
    5:fife; //ist übrigends falsch geschrieben (normal mir v) ;)
    6:six;
  end;
end;

Gruß Frank

//edit, ich rätsel grade, wie du die shapes angeordnet hast, da 1 = shape1 ist und 4=shape1 auch beinhaltet...sieht nicht wien normaler würfel aus...
//hab auch rausgefunden, dass mein dfmeditor auch Lazarus-lfm-Formulare kann ;)


DP - Di 30.05.06 21:49

Hm, ich glaub ich lad mal am besten die Datei hoch, dann kannst du dir das selber mal angucken - und ich arbeite eben mit Lazarus, vllt liegt das auch daran?


mkinzler - Di 30.05.06 22:13

Also in Delphi funktioniert dein Code (er macht zwar nicht wirklich was, aber es kommt zumindest kein Fehler)
Wleche Version von lazarus verwendest du die ganze neue vom letzten Wochenende?


_frank_ - Di 30.05.06 22:16

also so funktioniert das bei mir...beachte auch die random-zeile...


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:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
procedure TForm1.Button1Click(Sender: TObject);
begin
  C1.Dice();
end;

procedure TCube.one;
  begin
   C[4].visible:= true;
end;

procedure TCube.two;
  begin
   C[1].visible:= true;
   C[7].visible:= true;
end;

procedure TCube.three;
  begin
   one;
   two;
end;

procedure TCube.four;
  begin
   C[3].visible:= true;
   C[5].visible:= true;
   two;
end;

procedure TCube.five;
  begin
   four;
   one;
end;

procedure TCube.six;
  begin
   C[2].visible:= true;
   C[6].visible:= true;
   four;
end;

procedure TCube.dice;
begin
  delete;
  iRand:= Random(6)+1;   //geändert!
  form1.caption:=inttostr(irand);
  case iRand of
    1:one;
    2:two;
    3:three;
    4:four;
    5:five;
    6:six;
  end;
end;


Gruß Frank

//edit hab hier kein lazarus, versuche es aber grade auf debian zu installieren...


DP - Di 30.05.06 22:37

Also, bei mir stürzt das Programm immer noch ab, hättest du vielleicht mal Lust, mir deine komplette Version zu schicken? Ich habe auch einem Freund von mir meine veränderte Version geschickt, er bekommt die selbe Fehlermeldung wie ich...Auf jeden Fall schonmal vielen Dank, ohne euch wäre ich gar nicht weitergekommen ;)


_frank_ - Di 30.05.06 22:53

ich denke mal, das ist ein fehler im lazarus...

aber hier mal meine komplette delphi-version:


_frank_ - Mi 31.05.06 21:58

ich hab mal ein Lazarus-Projekt gemacht...funktioniert so 100%
lazarus-Version: 0.9.16 (aktualle Version)
FPC: 2.0.2

siehe Anhang...


DP - Do 01.06.06 07:05

Vielen Dank, werd mir das Lazarus Projekt mal anschauen, hab mir auch mittlerweile mal Delphi geholt, damit funktionierts einwandfrei, habs damit jetzt fertig gekriegt :)
Vielen Dank für deine Hilfe, ohne hätt's nicht geklappt!