Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Schleife mit Variable spuckt Müll aus


teamrocket0 - Fr 29.08.08 11:59
Titel: Schleife mit Variable spuckt Müll aus
So...eine Sache die ich mal absolut nicht verstehe.

In der folgenden Schleife wird in einem "StrinGrid" gesucht.
Erst Zeilen, dann Spalten.
Die Variable "iCol" soll an die Variable "Spalten" übergeben werden.
Haut aber nicht hin.

Ich habe mir zur Analyse die "showmessage" eingebaut. Die Variable "iCol" ist aber nicht die gleiche wie "Spalten"

Weiß einer wodurch das kommt?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Panel1Click(Sender: TObject);
    var iRow, iCol: integer;
begin
Spalten:=0;
for iRow := 0 to pred (Form1.StringGrid1.RowCount) do
  for iCol := 0 to pred (Form1.StringGrid1.ColCount) do
    if Form1.StringGrid1.Cells [iCol,iRow] = 'X' then
      Spalten:=iCol;
      Showmessage(inttostr(iCol) + 'iCol');
      Showmessage(inttostr(Spalten)+ 'Spalten');
      Showmessage(inttostr(iRow)+ 'iRow');
      Form1.ValueListEditorZeile(Spalten+1);
      Form1.Memo1.Lines.Add(Form3.ValueListEditor1.Cells[1,Zeilen]);
      Memo1.Lines.Text:=stringreplace(Form1.Memo1.Lines.Text,'*name*',Form1.StringGrid1.Cells[0,iRow],[rfReplaceAll ]);
      Zeilen:=0;
    end;


Die Variable "Spalten" wird in einer anderen Prozecur verarbeitet. Villeicht kann ich die später auch zusammenlegen!^^ Aber erst muss ich das hinbekommen das ich "iCol" kopiert bekomme!


Moderiert von user profile iconAXMD: Topic aus VCL (Visual Component Library) verschoben am Sa 30.08.2008 um 11:18


JDKDelphi - Fr 29.08.08 12:04
Titel: StringGrid
Hallo,

probier's mal mit BEGIN und END in den FOR-Schleifen und IF-Bedingungen..

Gruss


Gausi - Fr 29.08.08 12:11

Ich rück den Code mal so ein, wie er ausgeführt wird. Die Korrektur darfst du dann machen. ;-)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Panel1Click(Sender: TObject); 
    var iRow, iCol: integer; 
begin 
  Spalten:=0
  for iRow := 0 to pred (Form1.StringGrid1.RowCount) do 
    for iCol := 0 to pred (Form1.StringGrid1.ColCount) do 
      if Form1.StringGrid1.Cells [iCol,iRow] = 'X' then 
        Spalten:=iCol; 
  Showmessage(inttostr(iCol) + 'iCol'); 
  Showmessage(inttostr(Spalten)+ 'Spalten'); 
  Showmessage(inttostr(iRow)+ 'iRow'); 
  Form1.ValueListEditorZeile(Spalten+1); 
  Form1.Memo1.Lines.Add(Form3.ValueListEditor1.Cells[1,Zeilen]); 
  Memo1.Lines.Text:=stringreplace(Form1.Memo1.Lines.Text,'*name*',Form1.StringGrid1.Cells[0,iRow],[rfReplaceAll ]); 
  Zeilen:=0
end;


Nebenbei müsste der Compiler Warnungen ausspucken wie "Schleifenvariable nach Durchlauf undefiniert" oder so ähnlich.


JDKDelphi - Fr 29.08.08 12:17
Titel: Stringgrid
Hallo,

ich kann Gausi nur beipflichten..

Immer schön BEGIN und END-Schachtelungen verwenden.
Dient der Übersichtlichkeit und Funktionalität.

Gruss


Gausi - Fr 29.08.08 12:29

Naja, IMMER mit begin und end zu schachteln ist imho nicht nötig. Z.B. würde ich die innere for-Schleife nicht so einpacken, denn das ist ja für die äußere Schleife nur eine Anweisung. Aufpassen muss man natürlich, und das fällt einem leichter, wenn man sich eine korrekte Einrückung der Codezeilen angewöhnt. ;-)


JDKDelphi - Fr 29.08.08 12:33
Titel: StringGrid
Hallo Gausi,

Du hast recht. Man braucht's nicht immer, das BEGIN-END..
Ich mach' das aus Gewohnheit so.
Vielleicht kommt's aus meiner C-Vergangenheit

Gruss


teamrocket0 - Fr 29.08.08 22:30

Huha BAAAAM...das ist ja mal wieder nicht zu fassen.
Ach, ich bin eben kein Programmierer!^^
Das lern ich wohl nicht mehr...

Aber egal...ich konnte mein Problem lösen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Panel1Click(Sender: TObject);
    var iRow, iCol: integer;
begin
Spalten:=0;
for iRow := 0 to pred (Form1.StringGrid1.RowCount) do begin
  for iCol := 0 to pred (Form1.StringGrid1.ColCount) do begin
    if Form1.StringGrid1.Cells [iCol,iRow] = 'X' then  begin
      Spalten:=iCol;
      Showmessage(inttostr(iCol) + 'iCol');
      Showmessage(inttostr(Spalten)+ 'Spalten');
      Showmessage(inttostr(iRow)+ 'iRow');
      Form1.ValueListEditorZeile(Spalten);
      Form1.Memo1.Lines.Add(Form3.ValueListEditor1.Cells[1,Zeilen]);
      Memo1.Lines.Text:=stringreplace(Form1.Memo1.Lines.Text,'*name*',Form1.StringGrid1.Cells[0,iRow],[rfReplaceAll ]);
      Zeilen:=1;
      end;
    end;
  end;
end;


Ich hoffe die formatirung ist so angenehm!^^
Damals in der Berufschule wurde das nicht gelert. Aber Programmirung stand da ja auch nur am Rande...

Meine selbst gebastelte Procedur "Form1.ValueListEditorZeile(Spalten)" lass ich erstmal so stehen...es haut hin und das reicht mir erhlich gesagt auch schon!^^ Vorerst. Aufgeräumt wird später! :-)

Besten Dank an "JDKDelphi" und "Gausi"(mal wieder :P ) für den unschlagbaren Tipp.

Auf Bald, wenn es wieder heißt "WAS? WAS HAST DU PROGRAMMIERT?"^^