Форум: "KOL";
Текущий архив: 2003.06.30;
Скачать: [xml.tar.bz2];
ВнизНесколько вопросов и предложений ... Найти похожие ветки
← →
Alexander (2002-08-19 10:02) [0]1. TKOLListView: нужно добавить событие OnColumnRightClick, иначе как мне сделать для заголовков столбцов своё контекстное меню?
2. TKOLListView: как добраться до свойства Tag у TKOLListViewColumn?
3. нужно добавить св-во Tag для TKolMenuItem
← →
Vladimir Kladov (2002-08-20 10:18) [1]1. TKOLListView: нужно добавить событие OnColumnRightClick, иначе как мне сделать для заголовков столбцов своё контекстное меню?
Ладно, глянем.
2. TKOLListView: как добраться до свойства Tag у TKOLListViewColumn?
Его в run-time не существует как объекта.
3. нужно добавить св-во Tag для TKolMenuItem
Аналогично.
← →
Alexander (2002-08-22 08:50) [2]И ещё, может я что не так делаю:
Стоит мне добавить с имеющимся столбцам ещё один где-нибудь в середине, то их порядок сразу меняется и приходится вручную по порядку назначать им правильное положение (значение LVColOrder)
← →
Vladimir Kladov (2002-08-22 17:16) [3]Может быть, проект был создан давно, и колонки получили по какой-то причине порядковый номер? Тогда задействуется это свойство специально, чтобы нарушить порядок колонок. Вообще, если изначально номера колонок совпадают с порядком (или порядок везде -1), то такого быть не должно.
Тогда, например, если было две колонки, и между ними вставлена еще одна, то обращение считается по индексу, т.е. прежние колонки имеют номера 0 и 2.
← →
Alexander (2002-08-22 17:33) [4]Нет, всё делается с нуля. (Версия KOL последняя)
Вот последовательность действий при создании столбцов:
Add(0) -> LVColOrder[0]=0
Add(1) -> LVColOrder[0]=-1
LVColOrder[1]=1
Добавляю столбец между ними
Add(1) -> LVColOrder[0]=-1
LVColOrder[1]=1
LVColOrder[2]=0
И соответственно при запуске порядок: "0","2","1"
То есть тот столбец, который я добавил последним и добавляется последним! Независимо от того, куда я его добавил.
← →
Vladimir Kladov (2002-08-22 20:24) [5]Как это независимо?
ListView1.LVColInsert( 2, "aaaa", taLeft, 50 );
- вставляет перед второй,
а
ListView1.LVColInsert( 1, "aaaa", taLeft, 50 );
- перед первой.
Смена порядка - это просто изменение логического порядка колонок.
Чтобы ее визуально видеть как вторую, а обращаться по индексу 4, к примеру.
Не совсем понятно, что такое Add(n), но полагаю, это
LVColInsert(n,...). Все-таки, яне пойму, что не так. Мой тест показал, что все в порядке, и столбцы видны именно там, где ожидалось, и индекс совпадает с их визуальным порядком, как и должно бы быть. Я правда нигде не смотрел и не менял LVColOrder. Если его поменять до вставки, последствия уже целиком на том, кто его менял, в смысле, пусть и дальше меняет. Но ведь LVColOrder никто не менял?
← →
Alexander (2002-08-23 08:28) [6]В том то и дело, что я программно ничего не делаю!
Всё создаётся через MCK визуально и Add(n) означает, что я в
"ListView1 columns" нажимаю кнопку "Add", а (n) означает позицию столбца, куда вставляю.
Таким образом Add(0) - добавляю нулевой столбец,
Add(1) - добавляю второй столбец - теперь их два,
Add(1) - добавляю третий столбец между уже созданными.
Получается: визуально они у меня в редакторе в нужной последовательности "0","2","1", а на деле - "0","1","2".
Естественно, что кроме значения Caption я ничего руками не меняю.
← →
Vladimir Kladov (2002-08-24 11:07) [7]Руками в Object Inspector LVColOred установите в -1 для всех колонок.
← →
Alexander (2002-08-25 22:33) [8]Так я обсуждение с того и начал, что приходится вручную исправлять то, что по идее должно само устанавливаться.
И ещё: в версии 1.42 появилась установка RightClick для ListView, но я что-то не смог это использовать для вывода контекстного меню для заголовков столбцов - я что-то не так делаю иди это появилось для совсем других целей?
← →
Vladimir Kladov (2002-08-26 16:21) [9]Ну, мне не приходилось как-то. Посмотрю, что бывает. Просто я колонки в динамике не вставляю обычно.
Именно. OnClick, и смотрим PControl(Sender).RightClick. Координаты мыши GetCursorPos. Получить handle окна заголовка GetWindow(ListView.Handle, GW_CHILD ). Получить далее его координаты на экране GetWidowRect и проверить, что курсор в заголовке: PtInRect.
← →
Alexander (2002-08-26 21:13) [10]Понятно.
Раз уж я здесь затронул тему ListView, то здесь и буду продолжать:
у ListView свойство DoubleBuffered не работает корректно:
1. если ширина всех столбцов меньше ширины ListView, то их заголовки отрисовываются со смещением примерно (+1,+1)
2. если ширина всех столбцов больше, чем ширина ListView, то заголовки вообще не отрисовываются.
← →
Alexander (2002-09-06 09:42) [11]OK! предыдущие недочёты в версии 1.43 исправлены. Но...
1. Для ListView есть баг: если ширина всех столбцов больше, чем ширина ListView и число строк больше, чем высота ListView, то некорректно отрисовывается вертикальный скроллер (верхняя кнопка затирается)!
2. Есть св-во LVSortColunm - как можно сортировать в обратном порядке? Лучше, конечно создать событие OnSort(Column) для более гибкого управления процессом сортировки.
← →
Vladimir Kladov (2002-09-06 17:11) [12]
> 1. Для ListView есть баг: если ширина всех столбцов больше,
> чем ширина ListView и число строк больше, чем высота ListView,
> то некорректно отрисовывается вертикальный скроллер (верхняя
> кнопка затирается)!
Действительно, даже под 2К. Буду смотреть.
> 2. Есть св-во LVSortColunm - как можно сортировать в обратном
> порядке? Лучше, конечно создать событие OnSort(Column) для
> более гибкого управления процессом сортировки.
Несложно, добавлю событие. Но я надеюсь, вы в курсе, что требуется Windows2000 или Windows98, под более ранними сообщение LVM_SORTITEMSEX не поддерживается. А LVM_SORTITEMS какой-то умник в microsoft сделал так, что передается LVItemData[ Item ] вместо индекса Item в callback-функцию сравнения.
← →
Alexander (2002-09-11 09:18) [13]Продолжу ...
Под WinXP, если включить темы, то этот самый скроллер рисуется нормально.
А вот если при этом в программу включить поддержку этих тем (ну там xml файл в ресурсах), то KOLToolbar не рисуется никак! То есть на его месте просто чёрная полоса.
← →
Alexander (2002-09-20 11:30) [14]Ещё несколько вопросов:
1. Если у ListView включить опцию HeaderDragDrop, то можно перемещать столбцы, а как сохранить при выходе и восстановить при загрузке выбранное положение столбцов?
2. Как можно скрыть выбранные столбцы и потом показать, как это делается в проводнике Windows? (c сохранением при выходе и восстановлением при запуске). Сделать нулевую ширину - выход, но не самый красивый.
← →
Alexander (2002-09-20 13:33) [15]Ещё интересная вещь.
есть у меня пункт меню menuJobsс подменю, который вначале невидим. Также все его подменю задизаблены. Я написал такой код:
procedure TFormMain.lvQueueEnter(Sender: PObj);
begin
menuMain.Items[menuJobs].Visible := True;
end;
В результате после запуска программы у меня этот пункт становится видимым! А ведь не должен быть. Кроме этого все его подпункты доступны (т.е. Ensbled = True), хотя я задавал противоположное значение.
Размещение строчки
menuMain.Items[menuJobs].Visible := True;
в другом месте программы даёт ожидаемый результат (в смысле появления пункта меню).
← →
Vladimir Kladov (2002-09-20 16:31) [16]
> Alexander © (20.09.02 11:30)
> Ещё несколько вопросов:
> 1. Если у ListView включить опцию HeaderDragDrop, то можно
> перемещать столбцы, а как сохранить при выходе и восстановить
> при загрузке выбранное положение столбцов?
LVColOrder
> 2. Как можно скрыть выбранные столбцы и потом показать,
> как это делается в проводнике Windows? (c сохранением при
> выходе и восстановлением при запуске). Сделать нулевую ширину
> - выход, но не самый красивый.
Никак. Только удалить их вообще.
> Alexander © (20.09.02 13:33)
> Ещё интересная вещь.
> есть у меня пункт меню menuJobsс подменю, который вначале
> невидим. Также все его подменю задизаблены. Я написал такой
> код:
> procedure TFormMain.lvQueueEnter(Sender: PObj);
> begin
> menuMain.Items[menuJobs].Visible := True;
> end;
> В результате после запуска программы у меня этот пункт становится
> видимым! А ведь не должен быть.
Почему? если lvQueue получает фокус, то как раз должен. Даже если
фокус у него тут же теряется.
> Кроме этого все его подпункты доступны (т.е. Ensbled = True),
> хотя я задавал противоположное значение.
> Размещение строчки
> menuMain.Items[menuJobs].Visible := True;
> в другом месте программы даёт ожидаемый результат (в смысле
> появления пункта меню).
Нашел причину и способ исправить. Нельзя через TopParent с сосотоянием пункта работать, только с Parent.
← →
Alexander (2002-09-20 16:47) [17]и всё-таки Enter событие у ListView вызывается некорректно:
у меня на форме есть панель, на ней ListView.
Panel.Visible = False;
но когда я на программу переключаюсь из другой программы, то OnEnter обрабатывается!
У меня и в примере выше тот ListView невидим.
← →
Alexander (2002-09-22 12:23) [18]Ещё недостаток: если поставить HeaderDragDrop, то после этого заголовки столбцов не нажимаются! Нет, всё обрабатывается корректно, и нажатия в том числе, но это ведь нестандартное поведение, т.к. в Windows все столбцы, в том числе и перемещаемые, нажимаются визуально.
← →
Vladimir Kladov (2002-09-23 17:06) [19]
> и всё-таки Enter событие у ListView вызывается некорректно:
> у меня на форме есть панель, на ней ListView.
> Panel.Visible = False;
> но когда я на программу переключаюсь из другой программы,
> то OnEnter обрабатывается!
>
> У меня и в примере выше тот ListView невидим.
Это даже поправимо . Достаточно поставить в DoSetFocus еще и проверку на ToBeVisible. Вопрос в том, нужна ли такая проверка в большинстве приложений. Например, с случае, если OnEnter не используется, DoSetFocus все равно имеет место. Увеличение кода на 12 байт - всего ничего. Но ведь, зная о таком поведении, можно было одновременно с видимостью панели, управлять и ее состоянием Enabled. Ваш код сильно бы не разбух, а код приложений, в которых OnEnter не задействуется, был бы на 12 байт меньше.
> Ещё недостаток: если поставить HeaderDragDrop, то после
> этого заголовки столбцов не нажимаются! Нет, всё обрабатывается
> корректно, и нажатия в том числе, но это ведь нестандартное
> поведение, т.к. в Windows все столбцы, в том числе и перемещаемые,
> нажимаются визуально.
У меня нажимаются нормально. Проверил в Win2K и Win95 под VmWare. И перетаскиваются нормально при этом.
← →
Alexander (2002-09-25 13:54) [20]>У меня нажимаются нормально. Проверил в Win2K и Win95 под VmWare.
>И перетаскиваются нормально при этом.
Долго возился, чтобы повторить и выяснить причину. Создавал новый проект - всё работает! Но кто ищёт ...
В общем кидаем на форму панель с DoubleBuffered := True, на неё ListView с DoubleBuffered = False, ставим HeaderDragDrop и смотрим:
столбцы нажиматься перестали и при перетаскивании не рисуется синенький указатель нового положения.
Ещё вопросы:
1. как при клике на столбце сделать обратную сортировку?
2. (Это просто к сведению, или на будущее) Было бы не плохо реализовать возможность добавления строки целиком (через array of string?).
← →
Alexander (2002-09-27 13:26) [21]Может стоит добавить в LVSortColumn второй параметр - сортировать по возрастанию или убыванию и сделать его с дефолтовым значением для совметимости.
← →
Alexander (2002-10-08 10:43) [22]А DoubleBuffered так и не работает корректно для ListView!
При True не нажимаются визуально столбцы, а недавно - может сегодня, после обновления KOL у меня и форма перестала закрываться после клика на заголовке столбца для ListView с DoubleBuffered=True.
И ещё - человек по своей сути (а программисты особенно) ленив - нельзя ли всё-таки сделать событие OnColumnRightClick?
← →
Vladimir Kladov (2002-10-10 09:21) [23]А я и не знал, что форма должна закрываться после клика на заголовке столбца :(
Хотя у меня закрывается без проблем. И собственно, при чем тут-то
DoubleBuffered ? Он только на внешний вид может влиять. Если найду, как исправить, исправлю.
← →
Alexander (2002-10-10 09:48) [24]>А я и не знал, что форма должна закрываться после клика на заголовке столбца :(
Нет, я сначала кликаю на заголовке столбца ListView с DoubleBuffered=True, а потом моя форма не закрывается при клике на "Х". при DoubleBuffered=False всё нормально.
← →
Vladimir Kladov (2002-10-11 09:28) [25]А, понятно. Ну, ждите следующей версии. Или в kol.pas в строке примерно 41942 (номер мог уже поехать от предыдущей версии) закомментарьте WM_PAINT в обработчике WndFuncPreventDraw.
Да, насчет LVSortColumn. Эта вещь OS-зависима. В 95 и NT4 не идет. Плохо, конечно. Но если к примеру listview виртуальный, и реальные данные содержатся в отдельном массиве (TList, TStrList, TStrListEx, TDirList), то лучше отсортировать этот список, и просто сделать Invalidate.
VCL выходит из этой ситуации просто. Для каждого элемента в listview его Data хранит указатель на свой экземпляр объекта TListItem.
Громоздко, но тогда работает LVM_SORTITEMS, который OS-независим.
← →
Alexander (2002-10-23 05:43) [26]Задал я для ListView HeagerDragDrop и захотелось мне сохранить положение столбцов:
procedure TFormMain.frmMainClose(Sender: PObj; var Accept: Boolean);
var
RegKey: HKey;
I: Integer;
begin
RegKey := RegKeyOpenCreate(HKEY_CURRENT_USER, ...);
if (RegKey <> 0) then
begin
for I := 0 to lvQueue.LVColCount - 1 do
RegKeySetStr(RegKey, "lvQueue_Col" + Int2Str(I), Int2Str(lvQueue.LVColOrder[I]));
RegKeyClose(RegKey);
end;
end;
и что же я получаю? Ничего!
Пишется вот что (1393680, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2) - у меня 11 столбцов. Первая цифра незначительно меняется а остальные отаются неизменными даже если я их двигал.
← →
Vladimir Kladov (2002-10-24 15:37) [27]Пардон. Ошибка в индексе к полю. Поправлю.
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2003.06.30;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.008 c