Главная страница
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.027 c
14-27684
Мазут Береговой
2003-09-22 09:12
2003.10.09
Сегодня праздник!


14-27648
___Nikolay
2003-09-19 05:52
2003.10.09
* Задача 3 *


3-27363
ki11er
2003-09-17 18:37
2003.10.09
Прогрес для TQuery


1-27509
Bocman
2003-09-26 15:05
2003.10.09
выделен ли текст в Edit


1-27484
Эли
2003-09-26 19:55
2003.10.09
OpenDialog