Форум: "KOL";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];
ВнизПрограммный выбор пункта в 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 вся ветка
Форум: "KOL";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.033 c