Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Завершение строки в Editbox е


Kirill ©   (2002-09-04 12:14:00) 

Хочу реализовать сабж в KOL.
есть editbox, StrLst типа PStrLst, в котором хранятся слова.
Позьзователь вбивает в editbox начало какого-то слова и надо, чтобы автоматически добавлялось до завершения слова. Причем оставшаяся часть (созданная автоматически) была выделена.
Такая реализация у строки url в IE, но только там еще список выпадает, а мне список не надо.


Kirill   (2002-09-05 14:11:00) [1]


> Ну и как сказал Vladimir Kladov Backspace и Delete надо
> тоже обрабатывать. Я про это не подумал :)

Блин, не получается обработать ни Backspace, ни Delete


BorisMor   (2002-09-05 08:31:00) [2]

program Project2;

uses
windows,messages,kol;

{$R *.RES}
var
form,ed:pControl;
i,j:integer;
b:boolean;

function GetEndText(text:string):string;
begin
// ну тут по идеи поиск text в PStrList
if text="12" then result:="34";
if text="12345" then result:="67";
end;

Procedure edChen(Dummy : Pointer; Sender: PControl);
var
s:string;
begin
s:=GetEndText(ed.Text); // текст который должен быть добавлен к основному
if b and (s<>"") then
begin
i:=Length(ed.Text);
j:=Length(s);
b:=false;
ed.Text := ed.Text+s;
end;

if (i<>0) and (j<>0) then
begin
ed.SelStart:=i;
ed.SelLength :=j;
end;

b:=true;
i:=0;
j:=0;
end;

begin
form := NewForm(Applet,"123");
ed:=NewEditBox(form,[]);
ed.OnChange := TOnEvent(MakeMethod(nil,@edChen));
b:=true;
run(form);
end.
---------------------------------------
Ну и как сказал Vladimir Kladov Backspace и Delete надо тоже обрабатывать. Я про это не подумал :)


Vladimir Kladov   (2002-09-05 08:26:00) [3]

Надо запоминать SelStart и после модификации восстанавливать, и
если управлять SelLength, то получается очень красиво: если
пользователь не заметил (смотрел только на клавиатуру), то все равно будет введено правильно. Да, еще надо отдельно реагировать на Backspace и Delete, иначе нельзя будет ввести A, если в словаре уже есть AB.


Gandalf   (2002-09-04 18:13:00) [4]

Старые грабли... KOL тут не причем.
Вот смотри нажал клавишу, пошел OnChar.
Но сам Key еще не добавился к EditBox1.Text!
Ты меняешь текст, на EditBox1.Text+Key+Tail и его выделяешь.
Потом символ доходит. Добавляется к EditBox и ты получаешь,
EditBox1.Text+key+Tail+Key и выделение сбрасывается.
Разве у тебя не то получается? Что делаешь то и получаешь.
Надо либо OnChar+OnChange, либо Onkey* обрабатывать.

Только не в коем случаи не делай в OnChange editBox1.Text:=...;
Это бессконечный цикл!

Можно где-то так.
OnChar:
...
FindWordFromList
EditBox1.Text:=MySuperWord;
Char:=#0;
...
+
OnChange
...
FindWordFromList;
SetSel;
...

Только еще придется курсор помещать на место...


Kirill   (2002-09-04 15:26:00) [5]

Приведу код. Он находится в событии OnChar

edTemp{переменная}:=edBox{editbox}.Text+Key{var переменная в событии};
indx:=0;{переменная}
edSoft:="";{переменная}
while indx<StrIni{переменная PStrLst}.Count do begin
if Pos(edTemp,StrIni.Items[indx])=1 then
edSoft:=StrIni.Items[indx];
if Trim(edSoft)<>"" then break;
inc(indx);
end;
if Trim(edSoft)<>"" then begin
edBox.Text:=edSoft;
edBox.SelStart:=Length(edTemp);
edBox.SelLength:=Length(edSoft)-Length(edTemp);
end;

Так вот он не хочет правильно работать.


Gandalf   (2002-09-04 15:21:00) [6]

EditBox1.Focused:=True;
EditBox1.SelStart:=1;
EditBox1.SelLength:=3;


Kirill   (2002-09-04 13:21:00) [7]

Ну находить у меня он находит, а как реализовать добавление, как я описал?


BorisMor   (2002-09-04 13:02:00) [8]

Не понятна в чем проблема.
Обрабатывать OnChange для editbox.
В обработке идет поиск введенного текста в StrLst обычным циклом
и функцию Pos


Наверх

Титульная страница Поиск, карта сайта Написать письмо