[Решено] Ограничение длины вводимой строки в TStringGrid

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

[Решено] Ограничение длины вводимой строки в TStringGrid

Сообщение leo_bsv » 24.02.2011 19:12:07

Всем привет.
Вопрос достаточно прост, но никак не получается ввести ограничение на длину вводимой строки в TStringGrid, причём нужно разную для различных ячеек. Может кто уже сталкивался с такой необходимостью? Поделитесь куском кода :) если не жалко :wink:
Ограничивать длину нужно прямо в момент ввода текста, а не после (как это делает функция валидации).
Спасибо за внимание.
Последний раз редактировалось leo_bsv 27.02.2011 03:25:18, всего редактировалось 1 раз.
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: Возможно ли в TStringGrid ограничить длину вводимой строки?

Сообщение Nik » 24.02.2011 21:05:09

Код: Выделить всё
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    if Length(StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row])>6 then Key:=0;
end;   


Идея старая, но работает. Нужно только причесать и добавить обработку всяких там Delete и иже с ним.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Возможно ли в TStringGrid ограничить длину вводимой строки?

Сообщение leo_bsv » 24.02.2011 21:16:44

тогда ещё один встречный вопрос: чем отличается Length от UTF8Length и когда нужно использовать первую а когда вторую, в данном случае использование первой не повлечёт за собой каких-нибудь последствий :?:
p.s.: пишу под linux

Добавлено спустя 55 минут 57 секунд:
кстати, спасибо за подсказку - отлично работает! то что надо! :)
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: Возможно ли в TStringGrid ограничить длину вводимой строки?

Сообщение Odyssey » 24.02.2011 23:16:26

leo_bsv писал(а):тогда ещё один встречный вопрос: чем отличается Length от UTF8Length и когда нужно использовать первую а когда вторую
Для строки в UTF-8 (т.е. любой строки, считанной из компонента Lazarus) Length вернёт длину в байтах, а UTF8Length -- в символах. Решайте, какая из них вам нужна в конкретном случае.
leo_bsv писал(а):в данном случае использование первой не повлечёт за собой каких-нибудь последствий :?:
Повлечёт, в приведённом примере в ячейку можно ввести 6 символов латиницы или цифр, но только 3 кириллических символа (потому что кириллические символы в UTF-8 занимают по 2 байта). Так что здесь нужна UTF8Length.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Возможно ли в TStringGrid ограничить длину вводимой строки?

Сообщение leo_bsv » 24.02.2011 23:24:56

Собственно вот что у меня получилось:

Код: Выделить всё
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

const
// собственно длина каждой строки
lengtharr: array [1..16] of integer = (50,30,50,50,40,40,1,6,6,6,4,4,4,4,4,100);
// коды разрешённых клавиш
acceptarr: array [1..31] of word = (8,9,13,16,17,18,20,27,33,34,35,36,37,38,39,40,46,44,145,19,144,112,113,114,115,116,117,118,119,120,121);

  // проверка - есть ли клавиша среди разрешённых
  function InArr(value:integer):boolean;
  var i:integer;
      r:boolean=false;
  begin
    i:=Low(acceptarr);
    while i<=High(acceptarr) do
      if acceptarr[i]=value then begin r:=true; break; end
      else inc(i);
    InArr:=r;
  end;
begin
  with StringGrid1 do begin
    case Col of
      1: if (UTF8Length(Cells[Col,Row])>=lengtharr[Row]) and not InArr(Key) then Key:=0;
      2: if (UTF8Length(Cells[Col,Row])>=100) and not InArr(Key) then Key:=0;
    end;
  end;
end;

... остается только обработать вставку текста из буфера... это можно и валидацией.

Добавлено спустя 4 минуты 3 секунды:
а может как-нибудь можно эту самую вставку из буфера отследить? через clipbrd например? или может ещё как?
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: Возможно ли в TStringGrid ограничить длину вводимой строки?

Сообщение dunin » 25.02.2011 10:39:35

leo_bsv писал(а):...а может как-нибудь можно эту самую вставку из буфера отследить? через clipbrd например? или может ещё как?

Ну... Перед вставкой в ячейку проверяешь длину и если больше - обрезаешь. Как-то так.
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Возможно ли в TStringGrid ограничить длину вводимой строки?

Сообщение leo_bsv » 25.02.2011 21:32:56

Короче, как обычно, пока искал обошёл сто километров лесом, а всего-то надо было повернуть за угол...
Нужный мне функционал делается вот как:
Код: Выделить всё
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;const Value: string);
const
lengtharr: array [1..16] of
                       integer = (50,30,50,50,40,40,1,6,6,6,4,4,4,4,4,100);
begin
    case ACol of
      1: if (UTF8Length(value)>=lengtharr[ARow]) then
            StringGrid1.Cells[ACol,ARow]:=UTF8Copy(value,1,lengtharr[ARow]);
      2: if (UTF8Length(value)>=100) then
            StringGrid1.Cells[ACol,ARow]:=UTF8Copy(value,1,100);
    end;
end;

... и всё, и никакой фильтрации клавиш и контроля буфера. :?: :!: :D
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 38

Рейтинг@Mail.ru