Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2009, 15:17   #1
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию Передача имени класса как параметра

Вот есть у нас некий класс:
Код:
Tc1=class(Tobject)
private
 fobject:Tobject;
 procedure setobject(value:Tobject);
public
 constructor create (<что- то здесь>);
 destructor destroy; override;
 property ObjectJob:TObject read fobject write setobject;
........
constructor Tc1.create (<что- то здесь>);
begin
{цель: получить в качестве параметра имя класса, являющегося потомком TObject, 
и создать экземпляр (fobject) полученного класса.}
end;
destructor Tc1.destroy;
begin
fobject.free;
inherited destroy;
end;
.............
Вот собсвенно и вопрос: как передать имя некого класса и затем создать экземпляр этого класса, проверив, разумеется, является ли он потомком TObject.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 06.04.2009, 15:40   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

А разве просто указать TObject нельзя ? А Дельфи проверит, является ли класс потомком TObject или иначе даст ошибку. Там вроде имя класса в виде String дает кажется GetClassName или что-то в таком духе.
BOBAH13 вне форума Ответить с цитированием
Старый 06.04.2009, 15:58   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Могу предложить такой путь:
Код:
procedure TForm1.FormCreate(Sender: TObject);
procedure aga(c:TObject);
begin
 if c.ClassParent= TObject then
  caption:='Предок - ТОбьект';
end;
begin
 aga(TObject(Form1));
end;
Хотя, Квэнди, мож попроще можно твою проблему решить, ты обьясни зачем тебе это?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.04.2009, 16:10   #4
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

не, идея в другом: в качестве параметра передается строка, которая по факту является названием класса. а в коде того же конструктора, к примеру, необходимо привести внутреннюю переменную типа TObject к полученному классу, чтобы были доступны через MethodAddress его методы для выполнения.
В общем виде хочется увидеть это:
Код:
procedure dosome (classn:string);
var o:tobject;
begin
o:=(Tobject as classn).create;
end;
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи

Последний раз редактировалось Квэнди; 06.04.2009 в 16:12.
Квэнди вне форума Ответить с цитированием
Старый 06.04.2009, 16:15   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
привести внутреннюю переменную типа TObject к полученному классу
Ну тогда даже не знаю...
Если это контролы то еще можно через FindComponent() получить, а если голые классы....

P.S. Помоему Делфи не научили таким мастерствам работы с ООП...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.04.2009, 16:18   #6
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Вобщем получилось в грубом виде.
Код:
unit Unit33;

interface

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

type
  tcl1=class (TPersistent)
  published
    	procedure mm (s:AnsiString);
  end;
  myproc  =procedure (s:AnsiString) of object;
  TForm33 = class(TForm)
    btn1: TButton;
    edt1: TEdit;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form33: TForm33;

implementation

{$R *.dfm}
procedure tcl1.mm(s: AnsiString);
begin
  showmessage(s);
end;
procedure TForm33.btn1Click(Sender: TObject);
var m:TMethod;
ss:tobject;
begin
ss:=GetClass('tcl1').Create;
m.data:=ss;
m.Code:=ss.MethodAddress(edt1.Text);
myproc(m)(edt1.Text);
end;
initialization
RegisterClass(Tcl1);
end.
Соответсвенно вроде все отечает задачам ) ну отказ от Tobject в сторону TPersistent сыграет только в плюс
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 06.04.2009, 16:22   #7
Антон Ю.Б.
Форумчанин
 
Регистрация: 03.01.2009
Сообщений: 116
По умолчанию

А FindClass(ClassN) ?
Антон Ю.Б. вне форума Ответить с цитированием
Старый 06.04.2009, 16:26   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Антон:
Цитата:
Finds and returns a class that is derived from TPersistent.
Так что неизвесно возьмет ли он все что ниже по уровню.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.04.2009, 16:28   #9
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

А смысл тот же
Цитата:
Findclass
Finds and returns a class that is derived from TPersistent.
function FindClass(const ClassName: string): TPersistentClass;
Цитата:
Getclass
Returns a registered persistent class given its name.
function GetClass(const AClassName: string): TPersistentClass;
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 06.04.2009, 16:34   #10
Антон Ю.Б.
Форумчанин
 
Регистрация: 03.01.2009
Сообщений: 116
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Так что неизвесно возьмет ли он все что ниже по уровню.
В смысле? А как еще понимать "derived from"?

Цитата:
а смысл тот же
Почти, если в найденном говорят правду:
Цитата:
Данная функция аналогична функции FindClass за исключением того, что если для указанного имени не найден зарегистрированный класс, то функция GetClass возвращает nil.

Последний раз редактировалось Stilet; 07.04.2009 в 08:58.
Антон Ю.Б. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача метода класса в качестве параметра в другой метод Dmytry87 Общие вопросы C/C++ 0 12.11.2008 15:28
Передача строки-как параметра-переменной Иллидан Общие вопросы Delphi 13 03.10.2008 18:40
Передача компонента как параметра в функцию hayhay Microsoft Office Excel 1 11.03.2008 15:53
Передача параметра в поток joker Win Api 10 22.12.2007 12:53