![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Несколько вопросов и предложений ...
Alexander © (2002-08-19 10:02:00)1. TKOLListView: нужно добавить событие OnColumnRightClick, иначе как мне сделать для заголовков столбцов своё контекстное меню?
2. TKOLListView: как добраться до свойства Tag у TKOLListViewColumn?
3. нужно добавить св-во Tag для TKolMenuItem
Vladimir Kladov (2002-10-24 15:37:00) [1]Пардон. Ошибка в индексе к полю. Поправлю.
Alexander (2002-10-23 05:43:00) [2]Задал я для 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-11 09:28:00) [3]А, понятно. Ну, ждите следующей версии. Или в 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-10 09:48:00) [4]>А я и не знал, что форма должна закрываться после клика на заголовке столбца :(
Нет, я сначала кликаю на заголовке столбца ListView с DoubleBuffered=True, а потом моя форма не закрывается при клике на "Х". при DoubleBuffered=False всё нормально.
Vladimir Kladov (2002-10-10 09:21:00) [5]А я и не знал, что форма должна закрываться после клика на заголовке столбца :(
Хотя у меня закрывается без проблем. И собственно, при чем тут-то
DoubleBuffered ? Он только на внешний вид может влиять. Если найду, как исправить, исправлю.
Alexander (2002-10-08 10:43:00) [6]А DoubleBuffered так и не работает корректно для ListView!
При True не нажимаются визуально столбцы, а недавно - может сегодня, после обновления KOL у меня и форма перестала закрываться после клика на заголовке столбца для ListView с DoubleBuffered=True.
И ещё - человек по своей сути (а программисты особенно) ленив - нельзя ли всё-таки сделать событие OnColumnRightClick?
Alexander (2002-09-27 13:26:00) [7]Может стоит добавить в LVSortColumn второй параметр - сортировать по возрастанию или убыванию и сделать его с дефолтовым значением для совметимости.
Alexander (2002-09-25 13:54:00) [8]>У меня нажимаются нормально. Проверил в Win2K и Win95 под VmWare.
>И перетаскиваются нормально при этом.
Долго возился, чтобы повторить и выяснить причину. Создавал новый проект - всё работает! Но кто ищёт ...
В общем кидаем на форму панель с DoubleBuffered := True, на неё ListView с DoubleBuffered = False, ставим HeaderDragDrop и смотрим:
столбцы нажиматься перестали и при перетаскивании не рисуется синенький указатель нового положения.
Ещё вопросы:
1. как при клике на столбце сделать обратную сортировку?
2. (Это просто к сведению, или на будущее) Было бы не плохо реализовать возможность добавления строки целиком (через array of string?).
Vladimir Kladov (2002-09-23 17:06:00) [9]
> и всё-таки Enter событие у ListView вызывается некорректно:
> у меня на форме есть панель, на ней ListView.
> Panel.Visible = False;
> но когда я на программу переключаюсь из другой программы,
> то OnEnter обрабатывается!
>
> У меня и в примере выше тот ListView невидим.
Это даже поправимо . Достаточно поставить в DoSetFocus еще и проверку на ToBeVisible. Вопрос в том, нужна ли такая проверка в большинстве приложений. Например, с случае, если OnEnter не используется, DoSetFocus все равно имеет место. Увеличение кода на 12 байт - всего ничего. Но ведь, зная о таком поведении, можно было одновременно с видимостью панели, управлять и ее состоянием Enabled. Ваш код сильно бы не разбух, а код приложений, в которых OnEnter не задействуется, был бы на 12 байт меньше.
> Ещё недостаток: если поставить HeaderDragDrop, то после
> этого заголовки столбцов не нажимаются! Нет, всё обрабатывается
> корректно, и нажатия в том числе, но это ведь нестандартное
> поведение, т.к. в Windows все столбцы, в том числе и перемещаемые,
> нажимаются визуально.
У меня нажимаются нормально. Проверил в Win2K и Win95 под VmWare. И перетаскиваются нормально при этом.
Alexander (2002-09-22 12:23:00) [10]Ещё недостаток: если поставить HeaderDragDrop, то после этого заголовки столбцов не нажимаются! Нет, всё обрабатывается корректно, и нажатия в том числе, но это ведь нестандартное поведение, т.к. в Windows все столбцы, в том числе и перемещаемые, нажимаются визуально.
Alexander (2002-09-20 16:47:00) [11]и всё-таки Enter событие у ListView вызывается некорректно:
у меня на форме есть панель, на ней ListView.
Panel.Visible = False;
но когда я на программу переключаюсь из другой программы, то OnEnter обрабатывается!
У меня и в примере выше тот ListView невидим.
Vladimir Kladov (2002-09-20 16:31:00) [12]
> 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 13:33:00) [13]Ещё интересная вещь.
есть у меня пункт меню menuJobsс подменю, который вначале невидим. Также все его подменю задизаблены. Я написал такой код:
procedure TFormMain.lvQueueEnter(Sender: PObj);
begin
menuMain.Items[menuJobs].Visible := True;
end;
В результате после запуска программы у меня этот пункт становится видимым! А ведь не должен быть. Кроме этого все его подпункты доступны (т.е. Ensbled = True), хотя я задавал противоположное значение.
Размещение строчки
menuMain.Items[menuJobs].Visible := True;
в другом месте программы даёт ожидаемый результат (в смысле появления пункта меню).
Alexander (2002-09-20 11:30:00) [14]Ещё несколько вопросов:
1. Если у ListView включить опцию HeaderDragDrop, то можно перемещать столбцы, а как сохранить при выходе и восстановить при загрузке выбранное положение столбцов?
2. Как можно скрыть выбранные столбцы и потом показать, как это делается в проводнике Windows? (c сохранением при выходе и восстановлением при запуске). Сделать нулевую ширину - выход, но не самый красивый.
Alexander (2002-09-11 09:18:00) [15]Продолжу ...
Под WinXP, если включить темы, то этот самый скроллер рисуется нормально.
А вот если при этом в программу включить поддержку этих тем (ну там xml файл в ресурсах), то KOLToolbar не рисуется никак! То есть на его месте просто чёрная полоса.
Vladimir Kladov (2002-09-06 17:11:00) [16]
> 1. Для ListView есть баг: если ширина всех столбцов больше,
> чем ширина ListView и число строк больше, чем высота ListView,
> то некорректно отрисовывается вертикальный скроллер (верхняя
> кнопка затирается)!
Действительно, даже под 2К. Буду смотреть.
> 2. Есть св-во LVSortColunm - как можно сортировать в обратном
> порядке? Лучше, конечно создать событие OnSort(Column) для
> более гибкого управления процессом сортировки.
Несложно, добавлю событие. Но я надеюсь, вы в курсе, что требуется Windows2000 или Windows98, под более ранними сообщение LVM_SORTITEMSEX не поддерживается. А LVM_SORTITEMS какой-то умник в microsoft сделал так, что передается LVItemData[ Item ] вместо индекса Item в callback-функцию сравнения.
Alexander (2002-09-06 09:42:00) [17]OK! предыдущие недочёты в версии 1.43 исправлены. Но...
1. Для ListView есть баг: если ширина всех столбцов больше, чем ширина ListView и число строк больше, чем высота ListView, то некорректно отрисовывается вертикальный скроллер (верхняя кнопка затирается)!
2. Есть св-во LVSortColunm - как можно сортировать в обратном порядке? Лучше, конечно создать событие OnSort(Column) для более гибкого управления процессом сортировки.
Alexander (2002-08-26 21:13:00) [18]Понятно.
Раз уж я здесь затронул тему ListView, то здесь и буду продолжать:
у ListView свойство DoubleBuffered не работает корректно:
1. если ширина всех столбцов меньше ширины ListView, то их заголовки отрисовываются со смещением примерно (+1,+1)
2. если ширина всех столбцов больше, чем ширина ListView, то заголовки вообще не отрисовываются.
Vladimir Kladov (2002-08-26 16:21:00) [19]Ну, мне не приходилось как-то. Посмотрю, что бывает. Просто я колонки в динамике не вставляю обычно.
Именно. OnClick, и смотрим PControl(Sender).RightClick. Координаты мыши GetCursorPos. Получить handle окна заголовка GetWindow(ListView.Handle, GW_CHILD ). Получить далее его координаты на экране GetWidowRect и проверить, что курсор в заголовке: PtInRect.
Alexander (2002-08-25 22:33:00) [20]Так я обсуждение с того и начал, что приходится вручную исправлять то, что по идее должно само устанавливаться.
И ещё: в версии 1.42 появилась установка RightClick для ListView, но я что-то не смог это использовать для вывода контекстного меню для заголовков столбцов - я что-то не так делаю иди это появилось для совсем других целей?