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

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

не работает ComboBox.SelStart


Андрей Молчанов ©   (2006-05-21 19:31:00) 

Необходимо по нажатию кнопки вставить текст '%YEAR%' в ComboBox, но не вместо уже существующего текста, а внутрь. Выполняю следующий код:


 ComboBox.Text := Copy(ComboBox.Text, 1, ComboBox.SelStart) + '%YEAR%' + Copy(ComboBox.Text, ComboBox.SelStart + ComboBox.SelLength + 1, MaxInt);


Однако SelStart и SelLength всегда содержат 0. Я думаю, это из-за того, что в момент нажатия кнопки комбо-бокс теряет фокус. Что можно сделать


@Lex   (2006-05-21 22:15:00) [1]

if MSg.message = 512 then begin
  SelStart := ComboBox1.SelStart;
  SelLength := ComboBox1.SelLength;
end;


@Lex   (2006-05-21 22:09:00) [2]

пОПРОБУЙ ТАК.
Кидай на форму TApplicationEvent.

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
 var Handled: Boolean);
begin
 if Msg.hwnd = ComboBox1.Handle then
   //if Msg.Message = ? then begin
   if ComboBox1.SelStart <> 0 then begin
     SelStart := ComboBox1.SelStart;
     SelLength := ComboBox1.SelLength;
   end;
end;

корявенько -(.  Может в этом направлении покопать...


Андрей Молчанов   (2006-05-21 21:57:00) [3]

Тоже вариант, но мне кажется, что более эффективным вариантом будет сохранение SelStart и SelLength перед потерей фокуса. Нашел событие OnExit, но оно вызывается уже после потери фокуса. :(


begin...end   (2006-05-21 21:43:00) [4]

> Андрей Молчанов   (21.05.06 21:33) [4]

А почему бы в качестве кнопки не использовать TSpeedButton, который не забирает фокус?


Андрей Молчанов   (2006-05-21 21:33:00) [5]

При установке фокуса выделяется весь текст. Насчет ComboBox.SelText спасибо.


begin...end   (2006-05-21 21:28:00) [6]

> Андрей Молчанов   (21.05.06 19:31)

> Что можно сделать

Установить фокус вручную?

Кстати, код:

> ComboBox.Text := Copy(ComboBox.Text, 1, ComboBox.SelStart)
> + '%YEAR%' + Copy(ComboBox.Text, ComboBox.SelStart + ComboBox.SelLength
> + 1, MaxInt);

может быть заменён на:

ComboBox.SelText := '%YEAR%'.


Андрей Молчанов   (2006-05-21 21:28:00) [7]

Нет, я имею в виду, что хочу вставить %YEAR% в текст. То есть, если в комбобоксе текст 'qwerty', курсор стоит после r и нет элементов, то элементов не добавится, но текст станет 'qwer%YEAR%ty'.

У меня появилась мысль - может быть сохранять SelStart и SelLength при потере фокуса? Но здесь опять проблема - я пытаюсь поймать WM_ACTIVATE через ComboBox.WindowProc, но сообщение не ловится. В чем может быть дело?

 if Message.Msg = WM_ACTIVATE then begin
   SelStart := ComboBox.SelStart;
   SelLength := ComboBox.SelLength;
 end;
 OldWndProc(Message);


Leonid Troyanovsky   (2006-05-21 20:58:00) [8]


> Андрей Молчанов   (21.05.06 19:31)  

> фокус. Что можно сделать


 ComboBox1.Items.Add('%YEAR%') ?

--
Regards, LVT.


Наверх

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