![]() |
| ||
|
|
Новости |
Поиск |
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;
рисует медленно и с мерцанием. Можно ли сделать это быстрее и без мерцания?
И второй вопрос - как обрабатывать события компонентов, созданных во время выполнения, как в моем случае?
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;
Получается сеточка из разноцветных квадратиков.