Entwickler-Ecke

Sonstiges (Delphi) - Inkompatible Typen


Pandax3 - Do 10.03.11 20:06
Titel: Inkompatible Typen
Hallo, ich habe ein Problem ;D
ich weiß nicht was ich falsch mach aber ich bekomme immer diese Fehlermeldung (ich möchte 4 gewinnt programmieren):
wäre nett wenn jemand helfen könnte ;D


Quelltext
1:
2:
[Fehler] Unit3.pas(93): Inkompatible Typen: 'String' und 'procedure, untyped pointer or untyped parameter'
[Fehler] Unit3.pas(101): Inkompatible Typen: 'String' und 'procedure, untyped pointer or untyped parameter'








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:
procedure TForm3.Button3Click(Sender: TObject);
var a,b,i,j:integer;
begin

      for i:=0 to 6 do
      for j:= 0 to 6   do
      if stringgrid1.Cells[i,j]=IntToStr(0and if stringgrid1.Cells[i,j+1]=IntToStr(0and
      if stringgrid1.Cells[i,j+2]=IntToStr(0then stringgrid1.Cells[i,j+3]:=IntToStr(1)  else


      Repeat
      randomize;
      a:=random(6)+0;
      b:=random(6)+0;
      until    stringgrid1.cells[a,b]=''; //--> hier kommt die erste Fehlermeldung

      if stringgrid1.cells[a,6]='' then stringgrid1.cells[a,6]:=IntToStr(1else
      if stringgrid1.cells[a,5]='' then stringgrid1.cells[a,5]:=IntToStr(1else
      if stringgrid1.cells[a,4]='' then stringgrid1.cells[a,4]:=IntToStr(1else
      if stringgrid1.cells[a,3]='' then stringgrid1.cells[a,3]:=IntToStr(1else
      if stringgrid1.cells[a,2]='' then stringgrid1.cells[a,2]:=IntToStr(1else
      if stringgrid1.cells[a,1]='' then stringgrid1.cells[a,1]:=IntToStr(1else
      if stringgrid1.cells[a,0]='' then stringgrid1.cells[a,0]:=IntToStr(1);

      Button1Click(Sender);
end;


Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


HenryHux - Do 10.03.11 20:21

Naja ich würde erstmal drauf tippen, dass die Zeilen hier falsch sind:

Delphi-Quelltext
1:
2:
if stringgrid1.Cells[i,j]=IntToStr(0and if stringgrid1.Cells[i,j+1]=IntToStr(0and 
if stringgrid1.Cells[i,j+2]=IntToStr(0then stringgrid1.Cells[i,j+3]:=IntToStr(1else

Versuchs mal mit

Delphi-Quelltext
1:
2:
  if (stringgrid1.Cells[i,j]=IntToStr(0)) and (stringgrid1.Cells[i,j+1]=IntToStr(0)) and 
    (stringgrid1.Cells[i,j+2]=IntToStr(0)) then stringgrid1.Cells[i,j+3]:=IntToStr(1else


Lg


Pandax3 - Do 10.03.11 20:31

so danke erstmal ;D
die fehlermeldung ist weg , jetzt komm jedoch an der selben stelle eine neue:

[Fehler] Unit3.pas(93): Operator ist auf diesen Operandentyp nicht anwendbar


Pandax3 - Do 10.03.11 21:46

so habe den fehler behoben ;D

richtig ist :


Delphi-Quelltext
1:
2:
3:
4:
 for i:=0 to 6 do begin
               for j:= 0 to 6   do begin
               if ((stringgrid1.Cells[i,j]=IntToStr(0)) and  (stringgrid1.Cells[i,j-1]=IntToStr(0)) and
               (stringgrid1.Cells[i,j-2]=IntToStr(0))) then (stringgrid1.Cells[i,j-3]:=IntToStr(1));


Allerdings habe ich noch eine Frage und zwar bekomm ich immer folgende Fehlermeldung: 'END' erwartet aber 'ELSE' gefunden
Was mach ich falsch? wäre nett wenn jemand helfen könnte :(




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:
procedure TForm3.Button3Click(Sender: TObject);
var a,b,i,j:integer;
begin

      for i:=0 to 6 do begin
      for j:= 0 to 6   do begin
      if ((stringgrid1.Cells[i,j]=IntToStr(0)) and  (stringgrid1.Cells[i,j-1]=IntToStr(0)) and
       (stringgrid1.Cells[i,j-2]=IntToStr(0))) then (stringgrid1.Cells[i,j-3]:=IntToStr(1)); endend


        else

begin
      Repeat
      randomize;
      a:=random(6)+0;
      b:=random(6)+0;
      until    stringgrid1.cells[a,b]='';

      if stringgrid1.cells[a,6]='' then stringgrid1.cells[a,6]:=IntToStr(1else
      if stringgrid1.cells[a,5]='' then stringgrid1.cells[a,5]:=IntToStr(1else
      if stringgrid1.cells[a,4]='' then stringgrid1.cells[a,4]:=IntToStr(1else
      if stringgrid1.cells[a,3]='' then stringgrid1.cells[a,3]:=IntToStr(1else
      if stringgrid1.cells[a,2]='' then stringgrid1.cells[a,2]:=IntToStr(1else
      if stringgrid1.cells[a,1]='' then stringgrid1.cells[a,1]:=IntToStr(1else
      if stringgrid1.cells[a,0]='' then stringgrid1.cells[a,0]:=IntToStr(1);

end;
      Button1Click(Sender);
end;


Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


elundril - Do 10.03.11 21:52

Klar.

Punkt 1) Wo ein Begin ist muss auch ein end sein.
Punkt 2) Benutz hier im Forum bitte die Delphi-Tags um deinen Quellcode lesbarer zu machen ([delphi][/delphi]
Punkt 3) Führe dir diese Tutorials zu gemüte: Delphi-Wikibook [http://de.wikibooks.org/wiki/Programmierkurs:_Delphi], Christians Crashkurs [http://www.christian-stelzmann.de/index_tutorials_crashkurs.html]
Punkt 4) Lies dir die Fehlermeldung vom Compiler durch und überleg mal was sie heißen könnte.

lg elundril


Pandax3 - Do 10.03.11 22:03

hm ja ok .
danke für die tipps ;D
allerdings versteh ich das immer noch nich ganz ;(

ich habe doch zu jedem Begin ein End gesetzt? Wo muss denn noch ein end hin?


elundril - Do 10.03.11 22:08

auf jeden fall nach dem else. Überleg dir mal von wo bis wo die for-schleifen gehen sollten (was alles drin abgearbeitet werden soll. und danach setzt du dann die end;

außerdem solltest du mal richtig den code einrücken, da erkennt man ja überhaupt nix. ;) Die Anleitung dafür findest du hier [http://www.delphi-treff.de/object-pascal/delphi-styleguide/].

lg elundril


Pandax3 - Fr 11.03.11 14:44

so jetzt funktionierts ;D
das mit den END's hat nicht ganz hingehauen habe das Problem jetzt andere gelöst.
Ich habe allerdings noch eine Frage und möchte kein neues Topic eröffnen daher stell ich sie hier:

Ist es möglich eine Procedure noch einmal von vorne aufzurufen?


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:
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); // das funktioniert leider nicht ;D ich möchte die Procedure eigentlich noch mal von vorne aufrufen , ist das irgendwie möglich? 
//Also so das man sich nochmal aussuchen kann, wo man den Stein reinwirft 
 end;


         Button1Click(Sender);
         Button3Click(Sender);

        end;


Marc. - Fr 11.03.11 15:11


Delphi-Quelltext
1:
stringgrid1.cells[acol,c[acol]]=IntToStr(1// Weshalb nicht = '1'                    

Wofür zwei If-Abfragen, wenn auch eine reicht?

Delphi-Quelltext
1:
if (stringgrid1.cells[acol,c[acol]] = '1'or ( if stringgrid1.cells[acol,c[acol]] = '0'  then                    

Mal abgesehen davon, dass deine Schleife in gewisser Hinsicht Nonsense ist...

Du könntest dir durch aus noch ein paar Gedanken zu deiner Code-Formatierung machen. Wie's besser geht, steht z.B. in dem StyleGuide [http://www.delphi-treff.de/object-pascal/delphi-styleguide/] auf Delphi-Treff.de


user profile iconPandax3 hat folgendes geschrieben Zum zitierten Posting springen:
Ist es möglich eine Procedure noch einmal von vorne aufzurufen?

Meinst du, dass sich eine Funktion selbst wieder aufruft, also rekursiv [http://de.wikipedia.org/wiki/Rekursive_Programmierung]?
Meine Glaskugel ist gerade etwas trübe. Am besten erstellst du eine neues(!) Topic und erläuterst dein Problem etwas ausführlicher(!). :zustimm:


Pandax3 - Fr 11.03.11 15:28

ich würde nicht sagen das die schleife non-sense ist ;)
anders würde das programm nich laufen ;)

ja ich meine das die sich von selbst wieder aufruft ;D
dafür möcht ich jetzt aber kein neues topic erstellen ;) und hier alles zu spammen :D


Marc. - Fr 11.03.11 15:37

user profile iconPandax3 hat folgendes geschrieben Zum zitierten Posting springen:
ich würde nicht sagen das die schleife non-sense ist ;)

Ich würde das Problem vermutlich anders lösen, aber beim schnellen Überfliegen habe c[] falsch interpretiert. Selbstverständlich finde ich deinen Code nicht - anyway. :roll:

user profile iconPandax3 hat folgendes geschrieben Zum zitierten Posting springen:
ja ich meine das die sich von selbst wieder aufruft ;D
dafür möcht ich jetzt aber kein neues topic erstellen ;) und hier alles zu spammen :D

Im Gegenteil. Dadurch das du hier nur zwei Themen mischst, haben später andere User mit den gleichen Problemen das Vergnügen die Antwort im Wirr von Fragen zu entdecken.
Wo ist das Problem ein Topic zu einer konkreten Frage zu eröffnen, sofern diese bisher noch nicht diskutiert wurde (Suche). :nixweiss:


Pandax3 - Fr 11.03.11 15:45

na gut wenn du meinst ;D dann kann das hier geschlossen werden :O