Autor Beitrag
DP
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Di 30.05.06 20:33 
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 ;)

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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: 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.

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


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

ausblenden 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.

_________________
Markus Kinzler.
DP Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
c1.dice;					


2
ausblenden 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

_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Di 30.05.06 21:08 
Wie user profile icon_frank_ schon geschrieben hat. muß es
ausblenden 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.

_________________
Markus Kinzler.
DP Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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:


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:
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_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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)
ausblenden 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 ;)

_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3


Zuletzt bearbeitet von _frank_ am Di 30.05.06 22:22, insgesamt 2-mal bearbeitet
DP Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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?
Einloggen, um Attachments anzusehen!
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: 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?

_________________
Markus Kinzler.
_frank_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: Di 30.05.06 22:16 
also so funktioniert das bei mir...beachte auch die random-zeile...

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:
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...

_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
DP Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: Di 30.05.06 22:53 
ich denke mal, das ist ein fehler im lazarus...

aber hier mal meine komplette delphi-version:
Einloggen, um Attachments anzusehen!
_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
_frank_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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...
Einloggen, um Attachments anzusehen!
_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
DP Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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!