FindClass and runtime control creation error?
От: bivis  
Дата: 10.11.03 07:35
Оценка:
function CreateControl(AClassName:string; AParent:TWinControl):TWinControl;
begin
  Result:=FindClass(AClassName).Create as TWinControl;
  Result.Parent:=AParent;
end;



на Result.Parent:=AParent — Access Violation.

Что не так и как в данном случае правильно сделать?
Re: FindClass and runtime control creation error?
От: Slicer [Mirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 10.11.03 09:58
Оценка:
А может быть так, что Result=nil?
Например, имя класса неизвестное? Например, класс не был зарегистрирован (RegisterClass/RegisterClasses)?

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re: FindClass and runtime control creation error?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 10.11.03 10:43
Оценка: 1 (1) +1
Здравствуйте, bivis, Вы писали:

B>
B>function CreateControl(AClassName:string; AParent:TWinControl):TWinControl;
B>begin
B>  Result:=FindClass(AClassName).Create as TWinControl;
B>  Result.Parent:=AParent;
B>end;
B>


Ошибка в том, что для потомков TComponent необходимо вызывать конструктор TComponent.Create(AOwner: TComponent); Поэтому, может помочь следующее:

function CreateControl(AClassName:string; AParent:TWinControl):TWinControl;
begin
  Result:=TWinControlClass(FindClass(AClassName)).Create(AParent);
  Result.Parent:=AParent;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Btn: TButton;
begin
  RegisterClass(TButton);
  Btn := CreateControl('TButton', Self) as TButton;
  Btn.Caption := '!!!!!!!!!';
  Btn.Visible := True;
end;
... << RSDN@Home 1.1 beta 2 >>
Re[2]: FindClass and runtime control creation error?
От: bivis  
Дата: 11.11.03 08:45
Оценка:
Здравствуйте, Slicer [Mirkwood], Вы писали:

SM>А может быть так, что Result=nil?

SM>Например, имя класса неизвестное? Например, класс не был зарегистрирован (RegisterClass/RegisterClasses)?

зарегистрирован, иначе бы exception выпадал FindClass.
Re[2]: FindClass and runtime control creation error?
От: bivis  
Дата: 11.11.03 08:47
Оценка:
M>Ошибка в том, что для потомков TComponent необходимо вызывать конструктор TComponent.Create(AOwner: TComponent); Поэтому, может помочь следующее:
M>[pascal]
M>function CreateControl(AClassName:string; AParent:TWinControl):TWinControl;
M>begin
M> Result:=TWinControlClass(FindClass(AClassName)).Create(AParent);
M> Result.Parent:=AParent;
M>end;

дадада, точно! работает, пасиба
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.