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

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

Программный выбор пункта в KOLListView [Delphi, Windows]


dimaxx ©   (2004-11-19 00:08:00) 

KOLListView динамически заполняется древовидными данными (наподобие файлов и папок). При входе в "папку" нужно выделить самый верхний пункт. Вроде бы задача простая, но не тут-то было! Выбор произвожу также, как и в VCL, а именно:

ListView.LVCurItem:=0;

Заметил такую особенность: если пункт-папка (в которую вошел пользователь) имеет индекс (номер) больше, чем кол-во вновь выведенных данных, то самый верхний пункт имеет только фокус (обведен точечной рамкой), но не выбран. Если кол-во вновь выведенных данных больше, чем индекс, то производится нормальный выбор пункта.

Например, выведено 10 пунктов-папок. Пользователь дважды щелкает по 6-му пункту. Далее производится выборка данных для этой папки. Допустим, нашли и вывели 4 пункта. Самый верхний будет только обведен рамкой, но не выбран. Если будет найдено 7 и более пунктов для данной папки, то верхний пункт нормально отображается полосой и точеченой рамкой одновременно (обычный выбор).

Вопрос: как сделать, чтоб всегда правильно выбирался пункт?

Если кому не совсем понятно о чем речь, то могу набросать пример и выложить (если найду где).


z007   (2004-12-28 01:11:00) [1]

Нифига! В VCL'овском все нормально - проверено
VCL, однако, это не беспокоит


Совершенно зря вы здесь, уважаемый Speller, указываете на VCL, вроде бы речь в вопросе идет про KOL; и насчет "нифига", дорогой dimaxx, полагаю, поторопились:

Все-таки попробуйте добиться того, чего вы хотите от explorer'а (когда Вид=Список).
У меня не получилось.

По существу заясняю:)

1. ТЕОРИЯ
ListView кроме item'ов имеет и т.н. пустую область, по которой и происходит последний щелчок (DOWN) при DBLCLICK. Поэтому (грубо говоря)область Item'ов теряет STATE выделения (LVIS_SELECTED), хотя LVIS_FOCUSED при этом сохраняется.
Где-то так, хотя это примерно.

2. ХХХ
В VCL так не происходит по той причине, что WM_LBUTTONDBLCLK для ListView тупо не обрабатывается и "эффект последнего щелчка" не возникает.
Поэтому и Item остается выделенным :)

3. ПРИМЕР (в VCL  все это сделано, конечно, похитрее...):
functionTForm1.LVMessage( varMsg: tagMSG; varRslt: Integer): Boolean;
varMouseData: TMouseEventData;
begin
Result:=False;
IF MSG. message= WM_LBUTTONDBLCLK {оно самое!} THEN
begin
  //подменяем двойной клик на подъем мышки
  LV.Perform(WM_LBUTTONUP, 0, Msg.lParam);
  //Вызываем то, что хотим выполнить на OnMouseDblClk
  LVMouseDblClk(LV,MouseData);
  Result:=tRUE;//Rslt:=1;
end;
end;


dimaxx   (2004-12-26 19:29:00) [2]

Но почему тогда он выделяется, если количество новых итемов больше, чем номер выбранного до этого, а если меньше, то не выделяется? Вот это мне непонятно. Если бы всегда не выделялось, еще можно понять, но такое вот неопределенное состояние удивляет...


SPeller   (2004-12-26 19:24:00) [3]

ListView не multiselect. Я попробовал и CurItem = -1, и LVM_SETITEMCOUNT, и CurItem = 0 перед очичткой, и = 100, по всякому. Не хочет. Флаг LVIS_FOCUSED устанавливается нормально, а вот LVIS_SELECTD нет. Итем ни в какую не хочет становиться выделенным.


Владимир Кладов   (2004-12-26 19:09:00) [4]

вообще, есть разница между Selected и Focused. Если вам надо, вы можете управлять и тем и другим. Для multiselect-listview имеет смысл прежде чем делать новое выделение, старое снимать (LVCurItem := -1).


SPeller   (2004-12-26 19:04:00) [5]

Я пока не знаю как лечить. Надо ковыряться долго. Но НГ и сессия на носу, времени в обрез :)


SPeller   (2004-12-26 19:03:00) [6]

Похоже что проблема действительно в дабл-клике. VCL, однако, это не беспокоит. Я так думаю что проблема кроется где-то либо в стилях списка, либо в инициализации этого списка (InitCommonControls и т.п.). Интересное поведение....


dimaxx   (2004-12-26 13:07:00) [7]

Нифига! В VCL'овском все нормально - проверено.


z007   (2004-12-26 02:09:00) [8]

Если правильно понимаю, такой же эффект наблюдается в Explorer'е - значит так и предусмотрено в ListView.

Причина - в двойном щелчке.

Попробуй использовать один (можно с таймером, чтобы казалось, что их два) или корректировать фокус на MouseUp (оно происходит, кажется, после DBLClick).


dimaxx   (2004-12-25 22:21:00) [9]

Ушло на это мыло...


SPeller   (2004-12-25 08:09:00) [10]

Меня долго небыло, я и забыл совсем. Но на почту мне ничего не пришло. Скинь ещё раз, если ещё актуально, на speller_@_yandex.ru (без прочерков).


dimaxx   (2004-12-24 22:37:00) [11]

SPeller - как с проверкой дела?


Dimaxx   (2004-11-20 14:44:00) [12]

Лови - ушло на анкетное мыло.


SPeller   (2004-11-19 04:59:00) [13]

Скинь мне на мыло.


Dimaxx   (2004-11-19 00:10:00) [14]

Да совсем забыл дописать. ListView находится в режиме lvsDetail.


Наверх

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