![]() |
StringGrid Zellentext auf 50 Bytes begrenzen
Hallo Zusammen,
ich nutze folgenden Code, um in Zellen einer StringGrid-Spalte die Eingabe auf 50 Zeichen zu begrenzen:
Delphi-Quellcode:
Funktioniert soweit wunderbar.
THackedStringGrid = class(TStringGrid);
procedure TMainForm.StringGrid_InfoTextGetEditText(Sender: TObject; ACol, ARow: Integer; var Value: string); begin If ARow > 0 then begin //3. Spalte If ACol in [2] then begin SendMessage(THackedStringGrid(StringGrid_InfoText).InplaceEditor.Handle, EM_SETLIMITTEXT, 50, 0); end; end; end; Nur bräuchte ich diese Begrenzung nicht für 50 Zeichen, sondern für 50 Bytes. Hintergrund: Der Text der in den Zeilen steht, wird per UDP an einen ESP geschickt. Umlaute benötigen im ESP 2 Bytes. Delphi zählt Umlaute aber als 1 Zeichen. Folgender Beispieltext zählt 50 Zeichen, aber im ESP 51 Bytes. Zitat:
Wie kann ich das realisieren? |
AW: StringGrid Zellentext auf 50 Bytes begrenzen
Zitat:
Delphi-Quellcode:
var
str: string; encoding: TEncoding; bytes: TArray<Byte>; len: Integer; begin str := 'Das ist ein langer Text mit genau fünfzig Zeichen!'; encoding := TEncoding.UTF8; bytes := encoding.GetBytes(Str); len := Length(bytes); // Ergebnis 51 str := 'Das ist ein langer Text mit genau funfzig Zeichen!'; // ü-> u bytes := encoding.GetBytes(Str); len := Length(bytes); // Ergebnis 50 |
AW: StringGrid Zellentext auf 50 Bytes begrenzen
Vielleicht in
Delphi-Quellcode:
:?:
THackedStringGrid(StringGrid_InfoText).InplaceEditor.OnChange
|
AW: StringGrid Zellentext auf 50 Bytes begrenzen
Zitat:
Delphi-Quellcode:
type GermanString = type AnsiString(1252);
var bytes: TArray<Byte>; len: Integer; begin var Utf8Str:String := 'Das ist ein langer Text mit genau fünfzig Zeichen!'; var Utf8Encoding := TEncoding.UTF8; bytes := Utf8Encoding.GetBytes(Utf8Str); len := Length(bytes); // Ergebnis 51 Showmessage(len.tostring); var Ansistr:GermanString := 'Das ist ein langer Text mit genau fünfzig Zeichen!'; var AnsiEncoding := TEncoding.ANSI; bytes := AnsiEncoding.GetBytes(Ansistr); len := Length(bytes); // Ergebnis 50 Showmessage(len.tostring); |
AW: StringGrid Zellentext auf 50 Bytes begrenzen
Hallo und Danke für die Antworten.
Hab es nun wie folgt gelöst:
Delphi-Quellcode:
procedure TMainForm.StringGrid_InfoTextSetEditText(Sender: TObject; ACol,
ARow: Integer; const Value: string); const max_Bytes = 50; var Encoding: TEncoding; Bytes: TArray<Byte>; len_Bytes: Integer; max_Chars: Integer; begin max_Chars := 50; If ARow > 0 then begin //3. Spalte If ACol in [2] then begin Encoding := TEncoding.UTF8; Bytes := Encoding.GetBytes(Value); len_Bytes := length(Bytes); If len_Bytes > max_Bytes then begin max_Chars := length(Value); THackedStringGrid(Sender).Selection := TGridRect(Rect(-1,-1,-1,-1)); THackedStringGrid(Sender).Cells[ACol, ARow] := copy(Value, 1, max_Chars - 1); end; //Eingabe begrenzen SendMessage(THackedStringGrid(Sender).InplaceEditor.Handle, EM_SETLIMITTEXT, max_Chars, 0); end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz