Советы по Delphi


Как ограничить количество вводимого


Олег Кулабухов делится своим опытом:

Ниже приведены два варианта решения данного вопроса. Первый основан на предварительном подсчете количества входящих букв, исходя из количества входящих "W", как наиболее широкой буквы (в русском, наверное, логичнее использовать "Ы"). Второй - на подсчете ширины введенных символов непосредственно во время ввода. Второй способ предпочтительнее, т.к. первый может выдавать неправильные результаты при разномасштабных шрифтах.

    procedure TForm1.FormCreate(Sender: TObject);
var
cRect : TRect;
bm : TBitmap;
s : string;
begin


Windows.GetClientRect(Edit1.Handle, cRect);
bm := TBitmap.Create;
bm.Width := cRect.Right;
bm.Height := cRect.Bottom;
bm.Canvas.Font := Edit1.Font;
s := 'W';
while bm.Canvas.TextWidth(s) < CRect.Right do
s := s + 'W';
if length(s) > 1 then begin
Delete(s, 1, 1);
Edit1.MaxLength := Length(s);
end;
end;

{Alternatively}

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
cRect : TRect;
bm : TBitmap;
begin
if
((Ord(Key) <> VK_TAB) and
(Ord(Key) <> VK_RETURN) and
(Ord(Key) <> VK_LEFT) and
(Ord(Key) <> VK_BACK)) then begin
Windows.GetClientRect(Edit1.Handle, cRect);
bm := TBitmap.Create;
bm.Width := cRect.Right;
bm.Height := cRect.Bottom;
bm.Canvas.Font := Edit1.Font;
if bm.Canvas.TextWidth(Edit1.Text + Key) > CRect.Right then begin
Key := #0;
MessageBeep(-1);
end;
bm.Free;
end;
end;

[001888]



Содержание раздела