powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Можно ли восстановить тип по объявленной переменной?
25 сообщений из 32, страница 1 из 2
Можно ли восстановить тип по объявленной переменной?
    #39545434
SergeyOren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые форумчане!

Подскажите самоучке:
Есть несколько экземпляров разных потомков одного класса. Они объявлены в соответствии со своим классом с перекрытием Create-а, но не инициализированы.
Хотелось бы для экономии памяти инициализировать их по необходимости в процедуре, переменной в которой выступает экземпляр. Например:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
type MainClass = class
...........
end;

type Class1 = class(MainClass)
.............
end;

type Class2 = class(MainClass)
.............
end;
//=======================
var Sample1 : Class1;
Sample2 : Class2;
//========================
procedure InitSample(var Sample;........)
begin
 //Вот тут хочется узнать тип Sample (Class1 или Class2) и при необходимости выполнить соответствующий Create.
end;


Благодарен за любую помощь

Модератор: Пользуйтесь тегом (кнопкой) SRC для оформления кода, пожалуйста.
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545454
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeyOren,

Ну, например так:

Код: pascal
1.
2.
3.
4.
5.
6.
procedure InitSample(Sample: TObject)
begin
  if Sample is Class1 then ... // Sample - это Class1 *или его наследник*
  // вариант 2:
  if Sample.ClassName = 'Class1' then ... // Sample - это Class1
end;
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545521
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpНу, например так:Sample = nil
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545524
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeyOren,

В такой постановке задача не решается. Для инициализации нужна еще информация о типе
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545545
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_В такой постановке задача не решается
Да ладно...
Код: pascal
1.
2.
3.
4.
5.
If @Sample = @Sample1 Then
 Sample := Class1.Create
Else
 If @Sample = @Sample2 Then
  Sample := Class2.Create;


Только, фу так делать.
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545556
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeyOren,

задание типа через "class of" нет?
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545560
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
type MainClass = class
public
  constructor Create; virtual;
end;

TMainClassClass = class of MainClass;

type Class1 = class(MainClass)
public
  constructor Create; override;
end;

type Class2 = class(MainClass)
public
  constructor Create; override;
end;
//=======================
var Sample1 : Class1;
Sample2 : Class2;
//========================
procedure InitSample(var Sample; AClass: TMainClassClass);
begin
  MainClass(Sample) := AClass.Create;
end;

InitSample(Sample1, Class1);
InitSample(Sample2, Class2);
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545562
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey_Vasilisk_В такой постановке задача не решается
Да ладно...
...
Только, фу так делать.
И не надо так делать . Что мешает сделать по образу и подобию работы с формами:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
type
  TClassMainClass = cass of MaintClass;

procedure InitSample(var aSample: MainClass; aClass: TClassMainClass);
begin
  aSample := aClass.Create(...)
end;
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545563
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока писал ответ, уже накидали
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545566
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreedoomЧто мешает сделать по образу и подобию работы с формами
Ничто не мешает, но условия определяю не я.
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545572
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня один вопрос остался: где тут

SergeyOrenХотелось бы для экономии памяти
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545573
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Sample = nil
Да, что-то я затупил. Тогда действительно, не решается.
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545576
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpТогда действительно, не решается.
Прекращай тупить
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545589
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey Прекращай тупить Kazantsev Alexeyфу так делать.
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545607
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Но задача, тем не менее, решается.
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545650
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyalekcvpТогда действительно, не решается.
Прекращай тупить
Ага, а если эта переменная в другом классе (и юните) объявлена как private? :)
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545656
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Spring 4D + Lazy инициализация
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545657
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpАга, а если эта переменная в другом классе (и юните) объявлена как private? :)
А если не ударяться в фантазии?
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545747
SergeyOren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо за заботу, пойду дерзать...
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39545885
SergeyOren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GunSmoker,

спасибо, но при таких вызовах InitSample я вынужден руками указывать тип, чего как раз хотелось избежать.
Да и стоит ли городить, когда можно вместо InitSample просто вызвать Create из типа, который я все равно должен указать в InitSample.
Но все равно спасибо
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39546215
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если конструктор без параметров и переопределен через override то делается через
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
procedure TForm7.Test<T>(var aSample);
var
  Rc: TRttiContext;
  Rt: TRttiType;
  Rm: TRttiMethod;
begin
  Rc := TRttiContext.Create();
  try
    Rt := Rc.GetType(TypeInfo(T));
    // T(aSample) := Rt.AsInstance.MetaclassType.Create() as T; можно так или как ниже
    for Rm in Rt.GetMethods() do
      if Rm.IsConstructor and (Length(Rm.GetParameters()) = 0) then
      begin
        T(aSample) := Rm.Invoke(Rt.AsInstance.MetaclassType, []).AsType<T>();
        Break;
      end;
  finally
    Rc.Free();
  end;
end;
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39546341
Фотография Virtual Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteЕсли конструктор без параметров и переопределен через override то делается через
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
procedure TForm7.Test<T>(var aSample);
var
  Rc: TRttiContext;
  Rt: TRttiType;
  Rm: TRttiMethod;
begin
  Rc := TRttiContext.Create();
  try
    Rt := Rc.GetType(TypeInfo(T));
    // T(aSample) := Rt.AsInstance.MetaclassType.Create() as T; можно так или как ниже
    for Rm in Rt.GetMethods() do
      if Rm.IsConstructor and (Length(Rm.GetParameters()) = 0) then
      begin
        T(aSample) := Rm.Invoke(Rt.AsInstance.MetaclassType, []).AsType<T>();
        Break;
      end;
  finally
    Rc.Free();
  end;
end;


+1
Красиво!
Ну, а дальнейшее, я думаю, автор темы распространит по количеству параметров.
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39546412
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Virtual StudentНу, а дальнейшее, я думаю, автор темы распространит по количеству параметров.
Если кол-во параметров заранее неизвестно в конструкторе, то делается лямбда которая вызывается в момент выполнения конструктора с передачей соответствующзего объекта у которого уже будет нужный метод для инициализации
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39546415
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть же TValue
Что вы гоните :)
...
Рейтинг: 0 / 0
Можно ли восстановить тип по объявленной переменной?
    #39546506
SergeyOren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-Cite,
спасибо. Я подозревал, что задача решается ч/з RTTI, но подойти на практике образования не хватает.
Где можно почитать, чтобы осознанно модифицировать ваш код (у меня Create-ы сложные с разным набором пар-ов)?
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Можно ли восстановить тип по объявленной переменной?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]