![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание объектов во время исполнения программы [D7, WinXP]
Eugem © (2007-08-05 22:54:00)Прошу помочь разобраться с созданием объектов во время исполнения программы. При запуске на форме создаются 800 изображений, расположенный рядом друг с другом. И у них можно задать различные свойства, в том числе и имя.
Мне нужно будет потом менять координаты этих изображений в цикле. Обычно это такForm1.Image1.Tag:=3
А вот как обращаться к изображениям, созданным уже во время работы программы - никак не разберусь. Подскажите, пожалуйста. Текст программы ниже.
procedure draw;
var i,j:integer;
TypeClass : TControlClass;
begin
for I := 0 to n*2-1 do
begin
for j := 0 to n-1 do
begin
TypeClass:=TImage;
New:=TypeClass.Create(Form1);
if (i<=10)or(j<=10) then New.Name:='img'+'0'+IntTostr(i)+'0'+IntTostr(j)
else New.Name:=New.ClassName+IntTostr(i)+IntTostr(j);
image[i+1,j+1]:=@New;
if (i<20) and (i>10) then TImage(New).Picture.LoadFromFile('plus.bmp')
else TImage(New).Picture.LoadFromFile('minus.bmp');
TImage(New).Transparent:=true;
TImage(New).AutoSize:=true;
TImage(New).Left:=i*size;
TImage(New).Top:=j*size;
New.Parent:=Form1;
end;
end;
end;
TStas (2007-08-06 23:02:00) [1]Обращаться крайне просто: сохранить на них куда-то указатели. Например, очень подходит для этого TList. Вопрос другой: зачем как сложно? И Так ресурсоемко? Почему не рисовать сразу на канве, тем более, что это заряды, т. е. точки?
{RASkov} (2007-08-06 16:58:00) [2]> [7] E (06.08.07 15:37)
Type
TZaryad = record
BMP: TBitmap;
Left: Integer;
Top: Integer;
Width: Integer;
Height: Integer;
....
end;
TZaryads: array of TZaryad;
var Zards: TZaryads;
.....
procedure CreateZaryads;
begin
SetLength(Zards, <Кол-во зарядов>);
for N:=0 to High(Zards) do begin
Zards.BMP:=TBitmap.Create;
Zards.BMP.LoadFromFile('');
Zards.Left:=RAndom();
.....
end;
end;
.................
procedure StepZaryad(Zar: TZaryad);
begin
Zar.Left:=Zar.Left+1;
......
end;
procedure DrawZaryad(Can: TCanvas; Zar: TZaryad);
begin
......
Can.Draw(Zar.Left, Zar.Top, Zar.BMP);
.....
end;
procedure PaintZaryads(Canv: TCanvas);
begin
for N:=0 to High(Zards) do begin
StepZaryad(Zards[N]);
DrawZaryad(Canv, Zards[N]);
end;
end;
procedure TForm.TimerTimer();
begin
PaintZaryads(Canvas);
end;
Только для раздумья....
E (2007-08-06 15:37:00) [3]Задача:
Требуется анимировать процессы происходящие в p-n переходе диода. Есть положительные и отрицательные заряды. Каждое изображение - это заряд. И требуется эти все заряди хаотически перемещать.
Вот выше написали как создать изображения. А вот как ими управлять всеми в цикле, например?
balepa (2007-08-06 09:17:00) [4]
> Ping (06.08.07 00:22) [5]
> array[0..n-1][0..m-1] of TImage;
array[0..n-1,0..m-1] of TImage;
Ping (2007-08-06 00:22:00) [5]array[0..n-1][0..m-1] of TImage;
{RASkov} (2007-08-05 23:52:00) [6]> и убери
> if (i<=10)or(j<=10) then New.Name:='img'+'0'+IntTostr(i)
> +'0'+IntTostr(j)
> else New.Name:=New.ClassName+IntTostr(i)+IntTostr(j);
> - все равно ж имена не используешь
Собственно здесь вообще много чего поубирать можно :)
procedure draw(Cnv: TCanvas);
var i,j:integer;
begin
for I := 0 to n*2-1 do
for j := 0 to n-1 do
begin
image[i+1,j+1]:=TBitmap.Create;
if (i<20) and (i>10) then image[i+1,j+1].LoadFromFile('plus.bmp')
else image[i+1,j+1].LoadFromFile('minus.bmp');
image[i+1,j+1].Transparent:=true;
Cnv.Draw(i*size, j*size, image[i+1,j+1]);
end;
end;
Только.... автор, это не решение твоей проблемы, просто "оптимизация" твоего "куска" из [0] :)
Логически не верный код! Впрочем как вероятно и синтаксически )
DrPass (2007-08-05 23:38:00) [7]
> А вот как обращаться к изображениям, созданным уже во время
> работы программы - никак не разберусь
А это тебе на что?
> image[i+1,j+1]:=@New;
Только сделай по-человечески
image[i+1,j+1]:= New;
и убери
if (i<=10)or(j<=10) then New.Name:='img'+'0'+IntTostr(i)+'0'+IntTostr(j)
else New.Name:=New.ClassName+IntTostr(i)+IntTostr(j);
- все равно ж имена не используешь
Anatoly Podgoretsky (2007-08-05 23:22:00) [8]Это не жуть, а пазл.
А вот задачу надо ставить, вместо загадок для отвечающих.
Рассказывать надо что требуется сделать, а не как.
Двигатель внешнего сгорания (2007-08-05 23:13:00) [9]
> При запуске на форме создаются 800 изображений,
Жуть.
Думаешь, это будет работать?
Может, задачу поставить целиком лучше?