Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.09;
Скачать: CL | DM;

Вниз

Допустим у нас есть ClassName фрейма   Найти похожие ветки 

 
Zhouck ©   (2003-09-26 16:36) [0]

Как по нему создать єеземпляр фрейма (для помещения на форму)?


 
KSergey ©   (2003-09-26 16:38) [1]

Это в смысле строка с наименованием класса?

Ну тут недавно пробегало обсуждение этого вопроса...

Вот что я для себя из него "вынес":

Как создать элемент по строковому имени его класса?

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
C: TPersistentClass;
begin
C := GetClass(Edit1.Text);
if (C <> nil) and C.InheritsFrom(TControl) then
with TControlClass(C).Create(Self) do
begin
Parent := Self;
SetBounds(Random(Self.ClientWidth - Width), Random(Self.ClientHeight - Height), Width, Height);
end
else ShowMessage("Неизвестный класс " + Edit1.Text);
end;

initialization
Randomize;
RegisterClasses([TEdit, TButton, TMemo, TCheckBox, TListBox, TPanel, TGroupBox]); // только прописанные здесь классы будут доступны для создания
end.


 
MBo ©   (2003-09-26 16:38) [2]

registerclass
getclass или findclass


 
Palladin ©   (2003-09-26 16:38) [3]

если он RegisterClass то
frame:=FindClass(ClassName).Create;


 
Zhouck ©   (2003-09-26 16:51) [4]

Попробовал так
MainFrame:=FindClass(FrameClass.ClassName).Create;
Получаю несовместимость типов TFrame и TPersistent


 
don-do   (2003-09-26 16:55) [5]

Дык приведение типов на что?


 
me   (2003-09-26 17:01) [6]

TComponent(frame):= TComponentClass(FindClass(ClassName)).Create(<owner>);


 
Palladin ©   (2003-09-26 17:03) [7]

а проще нельзя чтоли?

MainFrame:=TFrame(FindClass(FrameClass.ClassName)).Create();


 
Zhouck ©   (2003-09-26 17:04) [8]

Интересно. Это как
C:=FindClass(FrameClass.ClassName).Create;
MainFrame:=C as FrameClass
так не канает
или что ?


 
Zhouck ©   (2003-09-26 17:09) [9]

Ага

procedure TMainForm.ShowFrame(FrameClass: TClass;ParentPanel:TWinControl);
begin
if(MainFrame<>nil) then
MainFrame.Free();
MainFrame:=TFrame(FindClass(FrameClass.ClassName)).Create(nil);
MainFrame.Parent:=ParentPanel;
MainFrame.Align:=alClient;
end;
procedure TMainForm.CallFirstFrameClick(Sender: TObject);
begin
if(MainFrame<>nil) then
MainFrame.Free();
ShowFrame(TFrame2,(ContainerFrame as TObject));
end;


Получаем Access violation


 
me   (2003-09-26 17:10) [10]

Palladin © (26.09.03 17:03) [7]

Можно.

type
TFrameClass = class of TFrame;

MainFrame:=TFrame Class(FindClass(FrameClass.ClassName)).Create(<owner>);


 
Zhouck ©   (2003-09-26 17:15) [11]

Ура . Последний вариант таки заработал правильно



Страницы: 1 вся ветка

Текущий архив: 2003.10.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
7-27759
Buffoon
2003-07-24 00:04
2003.10.09
Синий экран в windows XP


6-27632
Gimer
2003-08-11 23:12
2003.10.09
IE вместо TWebbrowser


1-27524
13/NOx/79
2003-09-30 08:51
2003.10.09
Нужна помощь!


3-27413
denis24
2003-09-17 17:29
2003.10.09
кодировка в ole db 4.0


14-27710
Санёк
2003-09-21 19:08
2003.10.09
Добрый день мастера!