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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исчезает ComboBox из StringGrid-а 
:(
    Опции темы
Gugle
Дата 9.12.2005, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток всем мастерам!

В StringGrid вставляю ComboBox и MaskEdit. Все строки StringGrid-а на экран не влазят и у него соответственно появляется вертикальная полоса прокрутки. Тут возникает проблема. Если полосой прокрутки воспользоваться не кликом по ней, а скрулом на мышке, то ComboBox и MaskEdit после этого не появляются в ячеках. Что делать, с такой проблемой ума не приложу.

Вот так вставляю ComboBox и MaskEdit:
Код
procedure TForm1.StringGrid1SelectCell(Sender: TObject; Col, 
Row: Integer;  var CanSelect: Boolean); 
var 
R: TRect; 
begin 
if ((Col = 3) AND 
    (Row <> 0)) then begin 
  {Размер и расположение combobox подгоняем под ячейку} 
  R := StringGrid1.CellRect(Col, Row); 
  R.Left := R.Left + StringGrid1.Left; 
  R.Right := R.Right + StringGrid1.Left; 
  R.Top := R.Top + StringGrid1.Top; 
  R.Bottom := R.Bottom + StringGrid1.Top; 
  ComboBox1.Left := R.Left + 1; 
  ComboBox1.Top := R.Top + 1; 
  ComboBox1.Width := (R.Right + 1) - R.Left; 
  ComboBox1.Height := (R.Bottom + 1) - R.Top; 
  {Показываем combobox} 
  ComboBox1.Visible := True; 
  ComboBox1.SetFocus; 
end;
  if (ACol = 4) then
  begin
      // Размер и расположение MaskEdit подгоняем под ячейку
      R := SGWriteRead.CellRect(ACol, ARow);
      R.Left := R.Left + SGWriteRead.Left;
      R.Right := R.Right + SGWriteRead.Left;
      R.Top := R.Top + SGWriteRead.Top;
      R.Bottom := R.Bottom + SGWriteRead.Top;
      METShDataHex.Left := R.Left + 1;
      METShDataHex.Top := R.Top + 1;
      METShDataHex.Width := (R.Right + 1) - R.Left;
      METShDataHex.Height := (R.Bottom + 1) - R.Top;
      // Показываем MaskEdit
      METShDataHex.Text := FPult.SGWriteRead.Cells[4, ARow];
      METShDataHex.Visible := True;
      METShDataHex.SetFocus;
  end; 
CanSelect := True; 
end;



Условия
Код

ComboBox.Visible := False;
  StringGrid.SetFocus;

передаю в процедурах ComboBox1Exit и СomboBox1Change. У MaskEdit соответственно!

Пробовал перенестись из OnSelectCell в OnDrawCell, то же не помогает!

Пробовал перерисовывать их:
Код
TMySG = class(TStringGrid);
protected
  procedure Paint; override;
end;

procedure TMySG.Paint;
begin
  inherited;
  // Тут рисуем ComboBox и MaskEdit
end;

Бац!!! Не помогло!

Тытался отключить скрул мышки, однако и тут проблема. Ловим событие скрула методом:
Код
TMySG = class(TStringGrid);
protected
procedure CMMouseWheelSG(var Message: TCMMouseWHeel); message CM_MOUSEWHEEL;
end;


Оказалось что если у мышки стоят "хорошие" драйвера то этот метод не срабатывает, то же самое и с TApplicationEvents.
Ничего путного не нашел кроме как полностью отключить скрул мышки. Однако не у всех мышек стандртное сообщение от скрула (CM_MOUSEWHEEL и WM_MOUSEWHEEL) и это добавляет проблем. Как оказалось у тех мышек, у которых на колесике есть "клик", сообщения на событие скрул другое, а те мыши, где вместо колесиков шарики - третье (предпологаю что это еще не все вариции на тему...). Соответственно и реакция у компонентов где есть прокрутки разная!

Однако с проблемой справился и скрул отключил и... всеравно ComboBox пропадает!

После еще пары-тройки идей решил сделать пару финтов ушами и вот тут то самое интересное!

Вернул прогу в первоначальный вариант.

1. Подключил другую мышку (была Tech --> стала Logitech) выяснилось, что эффекта пропадания ComboBox-ов и MaskEdit-ов не наблюдается. И вообще там колесико передает движение не самой полосе прокрутки, а перемещается область выделения ячеек. Все это происходило под WinXP.

2. Все работает "нормально" с обоими мышками на Win98. Причем при движении колесика срабатывает не полоса прокрутки, а передвигается область выделения Grid-а.

3. При работе с Win2000 вообще полный бардак! Logitech работает нормально правда движется не полоса прокрутки а сама область выделения, но у меня нету для нее драйверов и там стандартные использую. При подключении Tech раз на раз не приходится. Что с дровами от проихводителя, что со стандартными дровами из под виндов... Если в момент прокрутки мышкой не двигать, то все хорошо работает, но, опять же, действует не полоса прокрутки, а... (все то же эффект) движется область выделения, если в момент прокрутки колесика сдвинуть мышку, то событие "скрула" передается полосе прокрутки и ComboBox с MaskEdit-ом больше не показываются.

4. Теперь самое интересное и соответственно вывод!!! Убрал полосу прокрутки из StringGrid-а и... Какую мышку не подключал, в какой системе не работал - ничего не пропадает! Делаю единственный вывод, что ломается все из-за того что движение колесика передается именно полосе прокрутки.

Вот только что с этим делать ?!? Для меня пока - загадка.
Хотелось бы выслушать идеи!
PM MAIL   Вверх
Frees
Дата 9.12.2005, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

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



Если ты используеш grid для вывода данных из БД то есть Компонент TDBgrid в нем combo прикручивается легко, без всякого кодинга.

А если DBgrid не подходит, то тебе нужно у combobox родителем делать grid.

Мне так кажется, но может я и неправ.


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Gugle
Дата 9.12.2005, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



БД не могу использовать в связи со спецификой программы...
А проблема не в том кто родитель. Проблема, как я себе ее представляю, в перехвате событий. Полоса прокрутки захватывает окно и не отпускает его. Из-за этого не срабатывает функция Visible:=True у компонентов, которые встраивешь. Прокрутка по разному воспринимает событие скрула и клика по ней.
Это я себе так представляю!
PM MAIL   Вверх
Frees
Дата 9.12.2005, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

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



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



--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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