Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

рисование компонент [D6, XP]


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо