In TStringGrid rekursiv verschieben
spacer
Autor Nachricht
hirsch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Mi 23.11.11 17: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.
ausblenden Delphi-Quelltext markieren
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;
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15840
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Mi 23.11.11 18: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:
ausblenden volle Höhe Delphi-Quelltext markieren
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
// add example data
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');

// use data
DataList := TObjectList<TMyData>.Create(True);
try
// read data
for i := 0 to SourceList.Count - 1 do
DataList.Add(TMyData.Create(SourceList.Names[i], SourceList.ValueFromIndex[i]));

// filter data
for i := DataList.Count - 1 downto 0 do
if DataList[i].Value1 <> cCorrectValue1 then
DataList.Delete(i);

// display data
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;

{ TMyData }

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;
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
hirsch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Fr 25.11.11 09: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:


ausblenden Delphi-Quelltext markieren
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;
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home