Autor |
Beitrag |
DP
Hält's aus hier
Beiträge: 13
|
Verfasst: 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
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..6] of Integer; C: ARRAY[1..7] of TShape; az, iRand: integer; procedure dice; procedure delete; procedure one; procedure two; procedure three; procedure four; procedure fife; procedure six; end;
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 public 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 jasocul: Delphi-Tags hinzugefügt
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: 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
In .Button1Click mußt du dann wie folgt ergänzen:
Delphi-Quelltext
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 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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_
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: 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
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 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 jasocul: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Di 30.05.06 21:08
Wie _frank_ schon geschrieben hat. muß es
Delphi-Quelltext
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 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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:
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..6] of Integer; C: ARRAY[1..7] of TShape; az,iRand: Integer; procedure dice; procedure delete; procedure one; procedure two; procedure three; procedure four; procedure fife; procedure six; end;
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 public 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 raziel: Code- durch Delphi-Tags ersetzt
|
|
_frank_
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: 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; 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 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: 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_
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: Di 30.05.06 22:16
also so funktioniert das bei mir...beachte auch die random-zeile...
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; 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 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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_
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: 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_
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: 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 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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!
|
|