Вверх ↑
Этот топик читают: Гость
Ответов: 33
Рейтинг: 1
#1: 2010-07-25 20:07:18 ЛС | профиль | цитата
Доброго времени суток! Вот возникла такая необходимость:
надо что бы при вводе текста в поле ввода ComboBox, после каждого нажатия клавиши происходило автодополнение текста( т.е. его достройка) + выделение той части, которая дополнилась( что бы при нажатии эта часть удалялась и подставлялась следующая). Или как вариант - при вводе текста - раскрывался список с предполагаемыми значениями.

Пример: в списке есть строка 'Хиазм' - при вводе текста: Хи - дотсраивает 'азм' и выделяет этот отрывок, далее нажимаем т - 'азм' пропадает( и если нет строк на 'Хит' ни чего не происходит).

P.S. Может и не надо новый компонент делать - можно это на стандартном пакете Delphi собрать?
карма: 0

0
Ответов: 582
Рейтинг: 3
#2: 2010-07-25 21:21:44 ЛС | профиль | цитата
Для этого нужен языковой пакет, которого в Хиазме нет (я прям Пушкин)
карма: 0

1
Голосовали:lsd25
Ответов: 1161
Рейтинг: 160
#3: 2010-07-25 21:25:33 ЛС | профиль | цитата
ruzik писал(а):
языковой пакет, которого в Хиазме нет

А словарик в TXT формате уже не в моде?
карма: 0

1
Голосовали:lsd25
Ответов: 875
Рейтинг: 322
#4: 2010-07-25 21:28:19 ЛС | профиль | цитата
ruzik, почитай справку о элементе HilightMemo
карма: 1

0
Ответов: 582
Рейтинг: 3
#5: 2010-07-25 21:30:46 ЛС | профиль | цитата
Можно конечно, но это надо найти, что бы было просто по 1 слову в каждой строке
Нет ничего невозможного, есть много геморойного (пословица) - у меня прям творческий бум
------------ Дoбавленo в 21.30:
kamakama писал(а):
ruzik, почитай справку о элементе HilightMemo

Да я знаю, как можно организовать подсветку и дополнение, я говорю про сам словарный пакет
карма: 0

0
Ответов: 758
Рейтинг: 112
#6: 2010-07-26 13:41:54 ЛС | профиль | цитата
Начало для размышлений

code_19698.txt
карма: 1

1
файлы: 1code_19698.txt [2.1KB] [408]
Голосовали:lsd25
Ответов: 1376
Рейтинг: 197
#7: 2010-07-26 13:49:56 ЛС | профиль | цитата
lsd25 писал(а):
Или как вариант - при вводе текста - раскрывался список с предполагаемыми значениями.

code_19699.txt
карма: 1

1
файлы: 1code_19699.txt [2.7KB] [417]
Голосовали:lsd25
Ответов: 33
Рейтинг: 1
#8: 2010-07-27 22:38:10 ЛС | профиль | цитата
ruzik писал(а):
Для этого нужен языковой пакет, которого в Хиазме нет (я прям Пушкин)

LainX писал(а):
А словарик в TXT формате уже не в моде?

   Зачем? Есть же ЗАПОЛНЕННЫЙ СПИСОК у ComboBox'а - по нему и проводим поиск значений.

Идея miver'а - то, что надо! ...только к ComboBox'у надо doSelectLength прикрутить - во в это собственно, и загвоздка. Поиск нужного значения сделать не сложно и стандартными средствами HiAsm'а.

P.S. В Win32 SDK в разделе ComboBox Messages есть сообщение CB_SETEDITSEL - оно и выделяет текст в Edit'е. Надо помедитировать...

------------ Дoбавленo в 22.38:

...помедитировал

Вот готовый вариант :

