Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-97797
ГОСТ
2003-06-10 01:42
2003.06.30
Будут ли отменены госты


14-97868
Ozrik
2003-06-13 12:59
2003.06.30
Подскажите хороший учебник по Делфи


14-97792
Кен
2003-06-09 02:11
2003.06.30
Как получить инфразвук в домашних условиях. Хочу послушать его.


11-97574
Drin
2002-09-29 14:33
2003.06.30
VCL or KOL


6-97769
Nigger
2003-04-25 02:25
2003.06.30
WInSock API???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский