Procedure soll auf Form zugreifen

Hallo,
Ich habe als Informatik-Aufgabe TICTACTOE zu programmieren. Dafür habe ich 9 Buttons, welche, wenn man sie anklickt, eine Prozedur aufrufen die überprüft ob jemand gewonnen hat.
Jetzt habe ich allerdings das Problem, das die aufgerufene Prozedur keine Zugriffsmöglichkeit auf die Form hat. Das heißt wenn einer gewonnen hat, kann ich nichts auf der Form ändern.
Ich könnte nun 9 mal den gleichen Code für jeden Button eingeben, allerdings finde ich das eine sehr unsaubere Lösung.

Gibt es eine Möglichkeit, Daten aus der Form zu lesen und auch welche in ihr zu schreiben?

Gruß
GURKE

Delhpi 5
Wir benutzen übrigens Delphi 5 :smiley:

Hallo,

übergib der aufgerufenen Prozeduch doch einfach eine Referenz auf das Form als Parameter, z.B. so

uses Unit1; // in dieser Unit ist TForm1 deklariert

procedure MachWas(Form:TForm1; ...)
begin
...
 // hier kannst du jetzt auf Form zugreifen
 // zB. Form.Label1.Caption := 'Gewonnen!'
...
end;

VG
Jochen

Hallo,

da muss ich mal fragen:
Hast Du für jeden der 9 Knöpfe eine eigene Ereignisroutine?
Das ist unnötig. Im Objektinspektor kannst Du einem Ereignis eine bereits existierende Routine zuweisen. Du kannst also die gleiche OnClick-Routine für alle Knöpfe verwenden.

Um zu wissen, welcher Knopf gedrückt wurde, kannst Du den Parameter Sender verwenden:

if Sender = Button1 then begin
 x=0; y=0;
end
else if Sender = Button2 then begin
 x=1;y=0;
end
else if
 :
 :
 :
//nach der Abfrage dann mit x und y irgendwas
//berechnen und anschließend auf der Form darstellen.

Noch eleganter (aber auch etwas schwerer durchschaubar) geht es bei Verwendung der Tag-Eigenschaft. Du weist z.B. Button1 Tag=1 zu (im Objektinspektor), Button2 Tag=2 etc. Dann sieht das OnClick-Ereignis z.B. so aus:

var
 KnopfNr: Integer;

begin
 KnopfNr := (Sender as TConponent).Tag; 
 ShowMessage('Nummer des gedrückten Knopfs: ' + KnopfNr);
end;

Nun aber zu Deinem aktuellen Problem:
Das kommt daher, dass die Funktion die Form nicht kennt. Das ist immer dann der Fall, wenn die Funktion in einer anderen Unit deklariert wurde.
Man kann natürlich - wie vorgeschlagen - der Funktion die Form übergeben. Ich halte allerdings nicht viel davon, da s den Grundsatz der größtmöglichen Kapselung verletzt und der Code damit schwerer lesbar wird. Außerdem hängt dann die Form von der Funktion ab, so dass diese Funktion eigentlich in die Form selbst gehört z.B. in den private-Abschnitt. Dort ist dann die Form auch bekannt.

Solltest Du die Funktion in der gleichen Unit deklariert haben und kannst dort trotzdem nicht auf Komponenten zugreifen, die auf der Form liegen, musst Du erst die Form und dann die Komponente aufrufen.
also statt Button1 musst Du Form1.Button1 nehmen.

Gruß, Niels

Korrektur
das muss natürlich heißen:

ShowMessage('Nummer des gedrückten Knopfs: ' + IntToStr(KnopfNr));

Hi,
Hatte heute wieder Informatik! Hat auf Anhieb funktioniert, danke!

Gruß
GURKE