Форум: "Основная";
Текущий архив: 2003.10.09;
Скачать: [xml.tar.bz2];
ВнизДопустим у нас есть 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c