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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2009, 23:11   #1
Grandistok
Пользователь
 
Аватар для Grandistok
 
Регистрация: 13.09.2009
Сообщений: 23
По умолчанию MDI динамическое создание компанента не дочерней форме

Доброго времени суток Помогите начинающему чайнику если не трудно

Задача: Создаю MDI приложение (первый раз в жизни так что ногами сильно не пинать ) при динамическом создании дочерней формы на ней должна динамически создаваться кнопка.

Решаю это путем помещения в FormActivate дочерней формы кода создающего кнопку.

Листнинг:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    New1: TMenuItem;
    Add1: TMenuItem;
    procedure Add1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  MDIChildForm: TForm2;
implementation

{$R *.dfm}

procedure TForm1.Add1Click(Sender: TObject);
begin
  MDIChildForm := TForm2.Create(Owner);
end;

end.

Код:
unit Unit2;

interface

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

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

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}


procedure TForm2.FormActivate(Sender: TObject);
var
  btn: TButton; //Переменная для кнопки
begin
  //Создаем новую кнопку
  btn:=TButton.Create(Form1);
  btn.Parent:=Form1;
  //Устанавливаем расположение новой кнопки
  btn.Top:=Form1.Height div 2+20;
  btn.Left:=10;
  btn.Width:=100;
  btn.Height:=25;
  btn.Caption:='Новая кнопка';
end;

end.
В результате чего у меня успешно создается кнопка на родительской форме... В то время как мне надо на дочерней . что собственно логично ведь у меня в коде написано
Код:
procedure TForm2.FormActivate(Sender: TObject);
var
  btn: TButton; //Переменная для кнопки
begin
  //Создаем новую кнопку
  btn:=TButton.Create(Form1);
  btn.Parent:=Form1;
  //Устанавливаем расположение новой кнопки
  btn.Top:=Form1.Height div 2+20;
  btn.Left:=10;
  btn.Width:=100;
  btn.Height:=25;
  btn.Caption:='Новая кнопка';
end;
А если я меняю в выше изложеном куске Form1 на Form2 то получаю ошибку: First chance exception at $7C812AEB. Exception class EAccessViolation with message 'Access violation at address 00454DE3 in module 'Project1.exe'. Read of address 0000004C'. Process Project1.exe (3340) Ругается на строчку btn.Top:=Form2.Height div 2+20;

Вот теперь собстенно вопрос почему? И как это исправить? Или на дочерней форме надо создавать элементы как то иначе? В объщем разясните чайнику в чем собственно грабли и как с этим бороться? Или ссылочкой поделитесь а то искал нигде не нашел
С уважением добрый парень-убийца…

Последний раз редактировалось Stilet; 15.09.2009 в 09:40.
Grandistok вне форума Ответить с цитированием
Старый 13.09.2009, 23:34   #2
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Код:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N11: TMenuItem;
    N21: TMenuItem;
    procedure N21Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
  Form1: TForm1;
  MDIChildForm: TForm2;
  btn: TButton;
implementation

{$R *.dfm}

procedure TForm1.N21Click(Sender: TObject);
begin
MDIChildForm := TForm2.Create(Application);

btn:=TButton.Create(Application);
btn.Parent:=MDIChildForm;

btn.Name := 'But1';
btn.Top:=100;
btn.Left:=100;

btn.Width:=100;
btn.Height:=25;
btn.Caption:='Новая кнопка';
end;

end.
з.ы. думаю разберетесь. если че - пишите.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 14.09.2009, 20:39   #3
Grandistok
Пользователь
 
Аватар для Grandistok
 
Регистрация: 13.09.2009
Сообщений: 23
По умолчанию

Спс огромное получилось Я так понимаю что btn.Parent:=MDIChildForm; помещает кнопку на текушую дочернюю форму? А я использовал btn:=TButton.Create(Form1); где четко прописовал на какой форме должна быть кнопка. Поправьте если не так.

А если я хочу добавить элемент на уже созданую ранее форму? Как к ней обратиться? Ведь дочерних форм может быть сколько угодно а я незнаю ее имени.
С уважением добрый парень-убийца…
Grandistok вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое создание массива Juggernaut Общие вопросы Delphi 3 20.05.2009 15:13
Динамическое создание событий Fandaret Общие вопросы Delphi 4 14.05.2009 04:20
Как в дочерней форме узнать о закрытии главной CruelAssembler Общие вопросы Delphi 2 20.11.2008 19:27
Динамическое создание фрейма s-force Общие вопросы Delphi 9 05.09.2007 16:56
Создание пиксельной сетки в MDI приложении shkiper Общие вопросы Delphi 5 06.06.2007 18:56