Динамическое создание объектов и расположение их на ф

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Динамическое создание объектов и расположение их на ф

Сообщение first-leon » 14.01.2007 18:27:51

Всем привет.
Подскажите где почитать на тему:
создаю стандартный проект для лазаря. Мне нужно создать объект(например кнопку) динамически, в процессе выполнения программы и отрисовать ее на форме в определенных координатах. Как это сделать - ума не приложу.
Если я кидаю компонент на форму, в процессе создания приложения - этот компонент задается как одно из полей данных для класса "Forma". Динамически это невозможно.
Создать сам объект я могу, но как ему указать - где он должен отрисовываться?
first-leon
новенький
 
Сообщения: 68
Зарегистрирован: 20.04.2006 18:46:31

Сообщение shade » 14.01.2007 19:00:39

Проверил в Delphi:
Код: Выделить всё
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: Зачем и что нужно передавать в конструкторе я не знаю, может кто растолкует?..
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение Sergei I. Gorelkin » 14.01.2007 19:46:58

В конструктор передается "владелец" - тот объект (точнее, компонент), при уничтожении которого будет уничтожен и создаваемый объект. В данном случае вполне подойдет сама форма. Если передавать nil, то созданный объект надо где-то уничтожить вручную, иначе получится утечка памяти.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Slavikk » 16.01.2007 01:02:55

В Delphi писал в процедуре создания ещё

OnClick := Button1Click;

А далее

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage((Sender as TButton).Caption);
end;

А здесь чего то не работает.
Аватара пользователя
Slavikk
постоялец
 
Сообщения: 208
Зарегистрирован: 15.01.2007 22:34:52
Откуда: Из лесов...

Сообщение Sergei I. Gorelkin » 16.01.2007 03:07:33

Здесь нужно либо писать OnClick := @Button1Click;, либо добавлять {$mode delphi} в начале модуля.
Дурацкая фича, на самом деле...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Slavikk » 16.01.2007 08:22:32

Спасибо. :D
Аватара пользователя
Slavikk
постоялец
 
Сообщения: 208
Зарегистрирован: 15.01.2007 22:34:52
Откуда: Из лесов...

Сообщение first-leon » 16.01.2007 08:45:34

Создал кучу объектов, теперь не знаю как от них события обрабатывать.
Сделал такую конструкцию:
Код: Выделить всё
  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;                                             

Мне теперь нужно сделать, чтобы мои объекты генерировали события, например на клик мыши, а я их обрабатывал. Подскажите кто чем может
first-leon
новенький
 
Сообщения: 68
Зарегистрирован: 20.04.2006 18:46:31

Сообщение Slavikk » 16.01.2007 08:56:20

Красивый вот пример:
Код: Выделить всё
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: не забываем выделять код тегами ;)
Аватара пользователя
Slavikk
постоялец
 
Сообщения: 208
Зарегистрирован: 15.01.2007 22:34:52
Откуда: Из лесов...

Сообщение first-leon » 16.01.2007 10:15:20

Спасибо. Хороший примерчик. Разобрался.

Подскажите - это у меня в программе не порядок или ... ?
Создаю 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

Сообщение tria » 16.01.2007 11:43:04

Если исходить из твоего кода:
image:array[0..7,0..7] of TImage;
то правильно ругается :)

В таких случаях - куски кода в студию...
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение first-leon » 16.01.2007 12:13:44

Вот в принципе то ивесь код:
Код: Выделить всё
  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

Сообщение first-leon » 16.01.2007 12:19:54

Ой. Затупил:
Код: Выделить всё
image:array[0..15,0..15] of TImage;

Но это сути дела не меняет. Таже ошибка

PS: Че тоя заучился. Всем спасибо. Разобрался. Картинка то было 560x760
first-leon
новенький
 
Сообщения: 68
Зарегистрирован: 20.04.2006 18:46:31


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 27

Рейтинг@Mail.ru