Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не получается отправить сообщение контролу, Нужно из TEdit отпр. сообщение TListBox 
V
    Опции темы
youriy86
Дата 22.12.2011, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Здравствуйте.
У меня на форме лежит 2 компонента ListBox: TListBox и Edit: TEdit.
Свойство ListBox.AutoComplete = true стоит по умолчанию. Когда я нажимаю клавишу с какой-либо буквой, находясь при этом на ListBox'е, он автоматически перескакивает на нужную мне запись, начинающуюся с этой буквы.
Я хочу в Edit вводить текст, а в ListBox'e в этот момент должно происходить поиск записи, начинающейся с этой буквы, и установка ее в качестве выбранной.

Пробовал так (чтобы имитировать событие KeyPress на ListBox'е):

Код

procedure TFrm.EditKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  ListBox.Perform(WM_KEYDOWN, Key, 0);
end;

procedure TFrm.EditKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  ListBox.Perform(WM_KEYUP, Key, 0);
end;


Пробовал так:
Код

procedure TFrm.EditKeyPress(Sender: TObject; var Key: Char);
begin
  ListBox.Perform(WM_KEYDOWN, Ord(Key), 0);
  ListBox.Perform(WM_KEYUP, Ord(Key), 0);
end;


Пробовал через SendMessage, но я так понял это то же самое. Ничего не получается.

Вопрос: как имитировать возникновение события, которое уже заложено в коде (поиск по введенной с клавиатуры буквы) в ListBox'е с помощью Edit (ну или другого контрола, поддерживающего функцию ввода текста)? Помогите плиз.

Это сообщение отредактировал(а) youriy86 - 22.12.2011, 17:59
PM MAIL   Вверх
superVad
Дата 22.12.2011, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 7
Всего: 15



Может что то такое подойдет:
Код

procedure TForm1.Edit1Change(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to ListBox1.Items.Count - 1 do
    if Pos(AnsiUpperCase(TEdit(Sender).Text), AnsiUpperCase(ListBox1.Items[i])) = 1 then
    begin
      ListBox1.ItemIndex := i;
      Break;
    end;
end;

PM MAIL   Вверх
youriy86
Дата 23.12.2011, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Это то понятно, что то что мне надо, можно сделать каким-нибудь похожим способом. Но вопрос то в другом, как имитировать наступление этого события у контрола
PM MAIL   Вверх
youriy86
Дата 26.12.2011, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



ап
PM MAIL   Вверх
k0rvin
Дата 26.12.2011, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: нет
Всего: 5



Код

procedure TFrm.EditKeyPress(Sender: TObject; var Key: Char);
begin
  ListBox.KeyPress(ListBox, Key);
end;

?


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
MetalFan
Дата 26.12.2011, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Цитата(youriy86 @  22.12.2011,  17:57 Найти цитируемый пост)
Пробовал так:

Ну во-первых кто будет lParam заполнять?
во-вторых... если нужно сделать "редирект" сообщений, то почему бы не перекрыть оконную процедуру исходного винконтрола?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
youriy86
Дата 26.12.2011, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Цитата(MetalFan @  26.12.2011,  09:23 Найти цитируемый пост)
Ну во-первых кто будет lParam заполнять?

Я думал там достаточно 0 оставить. Что следует поставить? Я пробовал вставить SizeOf(Key) - не помогло.

Цитата(MetalFan @  26.12.2011,  09:23 Найти цитируемый пост)
во-вторых... если нужно сделать "редирект" сообщений, то почему бы не перекрыть оконную процедуру исходного винконтрола? 

Перекрыть оконную процедуру - это как? В смысле назначить ему событие OnKeyPress?


Это сообщение отредактировал(а) youriy86 - 26.12.2011, 09:55
PM MAIL   Вверх
CROTishka
Дата 11.1.2012, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 30.7.2009

Репутация: нет
Всего: 2



то что вы просите, делается в 2строчки:
Код

type

  TEdit = class(StdCtrls.TEdit)
    procedure Dispatch(var Message); override;
  end;

  TForm1 = class(TForm)
    edt1: TEdit;
    mmo1: TMemo;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TEdit }

procedure TEdit.Dispatch(var Message);
begin
  if (TMessage(Message).Msg = WM_CHAR) and (TForm1(Self.Owner).mmo1 <> nil)
  then
    TForm1(Self.Owner).mmo1.Dispatch(Message);
  inherited;
end;



Но сдаётся мне, вы не тем заняты. 
сага о x y и z :
http://www.google.ru/url?sa=t&rct=j&am...7lsfV_FQDCrhJRw
PM MAIL   Вверх
youriy86
Дата 18.1.2012, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Спасибо, работает, но мне хотелось бы еще текст в едите видеть.

Ну а насчет саги, я почитал, интересно smile но по-моему в данном случае это как раз таки X. Потому что ко мне приходит пользователь и говорит:"Меня не устраивает нажимать на ЛистБоксе, хочу в отдельном эдите и чтобы там искалось".
PM MAIL   Вверх
CROTishka
Дата 18.1.2012, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 30.7.2009

Репутация: нет
Всего: 2



Цитата

Спасибо, работает, но мне хотелось бы еще текст в едите видеть.

А для чего там по-вашему строчка с inherited!?!?
Значит вы что-то не так скопировали.
Цитата

Потому что ко мне приходит пользователь и говорит:"Меня не устраивает нажимать на ЛистБоксе, хочу в отдельном эдите и чтобы там искалось". 

Как связана эта задача(постановка), и то, что вы просите?
Держите:
Код

type

  TEdit = class(StdCtrls.TEdit)
  private
    FLastTime: Cardinal;
  protected
    procedure KeyPress(var Key: Char); override;
  end;

  TForm1 = class(TForm)
    lst1: TListBox;
    edt1: TEdit;
    procedure edt1KeyPress(Sender: TObject; var Key: Char);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.edt1KeyPress(Sender: TObject; var Key: Char);
var
  x: TWMKey;
begin
  x.Msg := WM_CHAR;
  x.CharCode := Ord(Key);
  lst1.Dispatch(x);
end;

procedure TEdit.KeyPress(var Key: Char);
begin
  inherited;
  if GetTickCount - FLastTime >= 500 then
    Text := '';
  FLastTime := GetTickCount;
end;

PM MAIL   Вверх
youriy86
Дата 23.1.2012, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Спасибо большое, все работает.

Добавлено @ 07:22
Код

procedure TForm1.Edit1Change(Sender: TObject);
begin
  with ListBox1 do
    ItemIndex := Perform(LB_SELECTSTRING, ItemIndex, LongInt(Edit1.text));
end;


А что Вы думаете, насчет такого? У меня вроде работает.
И я не понимаю для чего стоит обнуление текста у TEdit на KeyPress.

Это сообщение отредактировал(а) youriy86 - 23.1.2012, 07:24
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0794 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.