Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.02;
Скачать: CL | DM;

Вниз

Создание объектов во время исполнения программы   Найти похожие ветки 

 
Eugem ©   (2007-08-05 22:54) [0]

Прошу помочь разобраться с созданием объектов во время исполнения программы. При запуске на форме создаются 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;


 
Двигатель внешнего сгорания   (2007-08-05 23:13) [1]


> При запуске на форме создаются 800 изображений,


Жуть.
Думаешь, это будет работать?
Может, задачу поставить целиком лучше?


 
Anatoly Podgoretsky ©   (2007-08-05 23:22) [2]

Это не жуть, а пазл.
А вот задачу надо ставить, вместо загадок для отвечающих.
Рассказывать надо что требуется сделать, а не как.


 
DrPass ©   (2007-08-05 23:38) [3]


> А вот как обращаться к изображениям, созданным уже во время
> работы программы - никак не разберусь

А это тебе на что?

> 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);
- все равно ж имена не используешь


 
{RASkov} ©   (2007-08-05 23:52) [4]

> и убери
> 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] :)
Логически не верный код! Впрочем как вероятно и синтаксически )


 
Ping   (2007-08-06 00:22) [5]

array[0..n-1][0..m-1] of TImage;


 
balepa ©   (2007-08-06 09:17) [6]


> 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;


 
E   (2007-08-06 15:37) [7]

Задача:
Требуется анимировать процессы происходящие в p-n переходе диода. Есть положительные и отрицательные заряды. Каждое изображение - это заряд. И требуется эти все заряди хаотически перемещать.

Вот выше написали как создать изображения. А вот как ими управлять всеми в цикле, например?


 
{RASkov} ©   (2007-08-06 16:58) [8]

> [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;

Только для раздумья....


 
TStas ©   (2007-08-06 23:02) [9]

Обращаться крайне просто: сохранить на них куда-то указатели. Например, очень подходит для этого TList. Вопрос другой: зачем как сложно? И Так ресурсоемко? Почему не рисовать сразу на канве, тем более, что это заряды, т. е. точки?



Страницы: 1 вся ветка

Текущий архив: 2007.09.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
1-1182725258
ssa
2007-06-25 02:47
2007.09.02
Как заменить выделенный текст в memo?


2-1186750317
alles
2007-08-10 16:51
2007.09.02
Функция DirectoryExists работает долго


1-1182862301
mif99
2007-06-26 16:51
2007.09.02
Ошибка в приложение клиент сервер (CANNOT ALLOCATE SOCKET)


15-1185607519
Ыщтмихайло
2007-07-28 11:25
2007.09.02
Куда податься ламерюге


2-1186723135
Savek
2007-08-10 09:18
2007.09.02
TDBGrid.OnMouseDown