Add(ComboBox,11468122,266,203)
{
Left=20
Top=10
Width=160
Height=21
Strings=#1:А|3:Абв|4:Абвг|3:123|3:А12|9:Челябинск|5:Челси|8:Златоуст|4:Злат|4:Миас|9:Миоглобин|11:Миогемотома|7:чел;гма|
Point(Handle)
Point(EditText)
Point(doEditText)
Point(onKeyUp)
link(onKeyUp,13912476:doValue,[(310,223)(310,184)(91,184)(91,377)])
}
Add(InlineCode,1150256,413,301)
{
@Hint=#31:Выделяем текс в Edit ComboBox'а|
WorkPoints=#8:doSelect|
DataPoints=#8:CBHandle|8:StartPos|6:EndPos|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|40:uses kol,Share,Debug, Windows, Messages;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|9: public|43: CBHandle, StartPos, EndPos : THI_Event;|52: procedure doSelect(var _Data:TData; Index:WORD);|5: end;|0:|14:implementation|0:|60:procedure THiAsmClass.doSelect(var _Data:TData; Index:WORD);|3:var|10: h:HWND;|14: l:cardinal;|5:begin|39: h:= ReadInteger(_Data,CBHandle,0);|77: l:= MakeLong(ReadInteger(_Data,StartPos,0),ReadInteger(_Data,EndPos,3));|38: SendMessage(h,CB_SETEDITSEL,0,l);|4:end;|0:|4:end.|
link(CBHandle,11468122:Handle,[(419,283)(286,283)])
link(StartPos,11533372:Result,[(426,273)(564,273)(564,345)(580,345)])
link(EndPos,4770968:Result,[(433,289)(475,289)(475,345)(517,345)])
}
Add(ArrayFind,6918248,266,371)
{
Partial=0
PColor(Array,16776960)
link(onFind,3223072:doCompare,[])
link(Array,3808130:Var2,[])
link(Index,5718283:Value,[(279,351)(286,351)])
link(Value,4073192:Var2,[(286,355)(293,355)])
}
Add(Memory,5718283,280,303)
{
Default=Integer(0)
}
Add(ArrayRW,6882889,371,371)
{
PColor(Array,16776960)
link(onRead,9288030:doValue,[])
link(Array,3808130:Var3,[(377,341)])
}
Add(GetDataEx,3808130,266,336)
{
PColor(Data,16776960)
link(Data,11468122:Array,[])
}
Add(Memory,9288030,427,371)
{
link(onData,6472888:doEvent1,[])
}
Add(Length,4770968,511,301)
{
@Hint=#21:Длинна большей строки|
link(Str,9288030:Value,[(517,289)(488,289)(488,411)(433,411)])
}
Add(Length,11533372,574,301)
{
@Hint=#21:Длинна меньшей строки|
link(Str,4073192:Var3,[(580,264)])
}
Add(GetDataEx,4073192,287,259)
{
link(Data,11468122:EditText,[])
}
Add(Hub,6472888,469,371)
{
OutCount=4
link(onEvent1,4770968:doLength,[(499,377)(499,307)])
link(onEvent2,11533372:doLength,[(516,384)(552,345)(552,307)])
link(onEvent3,11468122:doEditText,[(494,391)(494,364)(245,364)(245,251)])
link(onEvent4,1150256:doSelect,[(506,398)(506,353)(400,353)(400,307)])
}
Add(If_else,3223072,315,371)
{
Type=5
Op2=Integer(-1)
link(onTrue,6882889:doRead,[])
link(Op1,6918248:ItemIdx,[(321,359)(307,359)(307,415)(272,415)])
}
Add(If_else,13903520,161,371)
{
Type=2
Op2=Integer(48)
link(onTrue,7577364:doCompare,[])
link(Op1,9125783:Var2,[])
}
Add(If_else,7577364,210,371)
{
Type=1
Op2=Integer(90)
link(onTrue,6918248:doFind,[])
link(Op1,9125783:Var3,[(216,359)])
}
Add(Memory,13912476,105,371)
{
link(onData,13903520:doCompare,[])
}
Add(GetDataEx,9125783,161,354)
{
Angle=3
link(Data,13912476:Value,[(150,359)(150,409)(111,409)])
}


Всегда я так - сначала задам вопрос, а потом сам на него отвечу
Если кому не лень - потестите схемку.

-= Всем респект =-

P.S. Как-бы теперь это все в один компонент запихнуть и все ComboBox'ы своего проэкта заменить?

карма: 0

0
Ответов: 758
Рейтинг: 112
#9: 2010-07-28 09:58:06 ЛС | профиль | цитата
lsd25 писал(а):
...только к ComboBox'у надо doSelectLength прикрутить

Я бы еще doPosition и точку раскрытия списка добавил
карма: 1

0
Ответов: 33
Рейтинг: 1
#10: 2010-07-28 10:49:08 ЛС | профиль | цитата
miver дело говорит.
Компонент мне переписывать не охота, но можно сделать схемку-расширение.
карма: 0

0
Разработчик
Ответов: 26117
Рейтинг: 2126
#11: 2010-07-28 10:51:39 ЛС | профиль | цитата
lsd25 писал(а):
но можно сделать схемку-расширение

А это никак нельзя сделать на штатных компонентах
Зачем писать IC на SendMessage
карма: 22

0
Ответов: 33
Рейтинг: 1
#12: 2010-08-02 08:16:27 ЛС | профиль | цитата
nesco писал(а):
А это никак нельзя сделать на штатных компонентах
Зачем писать IC на SendMessage


Можно было бы и на штатных, только нельзя при помощи штатных послать сообщение CB_SETEDITSEL($144) ComboBox'у, где старшее слово lParam = начало выделения, а младшее слово = конец выделения... вот и пришлось IC состряпать( кстати не пойму я разницы между типом cardinal и dword - в моем IC только cardinal заработал).

P.S. Hiasm не сильно приспособлен к использованию всех фишек Win32 - вот и приходится IC писать.
карма: 0

0
Ответов: 1376
Рейтинг: 197
#13: 2010-08-02 08:28:43 ЛС | профиль | цитата
lsd25 писал(а):
только нельзя при помощи штатных послать сообщение CB_SETEDITSEL($144)

очень даже можно послать
code_19796.txt
карма: 1

1
файлы: 1code_19796.txt [6.7KB] [401]
Голосовали:lsd25
Ответов: 338
Рейтинг: 3
#14: 2010-08-10 09:24:02 ЛС | профиль | цитата
Если быстро набирать то выделение "забывается"
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 33
Рейтинг: 1
#15: 2010-08-14 01:54:37 ЛС | профиль | цитата
foksov писал(а):
lsd25 писал(а)
только нельзя при помощи штатных послать сообщение CB_SETEDITSEL($144)

очень даже можно послать


...блин, забываю я про эту возможность у компонентов , кстати - хорошая фишка с 'Добавлением/удалением в Combobox'е'

Думаю вопрос решен:

- есть мой код( с применением IC) code_19984.txt

- есть код foksov(только на стандартных компонентах) code_19796.txt
карма: 0

0
файлы: 1code_19984.txt [3.1KB] [352]
Сообщение
...
Прикрепленные файлы
(файлы не залиты)