Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.045 c
2-1186488500
Roun
2007-08-07 16:08
2007.09.02
Как удалить пустые строки из Memo?


2-1186593827
Sonia
2007-08-08 21:23
2007.09.02
Проблема с настройками клиента Oracle (а может еще чего-то)


2-1186586317
Костя
2007-08-08 19:18
2007.09.02
Трудности работы с StringGrid


15-1186067656
Kenifer
2007-08-02 19:14
2007.09.02
Как инжектирывать свой процесс в чужой процесс?


4-1172391543
Comp
2007-02-25 11:19
2007.09.02
Корректное пересоздание Pen





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский