Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   StringGrid Fehlermeldung (https://www.delphipraxis.net/194184-stringgrid-fehlermeldung.html)

lucy 25. Okt 2017 23:17

StringGrid Fehlermeldung
 
Fehlermeldung : Gitterindex außerhalb des zulässigen Bereichs.

Wenn der Button ausgeführt wird, kommt die Fehlermeldung! (StringGrid mit 7 Spalten)

Delphi-Quellcode:
function SeekRecord(Grid: TStringGrid; ColOrder: array of integer;
  StrList: array of String): Boolean;
 var
  i: integer;
  j: integer;
begin
 result := false;
  for i := 1 to Grid.RowCount - 1 do
   begin
    for j := low(ColOrder) to high(ColOrder) do
     begin
      if (Grid.Cells[ColOrder[J],I]=StrList[J]) then
       result := true
      else
       result := false;
      if result = false then break;
     end;
      if result = true then break;
   end;
 if result = false then
  Grid.Row := i
 else
  ShowMessage('Datensatz gefunden!');
  //GridDeleteRow(Grid, i);
 if result = true then
  Grid.Row := i
 else
  ShowMessage('Datensatz nicht gefunden!');
end;
Delphi-Quellcode:
procedure TForm1.BitBtn7Click(Sender: TObject);
begin
  SeekRecord(StringGrid1,[2],['1508972155']);
end;

Glados 26. Okt 2017 00:12

AW: StringGrid Fehlermeldung
 
Versuch es mal so

Delphi-Quellcode:
 function SeekRecord(Grid: TStringGrid; ColOrder: TArray<Integer>; StrList: TArray<string>): Boolean;
 var
  i, j: Integer;
 begin
  Result := False;

  for i := 1 to Grid.RowCount - 1 do
   begin
    for j := Low(ColOrder) to High(ColOrder) do
     begin
      Result := (Grid.Cells[ColOrder[j], i] = StrList[j]); // Das ist kürzer

      if Result then // niemals auf true oder false prüfen! eher so: if Result then
       Break;
     end;

    if Result then
     Break;
   end;

  if not Result then // "if Result = False" => "if not Result"
   ShowMessage('Datensatz nicht gefunden!')
  else
   ShowMessage('Datensatz gefunden!');
 end;
Deine Fehlermeldung kam übrigens dort bei der Zuweisung von i.
Delphi-Quellcode:
if result = false then
  Grid.Row := i
 else
  ShowMessage('Datensatz gefunden!');
  //GridDeleteRow(Grid, i);
 if result = true then
  Grid.Row := i
 else
  ShowMessage('Datensatz nicht gefunden!');

bcvs 26. Okt 2017 07:19

AW: StringGrid Fehlermeldung
 
Zitat:

Zitat von lucy (Beitrag 1384176)
Fehlermeldung : Gitterindex außerhalb des zulässigen Bereichs.

Delphi-Quellcode:
 if result = true then
  Grid.Row := i
 else
  ShowMessage('Datensatz nicht gefunden!');
end;

Laut Spezifikation ist die Schleifenvariable nach Beendigung der Schleife undefiniert:
http://docwiki.embarcadero.com/RADSt...t_sein_(Delphi)

Du darfst also das i nicht nach der Schleife verwenden. Also entweder die Schleife zu einer while-Schleife umbauen oder das i in der Schleife an geeigneter Stelle in einer Extra-Variablen merken und diese dann dem Grid.Row zuweisen.

matashen 26. Okt 2017 07:28

AW: StringGrid Fehlermeldung
 
ich würd hier eher eine whileschleife bauen, break ist nicht so schön
quick and dirty ungetestet

i:=1;
j:=Low(ColOrder);
while (i< Grid.RowCount -1) and not result do
begin;
while (j< High(ColOrder) and not result do
begin
Result := (Grid.Cells[ColOrder[j], i] = StrList[j]); // Das ist kürzer
inc(j);
end;
inc(i);
end;

nahpets 26. Okt 2017 10:25

AW: StringGrid Fehlermeldung
 
Oder so in der Art? (nur hingedaddelt, nicht getestet):
Delphi-Quellcode:
function SeekRecord(Grid: TStringGrid; ColOrder: array of integer;
  StrList: array of String): Boolean;
var
  i: integer;
  j: integer;
begin
  result := false;
  for i := 1 to Grid.RowCount - 1 do begin
    Grid.Row := i;
    for j := low(ColOrder) to high(ColOrder) do begin
      result := (Grid.Cells[ColOrder[J],I] = StrList[J]);
      if not result then break;
    end;
    if result then break;
  end;
  ShowMessage(Format('Datensatz %sgefunden',[IfThen(Result,'','nicht ')]));
  //GridDeleteRow(Grid, i);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz