Entwickler-Ecke

Sonstiges (Delphi) - Procedure erneut aufrufen


Pandax3 - Fr 11.03.11 20:00
Titel: Procedure erneut aufrufen
Hallo,
ich möchte 4 gewinnt programmieren und frage mich ob folgendes geht:
ich habe eine StringGrid1SelectCell Procedure und möchte aus dieser Procedure dieselbe StringGrid1SelectCell Procedure erneut aufrufen. Also so, dass sie sich wiederholt von vorne. Kann mir einer sagen wie das geht? ;D
Bei Buttons mach ich das mit Button1Click(Sender)
wäre nett wenn jemand helfen kann ;)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm3.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin


        if stringgrid1.cells[acol,0]='' then
        begin
         if stringgrid1.cells[acol,c[acol]]=IntToStr(1)  then repeat c[acol]:=c[acol]-1 until stringgrid1.cells[acol,c[acol]]='';
         if stringgrid1.cells[acol,c[acol]]=IntToStr(0)  then repeat c[acol]:=c[acol]-1 until stringgrid1.cells[acol,c[acol]]='';
         stringgrid1.cells[acol,c[acol]]:=IntToStr(0);
        end
        else
        begin
        showmessage('Bitte werfen Sie den Stein in eine andere Reihe');
        TForm3.StringGrid1SelectCell(Sender); // hier liegt mein Problem, ich möchte die Procedure so aufrufen das ich mir noch mal eine Zelle aussuchen kann
                                              // und die Procedure von vorne startet
        end;

         Button1Click(Sender);
         Button3Click(Sender);

        end;


Georg08 - Fr 11.03.11 20:16

Naja theoretisch musst du nur die Parameter wieder übergeben wie beim Buttonklick.
Allerdings musst du aufpassen, da du die Prozedur, wenn du sie in keien Abfrage hängst jedes mal aufrufst und dass ergibt dann eine Endlosschleie

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm3.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
[...]
// Hier der Aufruf, allerding musste du noch eine Abfrage hinzufügen
StringGrid1SelectCell(Sender, ACol, ARow, CanSelect);

Wenns dir aber nur drum geht alles 2x auszufürhen könntest du auch gleich alles in eine schleife hängen, ist aber keine so schöne Variante

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm3.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
  var
    i: Integer;
begin
  for i := 1 to 2 do begin
    //Aktionen
  end;
end;


elundril - Fr 11.03.11 20:21

Du brauchst selbst das nicht aufrufen. Einfach nur die Fehlermeldung ausgeben reicht. Die Procedure ruft sich alleine auf wenn man ein neues fleckchen gewählt hat. (Das ist ja das schöne bei ereignis-gesteuerten Programmen)

So, hier mal der Quälcode, wie er zum Quellcode geworden ist (richtig formatiert)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm3.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  if stringgrid1.cells[acol,0]='' then begin
    if stringgrid1.cells[acol,c[acol]]=IntToStr(1then 
      repeat 
        c[acol]:=c[acol]-1 
      until stringgrid1.cells[acol,c[acol]]='';
    if stringgrid1.cells[acol,c[acol]]=IntToStr(0then 
      repeat 
        c[acol]:=c[acol]-1 
      until stringgrid1.cells[acol,c[acol]]='';
    stringgrid1.cells[acol,c[acol]]:=IntToStr(0);
    end
  else begin
    showmessage('Bitte werfen Sie den Stein in eine andere Reihe');
    // einfach nichts machen. Dann kannst du ja einfach nochmal klicken. Da brauchst du nix selbst aufrufen
  end;
  Button1Click(Sender);
  Button3Click(Sender);
end;


Pandax3 - Fr 11.03.11 20:25

hm hast recht ;D das gibt ne endlosschleife
Ich versteh nicht ganz wieso ich nicht erst eine Zelle auswählen kann als ob die Procedure ganz neu gestartet ist und damit nicht in die Schleife komme ;O
hat einer ne andere Idee was ich machen kann?
Danke ;d


elundril - Fr 11.03.11 20:27

user profile iconPandax3 hat folgendes geschrieben Zum zitierten Posting springen:
Ich versteh nicht ganz wieso ich nicht erst eine Zelle auswählen kann als ob die Procedure ganz neu gestartet ist und damit nicht in die Schleife komme ;O
hat einer ne andere Idee was ich machen kann?
Danke ;d


Ich zitier mich ja nur ungern selber, aber:
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
Du brauchst selbst das nicht aufrufen. Einfach nur die Fehlermeldung ausgeben reicht. Die Procedure ruft sich alleine auf wenn man ein neues fleckchen gewählt hat. (Das ist ja das schöne bei ereignis-gesteuerten Programmen)


Pandax3 - Fr 11.03.11 20:29

@elundril
mh ne eben nicht ;D
unten habe ich ja noch Button3Click(Sender) stehen.
Und der wird dann ausgefürht obwohl er nur ausgeführt werden soll wenn man in die richtige Reihe geworfen hat ;D

p.s die antwort oben galt nicht dir ;D da warst du wohl paar sekunden schneller als ich


Pandax3 - Fr 11.03.11 20:34

so ich habs ;D


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm3.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin


        if stringgrid1.cells[acol,0]='' then
        begin
         if stringgrid1.cells[acol,c[acol]]=IntToStr(1)  then repeat c[acol]:=c[acol]-1 until stringgrid1.cells[acol,c[acol]]='';
         if stringgrid1.cells[acol,c[acol]]=IntToStr(0)  then repeat c[acol]:=c[acol]-1 until stringgrid1.cells[acol,c[acol]]='';
         stringgrid1.cells[acol,c[acol]]:=IntToStr(0);
         Button3Click(Sender);
        end
        else
        begin
        showmessage('Bitte werfen Sie den Stein in eine andere Reihe');
        end;

         Button1Click(Sender);
        // Button3Click(Sender);

        end;


elundril - Fr 11.03.11 20:38

user profile iconPandax3 hat folgendes geschrieben Zum zitierten Posting springen:
so ich habs ;D


BINGO! Woher soll ich riechen das Button3Click(sender); nur ausgeführt werden soll, wenn die funktion erfolgreich war? Deswegen benennt man seine Buttons gescheit und kommentiert seinen Quelltext.

lg elundril


Pandax3 - Fr 11.03.11 21:10

hm, hab ich doch oben einmal geschrieben ;D
eigentlich wollt ich es ja einfach so machen, dass die Procedure von ganz vorne neu startet ;D
da hat einer wieder zu komlpiziert gedacht :D