Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Länge des Inhalts einer StringGrid Zelle beschränken
oroblram - Mo 24.04.06 13:29
Titel: Länge des Inhalts einer StringGrid Zelle beschränken
Hallo zusammen.
Ich habe ein Stringgrid, bei dem die Zellen editierbar sind (goEditing -> true).
Wenn die User etwas in einer Stringgrid-Zelle ändern, soll die Länge z.B. auf 10 beschränkt sein. Wie stell ich das an?
Sy- - Mo 24.04.06 14:35
Hi!
Ich hab da den folgenden Script gebastelt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string); var bis:integer; begin bis:=10;
if(length(tstringgrid(sender).Cells[acol,arow])>=bis)then begin tstringgrid(sender).Cells[acol,arow]:=copy(tstringgrid(sender).Cells[acol,arow],1,bis); tstringgrid(sender).enabled:=false; tstringgrid(sender).enabled:=true; end; end; |
Also auf dem "onSetEditText" des stringgrids.
Du kannst nun auch das bis von der Spalte (aCol) abhängig machen.
Gruß
Lannes - Mo 24.04.06 14:53
Hallo,
für solche Zwecke stellt SetEditText
Value zur Verfügung.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); var MaxCount : integer; begin MaxCount := 10; if Length(Value) > 10 then begin StringGrid1.Cells[ACol,ARow] := Copy(Value,1,10); StringGrid1.EditorMode := True; end; end; |
Wird dann noch mit EditorMode der Inplaceeditor wieder aktiviert,
ist die Eingabe in solche eingeschränkten Zellen komfortabler.
Sy- - Mo 24.04.06 15:01
hehe,
ich hab mich damals damit abgequält und hab nur editormode auf false versucht weil ich editormode:=true als unwirksam gesehen habe. :wink:
oroblram - Mo 24.04.06 15:26
Danke für eure Hilfe!
Hab die zweite Version gewählt und noch ein bisschen abgeändert, damit ich den einzelnen Spalten
unterschiedliche Werte geben kann.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); var MaxCount : integer; begin MaxCount := 10; if (Length(Value)) > 10 and (Stringgrid1.Col = 1) then begin StringGrid1.Cells[1,ARow] := Copy(Value,1,10); StringGrid1.EditorMode := True; end; end; |
Lannes - Mo 24.04.06 20:40
Hallo,
in meinem Code hab ich auf die schnelle die Variable
MaxCount deklariert und initialisiert, aber im nachfolgenden Code nicht verwendet :angel:
Der Code muss natürlich so aussehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); var MaxCount : integer; begin MaxCount := 10; if Length(Value) > MaxCount then begin StringGrid1.Cells[ACol,ARow] := Copy(Value,1,MaxCount); StringGrid1.EditorMode := True; end; end; |
oroblram hat folgendes geschrieben: |
Hab die zweite Version gewählt und noch ein bisschen abgeändert, damit ich den einzelnen Spalten
unterschiedliche Werte geben kann. |
hast Du in getestet :?:
Bei der Zeile :
Delphi-Quelltext
1:
| if (Length(Value)) > 10 and (Stringgrid1.Col = 1) then |
wird der Compiler die Meldung ausgeben:
Operator ist auf diesen Operandentyp nicht anwendbar
In dem Fall muss man die Klammern anders setzen und außerdem ist es besser bei ACol zu bleiben, denn das ist die Spalte in der Editiert wird.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); var MaxCount : integer; begin MaxCount := 10; if (Length(Value) > 10) and (ACol = 1) then begin StringGrid1.Cells[ACol,ARow] := Copy(Value,1,10); StringGrid1.EditorMode := True; end; end; |
Aber unterschiedliche Werte wirst Du den Spalten damit nicht zuweisen können.
Um bei einzelnen Spalten unterschiedliche Grenz-Werte anzusetzen, schlage ich den folgenden Code vor:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); var MaxCount : integer; begin with StringGrid1 do if ACol in [1,4] then begin case ACol of 1 : MaxCount := 5; 4 : MaxCount := 10; end; if Length(Value) > MaxCount then begin Cells[ACol,ARow] := Copy(Value,1,MaxCount); EditorMode := True; end; end; end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!