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..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 - 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.
In
.Button1Click mußt du dann wie folgt ergänzen:
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:
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
mkinzler - Di 30.05.06 21:08
Wie
_frank_ schon geschrieben hat. muß es
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..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_ - 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 ;)
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; 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!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!