Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2023, 21:30   #1
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию Свойство MaxLength у TEdit и кодировка UTF8

Вот какая возникла проблема. Нужно ограничить количество символов, которые может ввести пользователь в TEdit. Для этого предназначено свойство MaxLength, но оно не понимает кодировку UTF8, а именно с ней и работает Lazarus (странно, да, работает с этой кодировкой, но свойства ее не понимают).

В итоге если, скажем, прописать MaxLength := 30, то длина строки будет ограничена лишь 15 символами для русского текста.

Применил костыльное решение:
1. Установил MaxLength := 60, то есть в два раза больше, чем надо (но так оно пропустит более 30 нерусских символов).
2. На обработчик события KeyPress прописал следующее:
Код:
  if (Key >= ' ') and (UTF8Length(TEdit(Sender).Text) >= 30) then Key := #0;
Оно, конечно, как-то работает, но, во-первых, это реальный костыль, а, во-вторых, работает только если вводить прямо с клавиатуры, а если скопировать длинный текст из буфера, то ограничение не сработает.

Можно, конечно, еще дополнительно проверять длину текста и обрезать его, если окажется длиннее, но это уже двойной костыль будет.

Есть ли нормальное решение проблемы?
Arigato на форуме Ответить с цитированием
Старый 15.06.2023, 19:27   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

А пробовали уже OnChange вместо OnKeyPress с тем же самым кодом ?
phomm вне форума Ответить с цитированием
Старый 15.06.2023, 21:44   #3
Mic0x10h
 
Регистрация: 08.08.2014
Сообщений: 5
По умолчанию

Верно про OnChange. Вот так можно:

Код:
uses lazutf8;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  if UTF8Length(Edit1.Text)>30
  then
  begin
   Edit1.Text:=OldEditText;

   Edit1.SelStart:=Length(OldEditText);    //Курсор в конец строки, так уместнее
   Edit1.SelLength:=0;
  end
  else OldEditText:=Edit1.Text;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OldEditText:='';
end;
К тому же OnKeyPress, OnKeyDown Up -вставку из буфера обмена пропустят.

По этому же принципу в OnChange можно делать ввод только числовых значений, с помощью TryStrToInt или TryStrToFloat, ну например.
Mic0x10h вне форума Ответить с цитированием
Старый 15.06.2023, 22:15   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Ну это примерно такой же костыль. В случае ограничения свойством MaxLength и вставки из буфера обмена, вставленный текст просто обрезается. А в предложенном варианте вообще ничего не вставится. Ну и потеря позиции курсора.

В общем, пока нормального варианта нет, а штатный MaxLength, который обязан корректно работать, не работает в кривом Лазарусе, с помпой перешедшем на UTF8 (с такой помпой, что некоторый функции, типа AnsiToUtf8, которые раньше работали, тупо вообще больше ничего не делают).

Последний раз редактировалось Arigato; 15.06.2023 в 22:18.
Arigato на форуме Ответить с цитированием
Старый 15.06.2023, 22:28   #5
Mic0x10h
 
Регистрация: 08.08.2014
Сообщений: 5
По умолчанию

Так не пойдет?:

Код:
procedure TForm1.Edit1Change(Sender: TObject);
var
   st:widestring;
begin
  st:=Edit1.Text;
  if Length(st)>30 then
  begin
   Delete(st,30,Length(st)-30);
   Edit1.Text:=st;

   Edit1.SelStart:=Length(Edit1.text);
   Edit1.SelLength:=0;
  end;
end;
Mic0x10h вне форума Ответить с цитированием
Старый 15.06.2023, 22:36   #6
Mic0x10h
 
Регистрация: 08.08.2014
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
MaxLength, который обязан корректно работать, не работает в кривом Лазарусе
Кстати, у меня нормально вроде работает. 10 символов и латиница и кириллица и корейские буквы.

Lazarus 1.6 у меня стоит под Windows.
Mic0x10h вне форума Ответить с цитированием
Старый 16.06.2023, 01:06   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Цитата:
Сообщение от Mic0x10h Посмотреть сообщение
Lazarus 1.6
У меня версия 2.0.2.
Arigato на форуме Ответить с цитированием
Старый 16.06.2023, 04:03   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
У меня версия 2.0.2.
Скачал последнюю версию (2.2.6), вроде корректно работает MaxLength.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 16.06.2023, 13:26   #9
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 161
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
У меня версия 2.0.2.
начиная с 2.0.4 вроде поправили, просто обновитесь до последней, там много чего исправлено
DIONISKA вне форума Ответить с цитированием
Старый 16.06.2023, 19:22   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Спасибо, попробую обновиться. Так-то Лазарус запускаю раз в пятилетку, потому какой стоит, такой стоит...

P.S. Обновление до версии 2.2.6 решило проблему, действительно MaxLength корректно работает с кодировкой UTF8.

Последний раз редактировалось Arigato; 16.06.2023 в 19:41.
Arigato на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кодировка в utf8 dmitruyk Python 3 09.04.2018 14:10
UTF8 renigal1 PHP 4 23.03.2012 12:32
Кодировка utf8. Работа с символами. Перевод русских букв в латинских аналог dr.Chas PHP 3 24.03.2011 16:47
TWebBrowser и кодировка UTF8.. sxcine Работа с сетью в Delphi 2 04.11.2010 22:55
Кодировка с cp1251 на utf8 в MySQL Droid БД в Delphi 1 13.03.2010 16:43