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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2009, 20:13   #1
Voody
Форумчанин
 
Регистрация: 22.06.2009
Сообщений: 310
По умолчанию Параметр конструктора

У компонента имеется конструктор:

Код:
constructor TNekiyComponent.Create(AOwner: TComponent);
begin
...
Не могу понять, какой аргумент надо передать конструктору для корректного создания компонента.

nil ставил - EAccessViolation

Последний раз редактировалось Voody; 13.12.2009 в 20:27.
Voody вне форума Ответить с цитированием
Старый 13.12.2009, 21:06   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Свойство Owner указывает на компонент, который является владельцем данного компонента. Если компонент является владельцем других компонентов, то при своем уничтожении он уничтожит все те компоненты, владельцами которых он является. У каждого компонента есть свойство Components - массив, в котором хранятся ссылки на все компоненты, владельцем которых является данный компонент.
С другой стороны, компонент может быть уничтожен сам по себе. Тогда было бы неплохо, если бы он сообщил об этом своему владельцу. Вот для установления этой обратной связи и вводится свойство Owner.
Как вы понимаете, сам по себе компонент существовать не может, поэтому NIL в качестве владельца и вызывает исключительную ситуацию.
mihali4 вне форума Ответить с цитированием
Старый 14.12.2009, 18:27   #3
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
...
Как вы понимаете, сам по себе компонент существовать не может, поэтому NIL в качестве владельца и вызывает исключительную ситуацию.
Как это не может?
Код:
  form := TEditNameDlg.Create(nil);
  try
    if form.ShowModal = mrOk then
      //...
  finally
    form.Free;
  end;
Все время работало - а форма это тоже компонент.
Сейчас еще попробовал
Код:
  F1Book1 := TF1Book.Create(nil);
  try
    F1Book1.Width := 100;
  finally
    F1Book1.Free;
  end;
Никакой ошибки не выдало. хотя помню что без парента и отображения с ним есть проблемы при дальнейшей работе связанные с инициализацией TOleControl. Вероятнее все таки здесь что-то конкретное или конкретный компонент.
s.Creator вне форума Ответить с цитированием
Старый 14.12.2009, 18:44   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от s.Creator Посмотреть сообщение
Как это не может?
Получили удовлетворение от того, что я не упомянул "кроме формы"?
Ну и славно.
А попробуйте-ка таким же образом Button создать...
И чтобы он вывелся на экран и на него можно было нажать. Ну, допустим, для "закрытия"...
Вырванными из контекста кусками кода очень удобно оперировать.
mihali4 вне форума Ответить с цитированием
Старый 14.12.2009, 19:04   #5
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Получили удовлетворение от того, что я не упомянул "кроме формы"?
Ну и славно.
А попробуйте-ка таким же образом Button создать...
И чтобы он вывелся на экран и на него можно было нажать. Ну, допустим, для "закрытия"...
Вырванными из контекста кусками кода очень удобно оперировать.
Ну если у Вас не получается попробуйте:
Код:
unit UTestMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
  
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    bt: TButton;
    procedure FormBtClose(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormBtClose(Sender: TObject);
begin
  Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  bt := TButton.Create(nil);
  bt.Parent := Self;
  bt.Caption := 'Close Form';
  bt.OnClick := FormBtClose;
  bt.Visible := True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  bt.Free;
end;

end.
или откройте прикрепленный проект.
Или Вы получаете удовлетворение от голословных утверждений?
Вложения
Тип файла: zip dlg_Test.zip (1.7 Кб, 9 просмотров)
s.Creator вне форума Ответить с цитированием
Старый 14.12.2009, 19:41   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вы меня не поняли.
Я предлагал создать баттон без использования формы... Голый, так сказать... Только баттон и больше ничего.
Но
Цитата:
чтобы он вывелся на экран и на него можно было нажать. Ну, допустим, для "закрытия"...
mihali4 вне форума Ответить с цитированием
Старый 14.12.2009, 19:52   #7
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
...
Я предлагал создать баттон без использования формы... Голый, так сказать... Только баттон и больше ничего. ...
Извиняюсь, Я думал что в этой теме обсуждается AV при использовании nil в конструкторе компонента.
Цитата:
NIL в качестве владельца и вызывает исключительную ситуацию.
s.Creator вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть ли тут конструктора - как рассчитывается инволюта? Stilet Свободное общение 8 23.10.2009 09:28
Конструктора и инженеры научились спасать сосиски! Вавел из ГМТУ Свободное общение 4 02.10.2009 00:17
Перегрузка конструктора Spice Общие вопросы C/C++ 3 20.07.2009 14:37
Переопределение конструктора формы daunito Общие вопросы Delphi 5 23.11.2008 01:58