Autor |
Beitrag |
hanswurst0815
Hält's aus hier
Beiträge: 3
|
Verfasst: Mo 07.05.12 18:54
|
|
jasocul
Beiträge: 6386
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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
Hält's aus hier
Beiträge: 3
|
Verfasst: 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.
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
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 Martok: Code- durch Delphi-Tags ersetzt
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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: Delphi-Quelltext 1: 2:
| for i := StringGrid1.RowCount - 1 downto 0 do ... |
Für diesen Beitrag haben gedankt: hanswurst0815
|
|
jasocul
Beiträge: 6386
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Di 08.05.12 08:25
Wie jaenicke 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
Hält's aus hier
Beiträge: 3
|
Verfasst: 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
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; 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 Narses: Code- durch Delphi-Tags ersetztModeriert von Narses: Beiträge zusammengefasstedit:
hab noch ein wenig dranne rumgebastelt und es geschafft vielen dank euch allen und thx für die denkanstöße.
|
|
|