![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Программный выбор пункта в 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.