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;

рисует медленно и с мерцанием. Можно ли сделать это быстрее и без мерцания?
И второй вопрос - как обрабатывать события компонентов, созданных во время выполнения, как в моем случае?


Amoeba   (2009-04-02 01:34:00) [21]

Как вариант, можно использовать DrawGrid и в нем раскрашивать ячейки. Я бы лично предпочел такой путь.


Amoeba   (2009-04-02 01:20:00) [22]


> Игорь Шевченко ©   (02.04.09 01:01) [6]
>
>
> > Это тоже все хорошо, я сделал вот так:
>
>
> Надеюсь, это код процедуры PaintBoxPaint

Судя по
> при перекрытии PaintBox каким-либо элементом, окном, например,
>  картинка стирается

похоже на  то, что надежда оказалась напрасной.


Игорь Шевченко   (2009-04-02 01:01:00) [23]


> Это тоже все хорошо, я сделал вот так:


Надеюсь, это код процедуры PaintBoxPaint


mnj   (2009-04-02 00:24:00) [24]

Это тоже все хорошо, я сделал вот так:

for I:= 1 to NumberOfRows do
               begin
                       for K:= 1 to NumberOfBlocks do
                       begin
                           with pbModel.Canvas do
                           begin
                               X:= 20+(K-1)*10;
                               Y:= 20+(I-1)*20;
                               dX:= 15;
                               dY:= 20;
                               Pen.Style:= psSolid;
                               Brush.Style:= bsSolid;
                               Pen.Color:= clBlack;
                               Brush.Color:= clGreen;
                               Rectangle(X,Y,X+dX,Y+dY);
                           end
                       end
               end;
Беда в том, что при перекрытии PaintBox каким-либо элементом, окном, например, картинка стирается. Как с этим бороться?


mnj   (2009-04-01 21:33:00) [25]

Спасибо, попробую.


Игорь Шевченко   (2009-04-01 21:00:00) [26]

mnj   (01.04.09 20:48) [2]

Очень даже подходит для этого PaintBox, потому как он только средство отображения (ну и клик мыши тоже воспринимает). А объект с меняющимися свойствами - он отдельный и сам по себе, хотя бы и в массиве.

Если обратить внимание, то в процедуре рисования отображается состояние (цвет, кстати) именно объектов, другое дело, что объекты простые, но сложными быть им никто не мешает.

Мышкой щелкать тоже, кстати, просто

procedure TfMain.PaintBoxWholeMouseDown(Sender: TObject;
 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
 EntryIndex, EntryX, EntryY : Integer;
 GridHeight:  Integer;
 GridWidth :  Integer;
 PaintBox : TPaintBox;
begin
 PaintBox := Sender as TPaintBox;
 if Button = mbLeft then begin
   GridHeight := PaintBox.Height div 32;
   GridWidth  := PaintBox.Width  div 32;
   EntryX := (X div GridWidth);
   EntryY := (Y div GridHeight);
   EntryIndex := EntryY * 32 + EntryX;
   SelectWholeMapEntry(EntryIndex);
 end;
end;

Определили индекс объекта и делаем с ним, что хотим.

В моем случае (это карта вирутальной памяти процесса), в зависимости от состояния участка памяти в довольно крупном масштабе
(свободен, выделен, занят кодом, и т.п.), определяется его цвет, а при щелчке мышью конкретно этот участок отображается рядом более детально.
То есть, объекты налицо :)


mnj   (2009-04-01 20:48:00) [27]

спасибо за совет, но дело в том, что мне нужно иметь каждую клеточку отдельным объектом, свойства которого меняются в заданной зависимости  по клику мыши, например - цвет, По-моему, PaintBox не подходит для этого.


Игорь Шевченко   (2009-04-01 18:40:00) [28]


> Можно ли сделать это быстрее и без мерцания?


Можно.


> И второй вопрос - как обрабатывать события компонентов,
> созданных во время выполнения, как в моем случае?


Также, как обычно.

Рисовать можно например так:
Положить на форму PaintBox, на его событии OnPaint нарисовать нужное количество квадратиков.

В качестве тупого примера рисуется 1024 (32х32) квадратика

procedure TfMain.DrawMap(const Map: TMemoryMap; PaintBox: TPaintBox);
var
 Column    :  Integer;
 GridHeight:  Integer;
 GridWidth :  Integer;
 Row       :  Integer;
 I : Integer;
 BrushNew, BrushOld : HBRUSH;
begin
 GridHeight := PaintBox.Height div 32;
 GridWidth  := PaintBox.Width  div 32;
 for I := 0 to 1023 do begin
   Row    := I div 32;
   Column := I mod 32;
   BrushNew := CreateSolidBrush(TMemory.MapEntryColor(Map[I]));
   BrushOld := SelectObject(PaintBox.Canvas.Handle, BrushNew);
   Rectangle(PaintBox.Canvas.Handle, GridWidth*Column, GridHeight*Row,
     GridWidth*(Column+1), GridHeight*(Row+1));
   SelectObject(PaintBox.Canvas.Handle, BrushOld);
   DeleteObject(BrushNew);
 end;
end;

Получается сеточка из разноцветных квадратиков.


Страницы:   1 2

Наверх

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