Autor Beitrag
hanswurst0815
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 07.05.12 18:54 
Hallo habe 2 Stringgrids und in diesen sind dateien aufgelistet...
nun möchte ich das die 2 stringgrids verglichen werden und alle einträge die in stringgrid 1 und stringgrid2 vorhanden sind in stringgrid1 gelöscht werden.

wenn ich diesen code nutze dann hab ich das problem das er nicht alle einträge abarbeitet es fehlen immer die letzten 2 und wenn ich das danach mehrmals mache dann behält stringgrid 1 noch inhalt der auch in stringgrid2 bereits vorhanden ist...


ausblenden 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:
    i := 0;
    repeat
      if length(stringgrid1.Cells[10,i]) < 2 then
      griddelrow(i,stringgrid1);
      i := i+1;
    until i = stringgrid1.rowcount;


    c:= stringgrid2.RowCount +1;
    i := stringgrid1.RowCount +1;
    repeat
      begin
      r := -1;
      repeat
      begin
     r := r + 1;
        if sametext(stringgrid2.Cells[4,c], stringgrid1.Cells[4,r]) then begin
          GridDelRow(r,StringGrid1);
      end
      else
      end;
         until r = stringgrid1.RowCount-1;
         c := c-1;
         form1.Refresh;
        end;
      until c = 0;


Moderiert von user profile iconMartok: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconMartok: Topic aus Algorithmen, Optimierung und Assembler verschoben am Mo 07.05.2012 um 21:42
Moderiert von user profile iconNarses: Titel geändert,war: "Probleme mit 2 Stringgrinds".
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 08.05.2012 um 08:39
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 07.05.12 20:14 
Das hast du im Prinzip auch so programmiert.
Du hast deine Zähler und deine Lösch-Prozedur.
Wenn du eine Zeile löscht, rücken die folgenden Zeilen nach und zählst trotzdem weiter. Dadurch überspringst du eine Zeile.

Bei solchen Problemen habe ich mir angewöhnt, die Listen (in deinem Fall die Stringgrids) rückwärts zu durchlaufen. Dadurch kann das nachrücken der Zeilen nicht zum überspringen führen.

Es geht natürlich auch anders, in dem du den entsprechenden Zähler nicht inkrementierst, wenn du eine Zeile löscht, aber das führt nur zu unnötigen Vergleichen im Quelltext. Außerdem kannst du das ganze dann auch elegant mit For-Schleifen lösen, die runterzählen. Also statt for .. to einfach for .. downto nehmen.


Zuletzt bearbeitet von jasocul am Di 08.05.12 08:26, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: hanswurst0815
hanswurst0815 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 07.05.12 20:29 
bei der for schleife habe ich das problem das es immer zur fehlermeldung kommt da ich ja zeilen lösche

z.b.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
for i := 0 to stringgrind1.rowcount do
begin
  if xy = true
  then grinddelrow(i,stringgrind1);
  weitere anweisungen
end;


da habe ich ja das problem das ich zeilen ja lösche und der counter ja noch weiter zählt ich kann ja in der schleife auch nicht sagen das er die schleife nicht mehr so oft durchlaufen soll


edit:

bei downto gitterindex außerhalb des zulässigen bereichs


habs jetzt so und ich find den fehler nicht

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
for c := stringgrid2.rowcount downto 0 do
begin
  for r := stringgrid1.RowCount downto 0 do
  begin  
    if sametext(stringgrid2.Cells[4,c], stringgrid1.Cells[4,r]) then begin
      GridDelRow(r,StringGrid1);
      end
    else
    end;
  form1.Refresh;
end;


hab vorher nie mit stringgrids gearbeitet und ist auch ewig her das ich ein wenig was mit delphi mache denke es ist nur eine dumme kleinigkeit aber find den fehler leider nicht

Moderiert von user profile iconMartok: Code- durch Delphi-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 07.05.12 20:53 
Erstens würde ich dringend dazu raten die Daten zuerst aus den StringGrids heraus in TStringLists einzulesen und dort zu bearbeiten. Das beschleunigt das ganze enorm und ist zudem einfacher. Danach kannst du diese TStringLists ja wieder in die StringGrids ausgeben.

Zweitens kannst du von hinten nach vorne durchgehen, dann ist es egal, ob du die bearbeitete Zeile löschst:
ausblenden Delphi-Quelltext
1:
2:
for i := StringGrid1.RowCount - 1 downto 0 do
...

Für diesen Beitrag haben gedankt: hanswurst0815
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 08.05.12 08:25 
Wie user profile iconjaenicke schon schreibt, musst du natürlich bei RowCount-1 anfangen. Du hast in deinem Code bei RowCount angefangen.
Vermutlich gibt es auch ein Problem, wenn du bis "0" runterzählst, da in Zeile "0" Überschriften stehen könnten. Die dürften in beiden StringGrids gleich sein und somit zu einer Löschaktion führen.

Für diesen Beitrag haben gedankt: hanswurst0815
hanswurst0815 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 08.05.12 17:33 
jetzt habe ich keine fehlermeldung mehr muss jedoch 4 durchgänge machen damit er alles in stringgrid2 hat und dann hat er auch noch ein paar duplikate von der 3 zeile meine ich

ausblenden 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:
  for c := stringgrid2.rowcount -1 downto 1 do
    begin
      for r := stringgrid1.RowCount -1 downto 0 do
      if sametext(stringgrid2.Cells[4,c], stringgrid1.Cells[4,r]) then
        GridDelRow(r,StringGrid1);
    form1.Refresh;
  end;


  for r := stringgrid1.RowCount -1 downto 1 do
    if length(stringgrid1.Cells[10,r]) > 2 then begin
      datei := stringgrid1.Cells[4,r];
      download1 := stringgrid1.Cells[10,r];
      stringgrid2.RowCount := stringgrid2.RowCount+1;
      i := stringgrid2.RowCount+1;
    //  download(download1, ExtractFilePath(ParamStr(0))+datei);
          stringgrid2.Cells[0,i] := stringgrid1.Cells[0,r];
          stringgrid2.Cells[1,i] := stringgrid1.Cells[1,r];
          stringgrid2.Cells[2,i] := stringgrid1.Cells[2,r];
          stringgrid2.Cells[3,i] := stringgrid1.Cells[3,r];
          stringgrid2.Cells[4,i] := stringgrid1.Cells[4,r];
          stringgrid2.Cells[5,i] := stringgrid1.Cells[5,r];
          stringgrid2.Cells[6,i] := stringgrid1.Cells[6,r];
          stringgrid2.Cells[7,i] := stringgrid1.Cells[7,r];
          stringgrid2.Cells[8,i] := stringgrid1.Cells[8,r];
          stringgrid2.Cells[9,i] := stringgrid1.Cells[9,r];
          stringgrid2.Cells[11,i] := stringgrid1.Cells[11,r];
          stringgrid2.Cells[10,i] := 'Downloaded xD';
          griddelrow(r,stringgrid1);
    end;


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt

Moderiert von user profile iconNarses: Beiträge zusammengefasst

edit:

hab noch ein wenig dranne rumgebastelt und es geschafft vielen dank euch allen und thx für die denkanstöße.