Non saprei cosa suggerirti se non un banale check ogni volta che si digita qualcosa all'interno del TMemo.
Ma immagino sia la tua ultima opzione. :-\
Infatti, è quello che ho provato a fare. Ho inserito questo codice:
procedure limita_righe_dbmemo(sender: tobject; max_lines: integer; var key: char);
begin
with Sender as Tdbmemo do
begin
if (CaretPos.Y >= max_lines) then
Key := #0;
if (key = CHR(13)) and (Lines.count >= max_lines) then
Key := #0;
end;
end;
procedure Tform1.DBMemo1KeyPress(Sender: TObject; var Key: char);
begin
limita_righe_dbmemo(sender,4,key)
end;
Ma non funziona bene.
Con TMemo questo mi sembrava funzionare
procedure TForm1.Memo1Change(Sender: TObject);
begin
while Memo1.Lines.Count > 5 do
Memo1.Lines.Delete(Memo1.Lines.Count -1);
end;
non so se è applicabile con DBMemo, non l'ho mai usato.
ok, ritorno sui tuoi passi allora:
uses
LCLType;
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Memo1.Lines.Count >= 5) and (Key = VK_RETURN) then
begin
Key := VK_ESCAPE;
end;
end;
dovremmo esserci.
C'è da capire se VK_ESCAPE è il tasto più appropriato e gestire un eventuale "paste" che sfora il numero massimo di righe.
Sto andando a tentoni se non si fosse capito ;)
EDIT: alla fine non mi sembra di aver fatto progressi rispetto al tuo codice. Vediamo cosa ti suggeriscono gli altri utenti.
Dovete usare l'evento "keypress":
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
if key = #8 then // <- lascia usare il backspace (modificato)
exit;
if Memo1.Lines.Count > 6 then
Key := #0;
end;
L'evento viene generato per tutto ciò che è carattere o "stampabile" (compreso il "ritorno" a capo #13 e il "CTRL-C" #3) anche in caso di copia / incolla.
Il tasto DEL, le frecce, etc ... non vengono filtrati quindi può essere usato per cancellare caratteri, così come una selezione. Se si vuole migliorare si può controllare se il carattere è un "backspace" e lasciarlo passare ...
P.S.: porre nell'evento keydown un qualsiasi valore (ad esempio 0) non ha effetto se il contenuto è un carattere, in quanto Windows genera automaticamente anche il messaggio WM_CHAR (processato appunto da keypress).