Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.31;
Скачать: CL | DM;

Вниз

Программный выбор пункта в KOLListView   Найти похожие ветки 

 
dimaxx ©   (2004-11-19 00:08) [0]

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

ListView.LVCurItem:=0;

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

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

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

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


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

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


 
SPeller ©   (2004-11-19 04:59) [2]

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


 
Dimaxx ©   (2004-11-20 14:44) [3]

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


 
dimaxx ©   (2004-12-24 22:37) [4]

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


 
SPeller ©   (2004-12-25 08:09) [5]

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


 
dimaxx ©   (2004-12-25 22:21) [6]

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


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

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

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

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


 
dimaxx ©   (2004-12-26 13:07) [8]

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


 
SPeller ©   (2004-12-26 19:03) [9]

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


 
SPeller ©   (2004-12-26 19:04) [10]

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


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

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


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

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


 
dimaxx ©   (2004-12-26 19:29) [13]

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


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

Нифига! В 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  все это сделано, конечно, похитрее...):
function TForm1.LVMessage(var Msg: tagMSG; var Rslt: Integer): Boolean;
var MouseData: 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;



Страницы: 1 вся ветка

Текущий архив: 2005.07.31;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.15 c
1-1121078051
nastya
2005-07-11 14:34
2005.07.31
TMessage


9-1113321975
Kobik
2005-04-12 20:06
2005.07.31
Физика или шизика для аркады?


8-1111916202
C
2005-03-27 13:36
2005.07.31
Прозрачная текстура в OpenGL


14-1121195396
WondeRu
2005-07-12 23:09
2005.07.31
Свобода = Одиночество?


1-1120919808
Igor_thief
2005-07-09 18:36
2005.07.31
Как изменить ширину полосы прокрутки в ListBox?