| Autor |
Beitrag |
hirsch
      
Beiträge: 31
|
Verfasst: Mi 23.11.11 16:22
Hallo,
ich habe aus einer Tabelle die Daten in Tstringgrid geschrieben.
Diese werden nun bewertet. In den zu löschenden Zeilen steht dann 'nicht gefunden'.
Diese Zeilen wo nicht gefunden vorkommt sollen von der nächsten (darauf folgenden )Zeile überschrieben werden. (so wollte ich das eigentlich).
Mein Code jedoch macht das NUR wenn die nächste Zeile NICHT enthällt:'nicht gefunden'.
Wo habe ich den Kurzschluß?
Achja Gex ist das Stringrid.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| for i := 1 to Gex.RowCount do begin if (Trim(gex.Cells[3,i])='nicht gefunden') or (Trim(gex.Cells[4,i])='nicht gefunden') or (Trim(Gex.Cells[3,i])='mehrere')or (Trim(Gex.Cells[4,i])='mehrere') then begin for ii := i to Gex.RowCount-i do begin gex.Cells[1,ii]:=gex.Cells[1,ii+1]; gex.Cells[2,ii]:=gex.Cells[2,ii+1]; gex.Cells[3,ii]:=gex.Cells[3,ii+1]; gex.Cells[4,ii]:=gex.Cells[4,ii+1]; gex.Cells[5,ii]:=gex.Cells[5,ii+1]; end; gex.Cells[0,ii]:=''; gex.Cells[1,ii]:=''; gex.Cells[2,ii]:=''; gex.Cells[3,ii]:=''; gex.Cells[4,ii]:=''; gex.Cells[5,ii]:=''; end; end; |
|
|
jaenicke
      
Beiträge: 19338
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 23.11.11 17:53
Also das sieht mir doch wieder nach einem typischen Fall einer Frage nach einer Lösung für ein Problem, das aber eigentlich nur eine Notlösung für ein ganz anderes Problem ist.
Was willst du denn eigentlich? Du willst, wenn ich das recht verstanden habe, Dateisätze verarbeiten und ggf. welche daraus entfernen. Das Endergebnis soll das angezeigt werden. Soweit richtig?
Wenn ja, dann ist der Fehler, dass du die Daten vor der Verarbeitung in das TStringGrid packst. Das ist aussschließlich zur Anzeige oder Dateneingabe da und nicht um die Daten dort zu speichern und weiterzuverarbeiten.
Also:
Lese die Daten in eine Objektliste aus, ab Delphi 2009 eine generische. Mit dieser Liste kannst du dann arbeiten. Und danach packst du die resultierenden Daten in das TStringGrid.
Soll dagegen der Benutzer in dem Grid vor der Verarbeitung noch etwas ändern sollen, dann lese die Daten aus, zeige sie an, lese sie dann wieder aus dem Grid, verarbeite sie und zeige sie wieder im Grid an.
Winziges Beispiel, kurz im Browser getippt: 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: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76:
| type TMyData = class private FValue1: string; FValue2: string; FKey: string; public constructor Create(const AKey, AValues: string); property Key: string read FKey; property Value1: string read FValue1; property Value2: string read FValue2; end;
procedure ...; const cCorrectValue1 = 'e'; cColumnIndexKey = 0; cColumnIndexValue1 = 1; cColumnIndexValue2 = 2; var i: Integer; SourceList: TStringList; DataList: TObjectList<TMyData>; begin SourceList := TStringList.Create; try SourceList.Add('a=b,c'); SourceList.Add('f=e,asc'); SourceList.Add('z=e,cdsd'); SourceList.Add('g=ggx,sdfsd'); SourceList.Add('e=wer,c'); SourceList.Add('w=32rwer,dsf');
DataList := TObjectList<TMyData>.Create(True); try for i := 0 to SourceList.Count - 1 do DataList.Add(TMyData.Create(SourceList.Names[i], SourceList.ValueFromIndex[i]));
for i := DataList.Count - 1 downto 0 do if DataList[i].Value1 <> cCorrectValue1 then DataList.Delete(i);
stgDisplay.RowCount := DataList.Count; for i := 0 to DataList.Count - 1 do begin stgDisplay.Cells[cColumnIndexKey, i] := DataList[i].Key; stgDisplay.Cells[cColumnIndexValue1, i] := DataList[i].Value1; stgDisplay.Cells[cColumnIndexValue2, i] := DataList[i].Value2; end; finally DataList.Free; end;
finally SourceList.Free; end; end;
constructor TMyData.Create(const AKey, AValues: string); var SeparatorPos: Integer; begin FKey := AKey; SeparatorPos := Pos(',', AValues); FValue1 := Copy(AValues, 1, SeparatorPos - 1); FValue2 := Copy(AValues, SeparatorPos + 1, MaxInt); end; |
|
|
hirsch 
      
Beiträge: 31
|
Verfasst: Fr 25.11.11 08:27
Hallo jaenicke,
ja, vielen Dank für Deine Mühe, mir das zu erklären.
Vielleicht bin ich das Ganze etwas zu naiv angegangen. Das liegt aber daran, dass ich noch ein bloddy beginner bin.
Deswegen bitte ich um Nachsicht.
Ok, was ich nun weiterhin gemacht habe:
Ich habe das Stringgrid in ein Array geschrieben. Dort habe ich das nun bearbeitet, und was mir einfällt, ich habe noch eine Routine gefunden die in einem Stringgrid zeilen löschen kann, das heisst es waren 3, wovon aber nur eine Einzige rigtig funktionierte.
Leider weiss ich nicht mehr von wem diese war, aber ich stelle sie mal, für Leute, die irgendwann wieder mal so ein Thema haben, ein:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| Procedure TForm1.StringgridDelete(Stringgrid:TStringGrid; Index:Cardinal); var FixedRows,i:integer; begin if Index<Stringgrid.RowCount then begin FixedRows:=Stringgrid.FixedRows; if Stringgrid.RowCount=FixedRows+1 then Stringgrid.Rows[FixedRows].Clear else begin if Stringgrid.RowCount>2 then begin for i:=Index to Stringgrid.RowCount-1 do Stringgrid.Rows[i]:=Stringgrid.Rows[i+1]; Stringgrid.RowCount:=Stringgrid.RowCount-1; end; end; end; end; |
|
|
|