Всплывающий словарь (подсказка) по (Ctri+пробел)

 
0
 
Delphi, Kylix and Pascal
ava
User | 10.01.2005, 17:33
Rennigth - я извеняюсь что долго не отвечал, уезжал.
Мне необходимо печатать текст в компоненте TMemo. При этом для удобства я хочу выбирать при написании текста стандартные слова из словаря. Словарь появляется при нажатии на пробел в виде возникающего окна. Часть кода ты уже написал но попросил пояснить. Да самое главное что бы этот словарь можно было дополнять. Хранить данные я собираюсь в БД Paradox.



Ответы (14)
ava
Akella | 10.01.2005, 17:56 #
Итак. Создаем таблицу в DBD с двумя полями (AutoInc и Alpha)
Подключаем TTable к этой таблице.
В мемо определяем в событии нажатия клавиши код, который будет брать слово в позиции курсора. Я думаю нам помогут http://forum.vingrad.ru/index.php?act=ST&a...63&unread=1.

далее создаем форму и убираем все поля и заголовок, на нее кладем TDBListBox и устанавливаем свойство Align в alClient. Подключаем к таблице, всплывающий словарь готов.

Остальное завтра.
ava
Akella | 11.01.2005, 11:15 #
еще нужно перевести координаты каретки из локальных в глобальные
ava
Akella | 11.01.2005, 13:20 #
вот такой код в событии нажатия клавиши в TMemo


procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
VAR
iX,iY:integer;
p,p1:TPoint;
begin
 p1.X:=memo1.CaretPos.X;
 p1.Y:=memo1.CaretPos.Y;
 p:=memo1.ClientToScreen(p1);
//  if ((ssCtrl in Shift) AND NOT (ssAlt in Shift) AND NOT (ssShift in Shift)) and (key = vk_back)then begin
 if  (key = vk_f10)then begin
   form2.Left:=p.Y;
   form2.Top:=p.X;
   form2.Show;
   key:=0;
 end;
end;
ava
Akella | 11.01.2005, 13:41 #
Теперь после появления окошка фокус должен переходить на единственный на форме компонент - список. Кстати, словарь можно держать в текстовых файлах, и подгружать в память. Но возможностей поиска, мне кажется, в БД больше. Итак, на всплывающей форме меняем еще 2 свойства: в ActiveControl выбираем наш список, чтобы при появлении формы, список сразу активировался, FormStyle меняем в fsStayOnTop. Теперь при нажатии F10 (клавиши можешь сам выбрать) будет появляться форма со списком.
Следующая задача. Отфильтровать значения в таблице, чтобы во всплывающем списке на не показывался весь словарь. Для этого нужно выделить корень из слова, на котором стоит курсор
ava
Akella | 11.01.2005, 14:35 #
Теперь после появления окошка фокус должен переходить на единственный на форме компонент - список. Кстати, словарь можно держать в текстовых файлах, и подгружать в память. Но возможностей поиска, мне кажется, в БД больше. Итак, на всплывающей форме меняем еще 2 свойства: в ActiveControl выбираем наш список, чтобы при появлении формы, список сразу активировался, FormStyle меняем в fsStayOnTop. Теперь при нажатии F10 (клавиши можешь сам выбрать) будет появляться форма со списком.
Следующая задача. Отфильтровать значения в таблице, чтобы во всплывающем списке на не показывался весь словарь. Для этого нужно выделить корень из слова, на котором стоит курсор.
После фильтрации словаря показываем форму со списком только отфильтрованных слов.
фильтрация в БД осуществляется несколькими спообами. Быстрее, конечно Locate. Но лучше SQL.
ava
Akella | 11.01.2005, 16:11 #
после того как отфильтровали, показали окошко с несколькими результатами а списке (в данном примере я использую TListBox), с пом. клавиш вверх и вниз юзер выбирает нужную строку и нажимает Enter. Теперь нужно удалить текущее слово и вставить слово из выделенной строки списка. Пока так.

procedure TForm2.ListBox1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if key=vk_return then begin//если нажата Enter
   form1.memo1.SelText:=ListBox1.Items.Strings[ListBox1.itemindex];
   form2.Close;
 end;
end;


надеюсь скоро мы узнаем
http://forum.vingrad.ru/index.php?showtopic=39450

ava
Akella | 11.01.2005, 16:48 #
User, отзовись, вопрос задал, ну и где же сам?
ava
Akella | 12.01.2005, 10:32 #
продожаем, смотри здесь
http://forum.vingrad.ru/index.php?showtopic=39450

скоро выложу в архиве весь проект
ava
Akella | 12.01.2005, 12:52 #
Я заменил обычный ListBox на DBLookUpListBox.

Код буднт такой


procedure TForm2.DBLookupListBox1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
var
 sNewSlovo:String;
begin
//если нажато Enter, заменяем тек. слово в TMemo формы form1
 if key=vk_return then begin
   form1.Str :=DBLookUpListBox1.SelectedItem;
   form2.Close
 end;
//если нажато Inser, добавляем слово в словарь
 if key=vk_insert then begin
   if InputQuery('ДОБАВИТЬ', 'Ввеите новую словарную статю',sNewSlovo) then
     form1.tSlovar.Append;
     form1.tSlovar.Fields[1].AsString:=sNewSlovo;
     form1.tSlovar.Post;
 end;
//если нажато Delete, удаляем выбранную словарную статью
 if key=vk_Delete then begin
   if form1.tSlovar.Locate('Value',DBLookupListBox1.SelectedItem,[]) then
     form1.tSlovar.Delete;
 end;
end;

ava
Akella | 12.01.2005, 13:25 #
Вот есть предварительный, а может окончательный проект, хотя бы пример, для начала нового проекта, если кому интересно, давайте, предложения, будем продолжать.
И еще http://forum.vingrad.ru/index.php?showtopi...mp;#entry300956
ava
User | 13.01.2005, 12:50 #
Пример работает отлично. Есть пожелание. Ты наверное заметил что словарь по F10 вызывается при условии, что в начале строки стоит какаято буква или цифра или знак пунктуации, наконец просто пробел. В противном случаи этого вызова не происходит. Далее я не совсем понял как ты сделал наполнение словаря данными? если нажать Insert и не чего не ввести в поле Edit то возникает ошибка! Пустое значение. Вот так. И если честно, я не совсем понял предназначение Button 1 и Button2? Поясни пожалуйста.
Добавлено позднее:
Да еще один момент. Форма2 словаря у тебя глушит форму1. Заметь что в дельфях такого нет, она как бы плавующая, вызывается как Form2.Show. При этом форма2 не прячется за форму 1 если активизировать форму1.

Вот реальные предложения. Думаю многим былобы интересно улышать ответ в доработке имеющегося примера.
ava
Akella | 13.01.2005, 13:20 #
Неужели сам не можешь доделать?
Добавлено позднее:
хотя, конечно кой-какие ошибки исправлю и выложу
ava
User | 20.01.2005, 10:26 #
Когда будет обновление. Руки так и чешуться глянуть что изменилось.
ava
Akella | 20.01.2005, 10:35 #
смотри, что еще подправить
Добавлено позднее:
даже где-то в теме "общие вопросы" поищи вопрос на тему как найти корень слова, пацаны давали ответ. Дерзай
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
ava  Akella   User
advanced
Отправить