Ograniczenie długości tekstu w stringGrid

0

Jak ograniczyć długość wprowadzanego tekstu do komórek StringGrida, tak aby można było wprowadzić np 3 znaki.

0

procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin

  if Length(StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]) => 3 then
    Key := #0;

end;

0

W zdarzeniu OnDrawCell wrzuć sobie:

   with StringGrid1 do
      Cells[Col, Row] := LeftStr(Cells[Col, Row], 3);

Pzdr.

0

Dzięki za odpowiedzi. Jednak mam kolejny problem.
Dla tego kodu:

procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin

  if Length(StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]) >= 3 then
    Key := #0;

end;

Po wpisaniu trzech znaków niemożna zmodyfikować komórki. Ja natomiast potrzebuje wpisać trzy znaki, a następnie przy wpisywaniu następnych żeby nadpisywały poprzednie.Coś w stylu overwrite, tak jak po wcisnieciu przycisku insert w różnych edytorach tekstu.

Natomiast w drugim kod, ogranicza długość tekstu dopiero po powtórnym kliknięciu na komórkę.Czy może ja coś robię nie tak. ;-)

0
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin

if Length(StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]) >= 3 then 
begin
  StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]:=copy(StringGrid1.Cells[StringGrid1.Col,  StringGrid1.Row],2,2)+key;
  Key := #0;
end;
end;
0

Dzięki wszystkim.
Niestety powyższe rozwiązanie dodaje kolejny znak na końcu tekstu danej komórki kasując pierwszy znak w tekście. Chodziło mi o coś innego, znaczy zastępowanie następnego znaku za kursorem.
Korzystając z FAQ i waszych propozycji otrzymałem coś działającego :-) .
Może się komuś przyda.

procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin

if GetStringGridCursorPos(StringGrid1)>=3 then Key := #0;;
if Length(StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]) >= 3 then
    SetStringGridSelText(StringGrid1,GetStringGridCursorPos(StringGrid1),1);

end;

procedure SetStringGridSelText(SG:TWinControl;SelStart,SelLength:Integer);
var
  Wnd:Integer;
begin
  Wnd:=GetWindow(SG.Handle,GW_CHILD);
  SendMessage(Wnd,EM_SETSEL,SelStart,SelStart+SelLength);
  SG.SetFocus;
end;


function GetStringGridCursorPos(SG:TWinControl):Integer;
var
  Wnd:Integer;
begin
  Wnd:=GetWindow(SG.Handle,GW_CHILD);
  SendMessage(Wnd,EM_GETSEL,Integer(@Result),0);
end;


Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1