Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2008, 20:06   #1
DOLBY
Форумчанин
 
Аватар для DOLBY
 
Регистрация: 12.12.2007
Сообщений: 121
По умолчанию динамическое создание компонентов

Начал я с TButton'ов....

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const n=10;

var
  Form1: TForm1;
  i:integer;
  btn:array[1..n] of TButton;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 i:=1;
 btn[i]:=TButton.Create(form1);
 btn[i].Parent:=form1;
 btn[i].Caption:=inttostr(i);
 btn[i].Left:=(i-1)*5;
 btn[i].Top:=(i-1)*5;
end;

end.
и вот сразу вопрос: как описать мне процедуру, например OnClick, для кнопок?
Компьютеры - вещь слишком сложная, чтобы работать в принципе. Поэтому то, что они работают хоть как-то, уже чудо.
DOLBY вне форума Ответить с цитированием
Старый 03.01.2008, 20:15   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Самый простой и незатейливый вариант (чтобы не переутруждаться):
1. Кидаем на форму TButton;
2. Двойным кликом по нему создаем контейнер для обработчика;
3. В контейнере прописываем нужный код, обращая внимание на (Sender as TButton)...
4. Прописываем для создаваемых динамически кнопок:
btn[i].OnClick:=здесь указываем наш обработчик для TButton;
5. Удаляем ненужный теперь уже TButton.

Да, кстати, для создаваемых кнопок неплохо бы указывать еще и имя, например
btn[i].Name:='MyBtn'+IntToStr(i);
mihali4 вне форума Ответить с цитированием
Старый 03.01.2008, 21:23   #3
DOLBY
Форумчанин
 
Аватар для DOLBY
 
Регистрация: 12.12.2007
Сообщений: 121
По умолчанию

Спасибо огромное)

вот переделанный код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure ButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const n=50;

var
  Form1: TForm1;
  btn:array[1..n] of tbutton;
  i:integer;

implementation

{$R *.dfm}

procedure TForm1.ButtonClick(Sender: TObject);
begin
 if i<n then
  begin
   inc(i);
   btn[i]:=TButton.Create(form1);
   btn[i].Parent:=form1;
   btn[i].Caption:=inttostr(i);
   btn[i].Name:='mybtn'+inttostr(i);
   btn[i].OnClick:=ButtonClick;
   btn[i].Left:=random(form1.ClientWidth-btn[i].Width);
   btn[i].Top:=random(form1.ClientHeight-btn[i].Height);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 randomize;
 i:=1;
 btn[i]:=TButton.Create(form1);
 btn[i].Parent:=form1;
 btn[i].Caption:=inttostr(i);
 btn[i].Name:='mybtn'+inttostr(i);
 btn[i].OnClick:=ButtonClick;
 btn[i].Left:=(i-1)*5;
 btn[i].Top:=(i-1)*5;
end;

end.
как мне непосредственно из процедуры ButtonClick узнавать какая именно кнопка нажата(под каким номером/именем)?
Компьютеры - вещь слишком сложная, чтобы работать в принципе. Поэтому то, что они работают хоть как-то, уже чудо.

Последний раз редактировалось artemavd; 17.10.2010 в 11:20.
DOLBY вне форума Ответить с цитированием
Старый 03.01.2008, 21:55   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
как мне непосредственно из процедуры ButtonClick узнавать какая именно кнопка нажата(под каким номером/именем)?
SENDER - это тот компонент, который вызвал обработчик.
Я же обращал ваше внимание на этот момент:
Цитата:
3. В контейнере прописываем нужный код, обращая внимание на (Sender as TButton)...
Это и поможет вам определиться. Например:
if (Sender as TButton).Name='MyButton1' then
.... else
if (Sender as TButton).Name='MyButton2' then
....
Или используйте CASE (Sender as TButton).Name OF...
mihali4 вне форума Ответить с цитированием
Старый 04.01.2008, 02:09   #5
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Для идентификации удобно использовать свойство Tag, например: btn[i].Tag:=i;
А проверять if TButton(Sender).Tag = 1 then ...
Или через case TButton(Sender).Tag of (для текстов case не подойдет).
Тогда и имя компоненту не понадобится.
Jeni вне форума Ответить с цитированием
Старый 04.01.2008, 22:40   #6
GN_
Пользователь
 
Аватар для GN_
 
Регистрация: 25.11.2006
Сообщений: 86
По умолчанию

А как в процессе работы программы удалить динамически созданный компонент (для примера хоть ту же кнопку)?
Мой ник - GN
GN_ вне форума Ответить с цитированием
Старый 04.01.2008, 23:28   #7
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

btn[i].Free; Это если нужно удалить самому.
Но можно оставить и на "автомате", ведь при создании - btn[i]:=TButton.Create(form1); - в качестве владельца указывалась форма Form1 и когда она будет уничтожаться, она уничтожит и все принадлежащие ей объекты.
Jeni вне форума Ответить с цитированием
Старый 05.01.2008, 09:59   #8
GN_
Пользователь
 
Аватар для GN_
 
Регистрация: 25.11.2006
Сообщений: 86
По умолчанию

Цитата:
Сообщение от Jeni Посмотреть сообщение
btn[i].Free; Это если нужно удалить самому.
Но можно оставить и на "автомате", ведь при создании - btn[i]:=TButton.Create(form1); - в качестве владельца указывалась форма Form1 и когда она будет уничтожаться, она уничтожит и все принадлежащие ей объекты.
Большое спасибо.
Мой ник - GN
GN_ вне форума Ответить с цитированием
Старый 17.10.2010, 09:34   #9
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Я вот пробую создать динамически компонент Image и загрузить в него картинку сразу, но выдается ошибка, что "Cannot open file "С:\file.bmp". Не удается найти указанный файл". Хотя если без загрузки, то компонент создается. Картинку и хочу в него загрузить, чтобы проверить это. Вот код:
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
 Image: TImage;
begin
 Image:=TImage.Create(Form1);
 Image.Parent:=Form1;
 Image.Left:=50;
 Image.Top:=50;
 Image.Picture.Bitmap.LoadFromFile('C:\file.bmp');
end;
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 17.10.2010, 13:52   #10
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Видимо все-таки что-то не так с путем, т.к. код абсолютно работоспособный.
Баламут вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое создание объекта ANGa Помощь студентам 3 10.04.2008 18:14
динамическое содзание компонентов и процедур обработки Prisian Компоненты Delphi 5 11.12.2007 21:17
Динамическое создание фрейма s-force Общие вопросы Delphi 9 05.09.2007 16:56
Динамическое создание объектов LepihinMS Общие вопросы Delphi 18 05.07.2007 23:31
Как динамически добавить Мемо на форму? Динамическое создание компонентов! werser Помощь студентам 1 14.06.2007 00:39