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

Вниз

Проблема с TListView   Найти похожие ветки 

 
Smart   (2003-07-08 07:25) [0]

Доброго время суток, мастера! У меня возникла проблема с TListView. Ситуация такая: есть тип - запись с четырьмя полями типа String[255], поле Data каждого итема ListView"а заполняется указателем на структуру такого типа. Caption и SubItem"ы каждого итема заполняются по событию OnAdvancedCustomDraw* значениями из структур, указанных в поле Data. (Item.Caption := PMyRecord(Item.Data)^.Str1 и т.д. и т.п.). Данные отображаются корректно, НО SubItem"ы очень явно, непрекрыто и мерзко мерцают (по всей видимости постоянно перерисовываются), тогда как сам итем (первый столбец) отображается нормально. Пробовал запихивать ListView.Items.BeginUpdate и EndUpdate куда только можно, в некоторых случаях SubItem"ы не вырисовывались вообще вместе с сеткой, в некоторых начинал мерцать весь ListView в целом. Вопрос: как избавиться от этого мерцания?
PS извините за корявость изложения


 
wl ©   (2003-07-08 13:05) [1]

По моему сделано как-то через зад... извините...
Зачем хранить указатели на структуру? Значения полей записи можно получить из Caption и SubItem"s.
Зачем рисовать эти значения в методе [OnAdvancedCustomDraw]?
Они что, сами не отображаются?


 
Юрий Федоров ©   (2003-07-08 13:08) [2]

Хранить указатель на структуру - это нормально.
А вот присваивать Caption и SubItem"ы нужно по добавлению item"а в ListView


 
wl ©   (2003-07-08 13:35) [3]

Хранить указатели в Data это конечно хорошо и удобно, но не в этом случае. Я имел в виду, что он хранит эти 4 строки только для того, чтобы их отобразить, и всё.


 
Smart ©   (2003-07-08 20:31) [4]

>wl
С чего вы это взяли? В том-то и дело, что НЕ просто отбражаются, а отображаются в зависимости от значений структуры. При этом исходные значения надо сохранить в их исходном виде. ИМХО отображать в конечном user-friendly виде, а потом при сохранении, скажем в файл, преобразовывать обратно - это как раз и есть через зад...


 
Юрий Зотов ©   (2003-07-08 21:04) [5]

> Smart (08.07.03 07:25)

У TListView есть режим vsReport. В нем отображение идет в виде таблицы с колонками: Item.Caption, затем все SubItem"ы. И не надо никаких OnXXXDraw, и моргать ничего не будет. И, вполне возможно, не понадобится никаких дополнительных Record"ов. Просто при добавлении Item"а заполняете все колонки - вот и все.


 
Smart ©   (2003-07-09 07:42) [6]

>Юрий Зотов

Да он у меня и так в режиме vsReport, я не на столько чайник, насколько может показаться. Попробую объяснить еще раз. Допустим я гружу N Record"ов из файла в ListView для редактирования, НО данные отображаются НЕ в том виде, в каком они лежали в файле (например банальное if S = "" then Caption := "[нет данных]"; или Caption := "[по умолчанию]";, но, скажу по секрету планируются более изощренные преобразования). Если так сделать, то при сохранении обратно в файл придется делать обратные преобразования, чего я и хочу избежать.
Ведь OnAdvancedCustomDrawSubitems помоему у служит для этих целей. Я там не делаю ничего замороченного. Даже если я просто пишу Item.SubItems[SubItem-1] := "test"; появляется мерцание. Есть подозрение, что вызывается еще какой-то On*Draw*, который я не обрабатываю и он попеременно с моим заполняет ячейку пустотой.
Ну что, будут еще соображения?


 
wl ©   (2003-07-09 08:57) [7]

Ну хорошо, пусть записи хранятся в поле Data, а в Caption и SubItems заполняй значениями, который будет видеть пользователь. Тогда при сохранении будешь использовать то, что находится в поле Data, а на экране ничего мерцать не будет. Изменения и вставки новых элементов мне кажется можно отловить с помощью OnChang..., OnInsert, и в них опять преобразовать строки к нужному виду.
А OnAdvancedCustomDrawSubitems больше подойдёт в том случае, если каждую букву слова нужно раскрасить по своему и написать другим шрифтом(IMHO).
Чтобы отследить, какие Draw"ы пропускаешь, попробуй создать обработчики на все On...Draw, какие только есть и поставь там BreakPoint"s.


 
Smart ©   (2003-07-09 09:09) [8]

>wl
А если я хочу каждую букву слова разкрасить?


 
wl ©   (2003-07-09 09:16) [9]

Оке, уговорил, запускаю Delphi, попробую посмотреть....


 
Семен Сорокин ©   (2003-07-09 09:59) [10]

Smart (08.07.03 07:25)
уж если делаешь в OnAdvancedCustomDraw то не присваивай Item.Caption, а то он вызывает опять этот обработчик, а рисуй на канве, для этого этот обработчик и предназначен.


 
wl ©   (2003-07-09 10:18) [11]

Семен Сорокин, ты сто раз прав. Если делать просто рисование на канве, то никакого мерцания нет и в помине.


 
wl ©   (2003-07-09 10:18) [12]

Семен Сорокин, ты прав на 100%. Если делать просто рисование на канве, то никакого мерцания нет и в помине.


 
Smart ©   (2003-07-09 10:20) [13]

>wl © (09.07.03 09:16)

жду с нетерпением... :)


 
Smart ©   (2003-07-09 10:24) [14]

Тьфу! поздно запостил.

На канфе рисовать - такой гемор, имхо. Надо саму все вымерять, Caption постоянно на SubItem"ы залезает... Мне ведь нужно ведь только Caption подменить, а потом путь Delphi сам его рисует как хочет... эх, ладно, беду мучиться дальше, но вопрос остается в силе.


 
wl ©   (2003-07-09 10:34) [15]

Smart, там всё просто рисуется на самом деле, вот примерчик

type
PRec = ^TRec;
TRec = record
a:Array[1..4] of String;
end;
........
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState;
var DefaultDraw: Boolean);
Var r : PRec;
r1: TRect ;
begin
r := Item.Data;
r1 := Item.DisplayRect(drLabel);
Sender.Canvas.TextRect(r1,r1.Left,r1.Top,r.a[SubItem+1]);
end;


Ну и конечно надо шрифты подправить, и тексты из записи(r), но это уже мелочи. TextRect корректно всё отображает в заданном прямоугольнике.



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

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

Наверх




Память: 0.51 MB
Время: 0.019 c
14-67961
J_S
2003-07-02 19:03
2003.07.21
Создание комонентов в Run-Time


1-67754
Иван
2003-07-08 17:47
2003.07.21
Как называется функция задержки по времени?


1-67902
Прямой
2003-07-05 04:57
2003.07.21
Вопросик по нестандартному использованию таймера


3-67738
xShadow
2003-06-29 18:15
2003.07.21
TQuery получение имён полей...


1-67786
Wen
2003-07-08 15:08
2003.07.21
Поиск слова по маске