TStringGrid
-
Habe gelesen dass sich einige hier schon mit dem TStringGrid beschäftigt haben. Wollte mal fragen ob man bestimmte Zeilen oder Spalten Sperren kann oder ob man spieziell nur auf bestimmte Zeilen oder Spalten zugreifen kann. Möchte ja etwas per Hand später im Programm eingeben können. Sollten aber immer nur die lezten Spalten sein.
-
Hallo
Mit dem Event TStringGrid::OnSelectCell auswerten, ob aktuelle Auswahl bearbeitet werden kann, und entsprechend TStringGrid::Options setzen.
bis bald
akari
-
Hey, danke für den Tip.
Soweit, so gut. Leider funktioniert das noch nicht ganz. Was habe ich vergessen?void __fastcall TForm_Main::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect) { if (ACol == 2) { StringGrid1->EditorMode = true; } }
-
Hallo,
1. Was funktioniert nicht. Korrekte Fehlerbeschreibungen sind wichtig.
2. Ist bei Options goEditing und nicht goAlwaysShowEditor gesetzt?
-
Wie akari schon geschrieben hat: TStringGrid::Options, goEditing bestimmt, ob das Grid bearbeitet werden kann.
-
Danke für die Schnellen Antworten. Leider möchte ich ja nur die letzte Spaltenreihe des StringGrids bearbeiten. Sobald ich
void __fastcall TForm_Main::STringGrid1SelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect) { if (ACol == 2) { STringGrid1->EditorMode = true; STringGrid1->Options << goEditing; } }In den Quelltext einfüge ist es ja so, dass ich bei einmaliger anwahl der zweiten Spaltenreihe, grundsätzlich alle Zellen geändert werden können.
Wenn ich allerdingsSTringGrid1->Options >> goEditing;wieder einfüge, kann ich nichts ändern. Gibt es dort einen Tip von euch, wie ich eine ganze Spaltenreihe ändern kann und den Rest nicht?
-
Nein Du kannst immer nur das komplette Grid editierbar machen. Wo ist denn das Problem? Abhänging von der Spalte, in die der User klickt, machst Du das Grid editierbar, oder eben nicht editierbar.
void __fastcall TForm_Main::STringGrid1SelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect) { if (ACol == 2) StringGrid1->Options << goEditing; else StringGrid1->Options >> goEditing; }
-
Hallo
Die Bedingung hat natürlich zwei Seiten. Desweiteren ist das mit dem "reinschieben" von Werten in VCL-Properties nicht so einfach.
void __fastcall TForm_Main::STringGrid1SelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect) { if (ACol == 2) { StringGrid1->EditorMode = true; StringGrid1->Options = StringGrid1->Options << goEditing; } else { StringGrid1->EditorMode = false; StringGrid1->Options = StringGrid1->Options >> goEditing; } }bis bald
akari
-
Ach klar,
danke euch. Da hätte ich ja drauf kommen müssen.
-
StringGrid1->Options = StringGrid1->Options << goEditing;Zu meiner eigenen großen Überraschung funktioniert es in diesem Fall auch ohne die Zuweisung, also so, wie ein meinem Beispiel. Zumindest im BCB6.
-
Hallo
Hm, im BCB5 gehts auch ohne extra Zuweisung... erstaunlich.
bis bald
akari
-
Habe nun ein weiteres Problem, welches ich nicht ganz beheben kann.
Möchte ja nun die einegegeben Werte Überprüfen ob sie
1. Zahlen Werte sind
2. Nicht unter bzw. über einen Wertebereich kommen.In einem meiner Verusche habe ich dieses hier probiert. Leider völlig blöde und unpraktisch. Zusätzlich auch noch fehlerhaft.
void __fastcall TForm_Main::STringGrid1SetEditText(TObject *Sender, int ACol, int ARow, const AnsiString Value) { if (Value < 0 || Value >1) { STringGrid1->Cells[ACol][ARow] = "0"; } }Hat jemand von euch ein Tip oder ein Beispiel?
-
Hallo
siehe die Funktion StrToIntDef in der BCB-Hilfe
bis bald
akari
-
Klasse, das war ein guter Tip.
Danke dir.
-
Das ist mir shon fast peinlich, aber ich habe noch eine, für euch, einfache Frage.
Ich möchte nun die Anzahl der einzugebenen Zeichen auf eins beschränken und gleichzeitig verhindern das Buchstaben eingegben werden könnnen.
Könntet ihr mir dabei nochmal helfen? Verspreche, ich werde versuchen dann nicht mehr fragen.
Das ganze muss wohl bei 'OnSetEditText' passieren?
-
Hallo
Siehe den Event TStringGrid::OnGetEditMask. Dort gibst du eine Maske an, wie du es bei TMaskEdit machen würdest.
bis bald
akari