TStringGrid markierte Zeilen in txt-Datei speichern / alle Zellen auswählen
-
ich habe eine StringGrid mit goRoSelect =true. Die ausgewählten Zeilen sollen per SaveDialog in eine txt-Datei gespeichert werden. Ich denke mal das beste ist diese in eine StringList zu speichern und die dann zu speichern. Wie mach ich das?
Frage2: wie kann ich alles auswählen? Ich möchte eine CheckBox "Alles Auswählen" die diese Funktion implementiert.
-
1. siehe FAQ
2. siehe einen Thread weiter unten
-
ah ok, danke. Alle Zellen auswählen und Auswahl deaktivieren funktioniert bereits, das hab ich so gelöst:
void __fastcall TF_Futterprotokoll::CheckBox_AlleMarkierenChange( TObject *Sender) { TGridRect myRect; if (CheckBox_AlleMarkieren->Checked) { myRect.Left = 0; myRect.Top = 1; myRect.Right = 4; myRect.Bottom = StringGrid1->RowCount-1; StringGrid1->Selection = myRect; } else { myRect.Top = myRect.Left = myRect.Right = myRect.Bottom = -1; StringGrid1->Selection = myRect; } }
wie man speichert war mir klar. Bei mir sollen aber nur die markierten Zeilen gespeichert werden. Wie komm ich an die markierten Zeilen ran? Mit CommaText find ich auch nicht so übersichtlich. Ich fänds besser wenn die Spalten durch Tabs in der Textdatei getrennt werden.
Kleine Zusatzfrage: man kann in meiner Tabelle per Checkbox in den Editiermodus wechseln. Wie kann ich ändern, dass er per Klick auf eine Zelle diese auswählt und gleichzeitig editiert? Im Moment muss man die Zelle erst auswählen und kann erst bei nochmaligen Klick editieren.
-
Du hast doch in myRect schon die Koordinaten im StringGrid. Die musst Du jetzt nur noch durchlaufen und in eine Datei schreiben. Dazu einfach zwei Schleifen verwenden einmal für die Reihen von bis und ebenso für die Spalten von bis.
AnsiString Seperator = "\t"; AnsiString CurLine; TStringList* slTemp = new TStringList(); for (int x = myRect.Top, x < myRect.Bottom, x++) { CurLine = ""; for (int y = myRect.Left, y < myRect.Right, x++) { if (!CurLine.IsEmpty()) CurLine = CurLine + Separator; CurLine = CurLine + StringGrid1->Cells[x][y]; } slTemp->Add(CurLine); } slTemp->SaveToFile("Datei.txt"); delete slTemp;
Code ungetestet... Aber das Prinzip dürfte klar werden.
-
ja Prinzip ist klar. Irgendwie klappts so nicht. Der Debugger zeigt mir, dass dann endlos \t am Ende angehängt wird. Ist eine Endlosschleife.
Ausserdem soll beim Klick auf eine Zeile diese ausgewählt bleiben um mehrere Zeilen auszuwählen.
-
Dir ist nicht aufgefallen, dass ich mich in der zweiten Schleife vertippt habe und ein x++, statt eines y++ geschrieben habe? Das könnte schon die Ursache sein.
Kann aber auch sein, dass x und y vertauscht sind, ich weiß nicht mehr in welcher Reihenfolge das in Cells[][] stehen muss. Ich hab auch im Moment auch keinen BCB hier ums nachzusehen. Kann auch sein, dass ich die Daten aus dem myRect falsch interpretiert habe. Spiel doch einfach mal ein bißchen damit rum.Ein bißchen mehr Eigeninitiative könntest Du schon zeigen...
-
ja spiel schon rum damit. Habs so ähnlich gemacht:
AnsiString zeilen = ""; AnsiString seperator = "\t"; TStringList* list = new TStringList; for (int i=0; i<StringGrid1->RowCount; i++) { for (int j=0; j<StringGrid1->ColCount; j++) { zeilen += StringGrid1->Cells[j][i] + seperator; } list->Add(zeilen); zeilen = ""; } if (SaveDialog_Export->Execute()) list->SaveToFile(SaveDialog_Export->FileName);
Das funktioniert erst mal. Nur werden hier halt alle Zellen gespeichert. Nun muss ich das noch ändern, dass nur ausgewählte Zeilen gespeichert werden. Problem ist aber, dass ich auch einzelne Zeilen auswählen will. Und das ohne gleichzeitiges Drücken der Strg-taste (wegen Touchscreen und PC ohne Tastatur).
-
habs zwar noch niht gelöst aber habe vielleicht einen Ansatz:
void __fastcall TF_Futterprotokoll::StringGrid1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { int xZelle, yZelle; StringGrid1->MouseToCell(X,Y,xZelle,yZelle); myRect.Left = 0; myRect.Left = 5; myRect.Top = yZelle; myRect.Bottom = yZelle; StringGrid1->Selection = myRect; }
jetzt müsste die Auswahl nur noch bleiben. Hab aber keine Idee mehr wie das gehen könnte.
-
Hallo,
Um einzelne Zeilen zu selektieren und zu erfassen( Stiftbedienung auf einem TabletPC z.B. ), würde ich ein Speedbutton nehmen.
Ist dieses down gedrückt, werden die gewünschten Zeilen angeklickt.
Diese Zeilen erfasst du in einem vector.
Später kannst du durch den vector iterieren, die Zeilen nacheinander in einer Schleife selektieren und weiterverarbeiten.