Сегодня моя логика разбилась в дребезги....
Понадобилось сделать ограничение на длину вводимой строки в TEdit. До этого было подобное в TStringGrid и всё отлично работало. Принцип работы такой создаем глобальную переменную, в неё, по событию изменения текста в объекте постоянно сохраняем текст из объекта, а когда длина текста превышает указанную, то нашему полю ввода присваиваем старое значение из глобальной переменной.
Начал делать такое на TEdit, кинул на форму, сделал событие OnChange и при тестировании приложения ловлю сигфолт, когда длина строки подходит к заданной. Делал много экспериментов, даже имена переменных менял...
Потом сделал отдельный проект для тестов. Но в нем ситуация оказалась аналогичная.
Собственно код:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, LCLProc;
type
{ TForm1 }
TForm1 = class(TForm)
edit: TEdit;
procedure editChange(Sender: TObject);
private
{ private declarations }
fillAllLastVal:string;
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.editChange(Sender: TObject);
// ограничиваем количество символов
var
value: string;
begin
value := edit.text;
if utf8length(Value) < 11 then
begin
fillAllLastVal:= edit.text;
end
else
begin
// value:=fillAllLastVal;
edit.text:=fillAllLastVal;
end;
end;
end.
Понадобилось сделать ограничение на длину вводимой строки в TEdit. До этого было подобное в TStringGrid и всё отлично работало. Принцип работы такой создаем глобальную переменную, в неё, по событию изменения текста в объекте постоянно сохраняем текст из объекта, а когда длина текста превышает указанную, то нашему полю ввода присваиваем старое значение из глобальной переменной.
Начал делать такое на TEdit, кинул на форму, сделал событие OnChange и при тестировании приложения ловлю сигфолт, когда длина строки подходит к заданной. Делал много экспериментов, даже имена переменных менял...
Потом сделал отдельный проект для тестов. Но в нем ситуация оказалась аналогичная.
Собственно код:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, LCLProc;
type
{ TForm1 }
TForm1 = class(TForm)
edit: TEdit;
procedure editChange(Sender: TObject);
private
{ private declarations }
fillAllLastVal:string;
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.editChange(Sender: TObject);
// ограничиваем количество символов
var
value: string;
begin
value := edit.text;
if utf8length(Value) < 11 then
begin
fillAllLastVal:= edit.text;
end
else
begin
// value:=fillAllLastVal;
edit.text:=fillAllLastVal;
end;
end;
end.
Но этот пост заставило написать совсем другое, а именно, закомментированная строка // value:=fillAllLastVal; Вставив которую(конечно раскомментировав), после кучи экспериментов, получил рабочий проект. ЭТО ПРОСТО ВЫНОС МОЗГА :) Почему так, понять не могу, а разбираться дальше времени нет.
Зато дальше сделал правильный метод ограничения длинны:
procedure TForm1.editChange(Sender: TObject);
begin
if utf8length(edit.text) > MAX_SYMBOLS then
begin
edit.text := UTF8Copy(edit.text,1,MAX_SYMBOLS);
end;
end;
begin
if utf8length(edit.text) > MAX_SYMBOLS then
begin
edit.text := UTF8Copy(edit.text,1,MAX_SYMBOLS);
end;
end;
Делалось под Kubuntu 12.04, Lazarus 1.0, fpc 2.60
Комментариев нет:
Отправить комментарий