Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi StringGrid Zellentext auf 50 Bytes begrenzen (https://www.delphipraxis.net/216808-stringgrid-zellentext-auf-50-bytes-begrenzen.html)

Helmi 5. Mär 2025 13:40

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:
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;
Funktioniert soweit wunderbar.

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:

Das ist ein langer Text mit genau fünfzig Zeichen!
Daher würde ich gerne die Eingabe in der StringGrid-Zelle auf 50 Bytes begrenzen und nicht auf 50 Zeichen.

Wie kann ich das realisieren?

shebang 5. Mär 2025 15:08

AW: StringGrid Zellentext auf 50 Bytes begrenzen
 
Zitat:

Zitat von Helmi (Beitrag 1546845)
Wie kann ich das realisieren?

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

himitsu 5. Mär 2025 15:29

AW: StringGrid Zellentext auf 50 Bytes begrenzen
 
Vielleicht in
Delphi-Quellcode:
THackedStringGrid(StringGrid_InfoText).InplaceEditor.OnChange
:?:

QuickAndDirty 7. Mär 2025 10:19

AW: StringGrid Zellentext auf 50 Bytes begrenzen
 
Zitat:

Zitat von shebang (Beitrag 1546850)
Zitat:

Zitat von Helmi (Beitrag 1546845)
Wie kann ich das realisieren?

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

Würde es nicht alles prima funktionieren Ansi Encoding mit Codepage zu verwenden. Es muss halt nur die Codepage bekannt sein.

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

Helmi 7. Mär 2025 10:24

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