Entwickler-Ecke
Sonstiges (Delphi) - In TStringGrid rekursiv verschieben
hirsch - Mi 23.11.11 16:22
Titel: In TStringGrid rekursiv verschieben
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 - 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:
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: 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 - 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; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!