Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#16: 2009-08-01 14:02:00 ЛС | профиль | цитата
bzq-79-182-23-181.red.bez это я.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 1926
Рейтинг: 172
#17: 2009-08-01 15:19:22 ЛС | профиль | цитата
Tad, а в чём разница? И там и там - ListView, в IC я получаю указатель PControl и ставлю на этот контрол флажки. Если флажков много - начинается тормоз

А вот если флажки стандартные, т.е. CheckBoxes у таблицы true и она сама делат свои флажки, то можно добавлять много строк, и ничего не тормозит.
Почему так? В чём отличие флажков?
карма: 9
0
Разработчик
Ответов: 26135
Рейтинг: 2126
#18: 2009-08-01 16:36:59 ЛС | профиль | цитата
3042 писал(а):
Почему так? В чём отличие флажков?

В том, что каждый контрол требует своего обработчика событий, который, явно отнимает системное время, иногда, до нескольких десятков мсек, что не скажешь об одном контроле с одним обработчиком отрисовки. Помотри, как релизован иетод отрисовки флажков в MTS_DrawManager-e, отрисовка происходит только области, где происходит изменение, а не всей таблицы, со всеми флажками. И еще, таблица не предоставляет место под другие флажки, кроме 0-го столбца. А вообще, для таких целей рекумендуется разобрать полную отрисовку в MTS_DrawManager-e и сделать свою, по аналогии, если уж очень надо, но вот как организовать матрицу флажков с произвольным доступом, я не знаю, изначально, это не предусматривается в самом классе контрола
карма: 22

0
Ответов: 1926
Рейтинг: 172
#19: 2009-08-01 19:45:14 ЛС | профиль | цитата
nesco писал(а):
отрисовка происходит только области, где происходит изменение


Значит, делаю следующим образом.
Создаю список

ArrayOfCB := NewList;[/code]

Заполняю флажками видимую часть, если там есть строки.


if TableCtl.LVCount < TableCtl.LVPerPage then
while ArrayOfCB.Count < TableCtl.LVCount do
begin
r := TableCtl.LVItemRect(TableCtl.LVTopItem + ArrayOfCB.Count, lvipBounds);
ArrayOfCB.Add(NewCheckbox(TableCtl,'));
PControl(ArrayOfCB.Items[ArrayOfCB.Count-1]).Style := PControl(ArrayOfCB.Items[ArrayOfCB.Count-1]).Style or BS_FLAT;
PControl(ArrayOfCB.Items[ArrayOfCB.Count-1]).width := 13;
PControl(ArrayOfCB.Items[ArrayOfCB.Count-1]).height := 13;
PControl(ArrayOfCB.Items[ArrayOfCB.Count-1]).left := TableCtl.LVColWidth[0] + (TableCtl.LVColWidth[1] div 2) - 7;
PControl(ArrayOfCB.Items[ArrayOfCB.Count-1]).top := r.top;
PControl(ArrayOfCB.Items[ArrayOfCB.Count-1]).Show;
end;

Это происходит в обработчике OnLVCustomDraw.
В этом же обработчике выполнятся:


while (ArrayOfCB.Count > 0) and (ArrayOfCB.Count > TableCtl.LVCount) do
begin

PControl(ArrayOfCB.Items[ArrayOfCB.Count-1]).Free;
ArrayOfCB.Delete(ArrayOfCB.Count-1);
end;
Но когда нажимаю Очистить таблицу, тогда возникает runtime error.
карма: 9
0
Разработчик
Ответов: 26135
Рейтинг: 2126
#20: 2009-08-01 21:45:29 ЛС | профиль | цитата
3042, а где ты сам ArrayOfCB уничтожаешь
карма: 22

0
Ответов: 1926
Рейтинг: 172
#21: 2009-08-02 07:59:08 ЛС | профиль | цитата
nesco, нигде. Я писал:

destructor THiAsmClass.Destroy;
var i:integer;
begin
for i:=0 to ArrayOfCB.Count do PControl(ArrayOfCB.Items[i]).Free;
ArrayOfCB.Free;
inherited Destroy;
end;

Но если таблицу перед выходом не очистить (т.е. когда флажки есть), то возникает runtime eroor при выходе.

Однако я, кажется, понял, в чём там было дело.
В моих циклах while уничтожались и создавались флажки в зависимости от количества строк таблицы. И после удаления каждого из флажков шла перерисовка и вновь запускалось событие TableRepait, в котором вновь происходил вход в циклы.
То есть, один и тот же цикл мог запуститься много раз.

Теперь в самом начале обработчика отрисовки я пишу:

TableCtl.OnLVCustomDraw := nil;[/code]
Это значит, что обработчика отрисовки больше нет. То есть, когда первый раз запускается обработчик, больше запуститься он уже не может.

А в конце обработчика я пишу:
TableCtl.OnLVCustomDraw := TableRePaint;[/code]

То есть назначаю тот же самы обработчик отрисовки вновь.
Таким образом, пока не закончатся все циклы в обработчике, вновь запущен он не будет.

[size=-2]------ Добавлено в 07:59 [/size]
Спасибо всем, кто мне помогал
карма: 9
0
21
Сообщение
...
Прикрепленные файлы
(файлы не залиты)