Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
3-27343
MJ
2003-09-19 23:18
2003.10.09
динамический запрос


1-27588
Shuba
2003-09-29 10:51
2003.10.09
Буфер обмена в XP


14-27678
MsGuns
2003-09-21 15:12
2003.10.09
Первая женщина


1-27427
AlexanderSK
2003-09-30 13:56
2003.10.09
Новый класс от TFrame


3-27380
rava
2003-09-18 14:58
2003.10.09
UPDATE без SP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский