Autor Beitrag
hirsch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden volle Höhe 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
    // 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;
hirsch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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:


ausblenden 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;