Динамическое создание объектов и расположение их на ф
Модератор: Модераторы
-
first-leon
- новенький
- Сообщения: 68
- Зарегистрирован: 20.04.2006 18:46:31
- Контактная информация:
Динамическое создание объектов и расположение их на ф
Всем привет.
Подскажите где почитать на тему:
создаю стандартный проект для лазаря. Мне нужно создать объект(например кнопку) динамически, в процессе выполнения программы и отрисовать ее на форме в определенных координатах. Как это сделать - ума не приложу.
Если я кидаю компонент на форму, в процессе создания приложения - этот компонент задается как одно из полей данных для класса "Forma". Динамически это невозможно.
Создать сам объект я могу, но как ему указать - где он должен отрисовываться?
Подскажите где почитать на тему:
создаю стандартный проект для лазаря. Мне нужно создать объект(например кнопку) динамически, в процессе выполнения программы и отрисовать ее на форме в определенных координатах. Как это сделать - ума не приложу.
Если я кидаю компонент на форму, в процессе создания приложения - этот компонент задается как одно из полей данных для класса "Forma". Динамически это невозможно.
Создать сам объект я могу, но как ему указать - где он должен отрисовываться?
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Проверил в Delphi:
PS: Зачем и что нужно передавать в конструкторе я не знаю, может кто растолкует?..
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var btn: TButton;
begin
btn := TButton.Create(nil);
btn.Parent := Self;
btn.Left := 10;
btn.Top := 10;
btn.Caption := 'Hello world';
btn.Visible := true;
end;PS: Зачем и что нужно передавать в конструкторе я не знаю, может кто растолкует?..
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
-
first-leon
- новенький
- Сообщения: 68
- Зарегистрирован: 20.04.2006 18:46:31
- Контактная информация:
Создал кучу объектов, теперь не знаю как от них события обрабатывать.
Сделал такую конструкцию:
Далее инициализирую их:
Мне теперь нужно сделать, чтобы мои объекты генерировали события, например на клик мыши, а я их обрабатывал. Подскажите кто чем может
Сделал такую конструкцию:
Код: Выделить всё
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
OpenPictureDialog1: TOpenPictureDialog;
ScrollBox1: TScrollBox;
ScrollBox2: TScrollBox;
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
image:array[0..7,0..7] of TImage; ----\
tile_source:array[0..13] of TImage; ---/ Это как раз и есть мои объекты
i,j:longword;
Далее инициализирую их:
Код: Выделить всё
for i:=0 to 13 do
begin
tile_source[i]:=TImage.Create(nil);
tile_source[i].Top:=i*(64+2);
tile_source[i].left:=0;
tile_source[i].height:=64;
tile_source[i].width:=64;
tile_source[i].visible:=true;
tile_source[i].Parent:=ScrollBox2;
OpenPictureDialog1.Filter := GraphicFilter(TGraphic);
tile_source[i].picture.LoadFromFile('..\graphics\Map\tile\'+inttostr(i+1)+'.bmp');
end;
Мне теперь нужно сделать, чтобы мои объекты генерировали события, например на клик мыши, а я их обрабатывал. Подскажите кто чем может
- Slavikk
- постоялец
- Сообщения: 208
- Зарегистрирован: 15.01.2007 21:34:52
- Откуда: Из лесов...
- Контактная информация:
Красивый вот пример:
Т.е. по нажатию кнопки Button1, создаётся кнопка btn. По нажатию btn - запускается любая процедура например (OnClick := @btnClick;):
ev: не забываем выделять код тегами
Код: Выделить всё
unit UMainForm;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons;
type
{ TMainForm }
TMainForm = class(TForm)
Button1: TButton;
procedure btnClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
MainForm: TMainForm;
implementation
{ TMainForm }
procedure TMainForm.btnClick(Sender: TObject);
begin
ShowMessage('dddddd');
end;
procedure TMainForm.Button1Click(Sender: TObject);
var btn: TButton;
begin
btn := TButton.Create(MainForm);
with btn do
begin
OnClick := @btnClick;
Parent := MainForm;
Left := 10;
Top := 10;
Height := 25;
Width := 75;
Caption := 'Hello world';
Visible := true;
end;
end;
initialization
{$I umainform.lrs}
end.
Т.е. по нажатию кнопки Button1, создаётся кнопка btn. По нажатию btn - запускается любая процедура например (OnClick := @btnClick;):
Код: Выделить всё
procedure TMainForm.btnClick(Sender: TObject);
begin
ShowMessage('dddddd');
end;ev: не забываем выделять код тегами
-
first-leon
- новенький
- Сообщения: 68
- Зарегистрирован: 20.04.2006 18:46:31
- Контактная информация:
Спасибо. Хороший примерчик. Разобрался.
Подскажите - это у меня в программе не порядок или ... ?
Создаю 256 TImage, в каждом картинка 64x64. Программа зависает.
Если 64 - все нормально. Оперативки у меня достаточно - 1024Mb. Выдает:
И потом ошибкак вываливается:
Подскажите - это у меня в программе не порядок или ... ?
Создаю 256 TImage, в каждом картинка 64x64. Программа зависает.
Если 64 - все нормально. Оперативки у меня достаточно - 1024Mb. Выдает:
Access violation.
Press ignore and risk corruption.
Press cancel to kill program.
И потом ошибкак вываливается:
runtime error 217...
-
first-leon
- новенький
- Сообщения: 68
- Зарегистрирован: 20.04.2006 18:46:31
- Контактная информация:
Вот в принципе то ивесь код:
Код: Выделить всё
TForm1 = class(TForm)
Button1: TButton;
procedure ImageAllClick(Sender: TObject);
Image1: TImage;
OpenPictureDialog1: TOpenPictureDialog;
ScrollBox1: TScrollBox;
ScrollBox2: TScrollBox;
procedure FormCreate(Sender: TObject);
end;
TMYImage = class(TImage)
private
n:longword;
published
function what_is_number:longword;
end;
var
Form1: TForm1;
image:array[0..7,0..7] of TImage;
tile_source:array[0..13] of TMYImage;
i,j:longword;
btn:TMouseButton;
shft:TShiftState;
x,y:integer;
implementation
//---------------------------------------------------
function TMYImage.what_is_number:longword;
begin
what_is_number:=n;
end;
//---------------------------------------------------
procedure TForm1.ImageAllClick(Sender: TObject);
begin
form1.caption:=inttostr(TMYImage(sender).what_is_number);
end;
//---------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
for i:=0 to 15 do
begin
for j:=0 to 7 do
begin
image[i,j]:=TImage.Create(nil);
image[i,j].Top:=i*31;
image[i,j].left:=j*31;
image[i,j].height:=32;
image[i,j].width:=32;
image[i,j].visible:=true;
image[i,j].Parent:=ScrollBox1;
OpenPictureDialog1.Filter := GraphicFilter(TGraphic);
image[i,j].picture.LoadFromFile('c:\Leon\my_fp\fop\fop_edit\testimage\CINDY058.bmp');
end
end;
for i:=0 to 13 do
begin
tile_source[i]:=TMYImage.Create(nil);
tile_source[i].Top:=i*(64+2);
tile_source[i].left:=0;
tile_source[i].height:=64;
tile_source[i].width:=64;
tile_source[i].visible:=true;
tile_source[i].Parent:=ScrollBox2;
tile_source[i].n:=i;
OpenPictureDialog1.Filter := GraphicFilter(TGraphic);
tile_source[i].picture.LoadFromFile('..\graphics\Map\tile\'+inttostr(i+1)+'.bmp');
tile_source[i].OnClick:=@ImageAllClick;
end;
end;
-
first-leon
- новенький
- Сообщения: 68
- Зарегистрирован: 20.04.2006 18:46:31
- Контактная информация:
Ой. Затупил:
Но это сути дела не меняет. Таже ошибка
PS: Че тоя заучился. Всем спасибо. Разобрался. Картинка то было 560x760
Код: Выделить всё
image:array[0..15,0..15] of TImage;
Но это сути дела не меняет. Таже ошибка
PS: Че тоя заучился. Всем спасибо. Разобрался. Картинка то было 560x760
