![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
рисование компонент [D6, XP]
mnj © (2009-04-01 17:40:00)Доброго дня.
Помогите, пожалуйста с такой штукой:
Нужно нарисовать матрицу из панелек
(цвет - индикация величины, пока не сделано)
по значениям из динамического массива
Это:
SetLength(Blocks,NumberOfRows,NumberOfBlocks);
for I:= 1 to NumberOfRows do
begin
for K:= 1 to NumberOfBlocks do
begin
Blocks[i-1,k-1]:= TPanel.Create(Self);
with Blocks[i-1,k-1] do
begin
Parent:= pnModel;
Left:= 20+(K-1)*15;
Top:= 20+(I-1)*20;
Width:= 15;
Height:= 20;
Color:= clBlue;
Tag:= I*10+K;
end; {of with}
end;
end;
рисует медленно и с мерцанием. Можно ли сделать это быстрее и без мерцания?
И второй вопрос - как обрабатывать события компонентов, созданных во время выполнения, как в моем случае?
Игорь Шевченко (2009-04-04 19:11:00) [1]KilkennyCat © (04.04.09 04:06) [25]
Овчинка выделки не стоит
Palladin (2009-04-04 15:51:00) [2]
> А где это - bitblt? Я не нашел такой.
даже в гугле?
mnj (2009-04-04 15:26:00) [3]>KilkennyCat © (04.04.09 04:06) [25]
>> Игорь Шевченко ©
>Я бы все-таки сделал через буферный битмап, а потом bitblt - это >гарантирует появление квадратиков всех сразу, если у кого-то вдруг 286 >проц или видеодрайвер не установлен :)
А где это - bitblt? Я не нашел такой.
KilkennyCat (2009-04-04 04:06:00) [4]
> Игорь Шевченко ©
Я бы все-таки сделал через буферный битмап, а потом bitblt - это гарантирует появление квадратиков всех сразу, если у кого-то вдруг 286 проц или видеодрайвер не установлен :)
mnj (2009-04-04 01:54:00) [5]Спасибо за помощь
Jeer (2009-04-03 15:38:00) [6]
> Игорь Шевченко © (03.04.09 02:25) [21]
>
>
> > 4536 штук (252х18) - примерно 5 с.
>
>
> Ради интереса запустил свой проект (который с PaintBox :
> )
> 2048 клеточек рисуются мгновенно (ну то есть, совсем мгновенно).
>
Отличный пример, Игорь.
Насчет прорисовки ( CPU 3 GHz ):
- 1024 рисуются за 9 ms
- 4096 * 38 ms
- 16 тыс за 135 ms
MsGuns (2009-04-03 09:05:00) [7]>Должен признаться, что хотел использовать шейп, но шейп не имеет фокуса ввода пользователя...
А фокус и не нужен, достаточно просто ловить мышиный клик и определять какой контрол под ней находится
Игорь Шевченко (2009-04-03 02:25:00) [8]
> 4536 штук (252х18) - примерно 5 с.
Ради интереса запустил свой проект (который с PaintBox :)
2048 клеточек рисуются мгновенно (ну то есть, совсем мгновенно).
Помещаю поверх окна своей программы окна других программ, убираю - окном моей программы рисуется, опять же, мгновенно.
mnj (2009-04-03 02:16:00) [9]Вот добил: прячу панель-контейнер, создаю в ней нужное количество панелек и показываю снова с готовым результатом.
pnModel.Hide; //прячем панель
if (OldBlocks > 0) and (OldRows > 0) then
begin
for I:= 1 to OldRows do
begin
for K:= 1 to OldBlocks do
Blocks[i-1,k-1].Free; //стираем, если было что
end;
end;
{-------------------------Рисование блоков-------------------------}
SetLength(Blocks,NumberOfRows,NumberOfBlocks);
for I:= 1 to NumberOfRows do
begin
for K:= 1 to NumberOfBlocks do
begin
Blocks[i-1,k-1]:= TPanel.Create(Self);
with Blocks[i-1,k-1] do
begin
Parent:= pnModel;//родительская панель-контейнер - спрятана, поэтому "рисование" происходит быстро и скрыто.
Left:= 20+(K-1)*(pnModel.Width-20) div (NumberOfBlocks+1);
Top:= 20+(I-1)*pnModel.Height div (NumberOfRows*2);
Width:= (pnModel.Width-20) div (NumberOfBlocks+1);
Height:= pnModel.Height div (NumberOfRows*2);
Color:= ColorTable[ResistivityMatrix[i-1,k-1]];
Tag:= I*10+K;
end; {of with}
end;
end;
OldBlocks:= NumberOfBlocks;
OldRows:= NumberOfRows;
pnModel.Show; //показываем все
3136 панелек рисовалось примерно 2 с (матрица 196х16), 1120 (80х14) штук - меньше секунды, 4536 штук (252х18) - примерно 5 с. Никакого затирания, естественно, и никакого мерцания.
Должен признаться, что хотел использовать шейп, но шейп не имеет фокуса ввода пользователя...
Германн (2009-04-03 02:00:00) [10]
> Игорь Шевченко © (03.04.09 01:28) [18]
И так ясно что сия процедура вызывается "не оттуда, откуда нужно".
Ясен перец - нужно читать книги.
А вот ссылки на статьи по этой теме я не знаю.
Может Амёба знает?
Игорь Шевченко (2009-04-03 01:28:00) [11]mnj (02.04.09 16:34) [17]
Было бы неплохо увидеть не только процедуру рисования, но и то место, откуда она вызывается. Иначе мы будем долго гадать, почему затирается и как ускорить
mnj (2009-04-02 16:34:00) [12]Все равно - рисование через канву затирается, поэтому очень неудобро восстанавливать изображение.
Такой вариант:
SetLength(Blocks,NumberOfRows,NumberOfBlocks);
for I:= 1 to NumberOfRows do
begin
for K:= 1 to NumberOfBlocks do
begin
Blocks[i-1,k-1]:= TPanel.Create(Self);
Blocks[i-1,k-1].Hide; //непоказывать блок
with Blocks[i-1,k-1] do
begin
Parent:= pnModel;
Left:= 20+(K-1)*15;
Top:= 20+(I-1)*20;
Width:= 15;
Height:= 20;
Color:= clBlue;
Tag:= I*10+K;
end; {of with}
end;
end;
OldBlocks:= NumberOfBlocks;
OldRows:= NumberOfRows;
for I:= 1 to NumberOfRows do
begin
for K:= 1 to NumberOfBlocks do
begin
Blocks[i-1,k-1].Show;//теперь показывать
end;
end;
ускорил процесс и убрал мерцание. Изображение также сохраняется.
Но можно ли еще ускорить вывод панелек?
Amoeba (2009-04-02 15:22:00) [13]
> mnj (02.04.09 13:25) [15]
>
> Тогда еще возникает момент - как раскрасить отдельную ячейку
> DrawGrid?
Кодом, написанным в OnDrawCell.
mnj (2009-04-02 13:25:00) [14]Тогда еще возникает момент - как раскрасить отдельную ячейку DrawGrid?
mnj (2009-04-02 12:44:00) [15]Код стоит в обработчике открытия файла (стандартный диалог открытия файла, формат - текстовый). Задача - по условным цветовым кодам нарисовать модель геоэлектрического разреза, где каждый цвет обозначает определенную величину удельного электрического сопротивления. В геофизике при моделировании этот разрез разбивается на заданное число блоков и имеет вид матрицы MxN, где M - число блоков по горизонтали (профилю), N - число блоков по вертикали (в глубину). Каждому блоку присваивается свое значение удельного электрического сопротивления, обозначаемое кодом (0..f), таким образом, зона из блоков с одинаковым значением представляет собой геологическое тело в разрезе. Необходимо менять значения сопротивления чтобы создавать тела с другим сечением. Формат входного файла изобретен автором программы инверсии данных (т.е. расчета геоэлектрического поля в разрезе в зависимости от пространственного положения источника поля) и от него я и вынужден отталкиваться. Вместо конкретных значений он использует коды: 0 - значение сопротивления 1, 1 - значение 2, 2 - значение 3 и т.д. до f (предел - 16 значений). в файле разрез выглядит вот так:
000000000000000000000000000000000
000000000111111100000000000000000
000000001111111110000000000000000
000000011111111111000000000000000
000000111111111111100000000000000
000001111111111111110000000000000
111111111111111111111111111111111
111111111111111111111111111111111
В PaintBox нарисовать это несложно, но изображение затирается (см. выше). приведенный в [5] код и относится к варианту с PaintBox. Матрица из панелек, создаваемая runtime - слишком медленно[1]. Попробуем DrawGrid;
ЮЮ (2009-04-02 08:32:00) [16]
> mnj (02.04.09 00:24) [5]
>
> Это тоже все хорошо, я сделал вот так:
> Беда в том, что при перекрытии PaintBox каким-либо элементом,
> окном, например, картинка стирается. Как с этим бороться?
>
Важно не только как, но и где, т.е. каком обработчике стоит этот код.
Игорь Шевченко (2009-04-02 02:43:00) [17]Германн © (02.04.09 02:31) [11]
Это факт. Вот у автора вопроса есть уже выбор из двух вариантов.
Германн (2009-04-02 02:31:00) [18]
> Игорь Шевченко © (02.04.09 02:18) [10]
Я. конечно, уже многим надоел своими требованиями к вопросам, но ...
Без приведения в сабже "задачи", нет возможности дать "правильный ответ" на сабж, без включения телепатора.
А телепатор - вещь весьма мало предсказуемая.
Игорь Шевченко (2009-04-02 02:18:00) [19]Amoeba © (02.04.09 01:34) [8]
> Как вариант, можно использовать DrawGrid и в нем раскрашивать
> ячейки. Я бы лично предпочел такой путь.
Можно. Но в моем случае (карта виртуальной памяти процесса) проще раскрасить PaintBox 32x32. И кода меньше :)
Германн (2009-04-02 02:11:00) [20]
> Amoeba © (02.04.09 01:34) [8]
>
> Как вариант, можно использовать DrawGrid и в нем раскрашивать
> ячейки. Я бы лично предпочел такой путь.
>
+1
Я когда-то в некоей задаче пошёл именно таким путём.
Правда кол-во строк и колонок было изначально фиксированно. И нужны были Fixed Rows & Cols.