Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];

Вниз

RTTI   Найти похожие ветки 

 
ANTPro ©   (2007-08-30 17:07) [0]

Возможно ли узнать имя экземпляра класса в его конструкторе.


 
Reindeer Moss Eater ©   (2007-08-30 17:08) [1]

А какие сомнения?
Это же обычное свойство.


 
ANTPro ©   (2007-08-30 17:12) [2]

Я наверно не правильно выразился:

begin
 GlobalGame := TGame.Create;
 GlobalGame.Start;
 GlobalGame.Free;
end.

---
Как в TGame.Create получить строку GlobalGame ?


 
Ega23 ©   (2007-08-30 17:13) [3]

Self


 
Reindeer Moss Eater ©   (2007-08-30 17:14) [4]

GlobalGame := TGame.Create;

А кто тебе сказал, что имя экземпляра будет глобалгейм?


 
Ega23 ©   (2007-08-30 17:15) [5]

constructor TGame.Create;
begin
 ShowMessage(Self.ClassName);
end;


если я правильно понял то, что тебе нужно.


 
Сергей М. ©   (2007-08-30 17:15) [6]


> Как в TGame.Create получить строку GlobalGame ?
>


Никак.


 
Reindeer Moss Eater ©   (2007-08-30 17:15) [7]

Оно вообще будет пустое по твоему коду


 
Сергей М. ©   (2007-08-30 17:17) [8]


> ANTPro ©   (30.08.07 17:12) [2]


GlobalGame в твоем коде - идентификатор некоей переменной, о наличии коей код в теле конструктора класса TGame не имеет ни малейшего понятия.


 
Сергей М. ©   (2007-08-30 17:18) [9]

И RTTI здесь, кстати, ни причем вообще


 
Reindeer Moss Eater ©   (2007-08-30 17:19) [10]

тем более что переменных, указывающих на один и тот же эекземпляр, может быть вагон и маленькая тележка.


 
Сергей М. ©   (2007-08-30 17:20) [11]


> может быть вагон и маленькая тележка.
>


А может быть и ни вагона ни тележек, что тоже кстати.


 
Reindeer Moss Eater ©   (2007-08-30 17:21) [12]

и самое главное нафига это вообще хотеть знать, если на рантайме нет уже никаких имен у переменных


 
Сергей М. ©   (2007-08-30 17:22) [13]


> ANTPro ©   (30.08.07 17:07)
>
> имя экземпляра класса


И, в целом и общем, не гони ботву - у экземпляра класса нет никакого "имени".


 
ANTPro ©   (2007-08-30 17:23) [14]

> [5] Ega23 ©   (30.08.07 17:15)

Это имя класса.
А мне надо имя Self в коде.


> [8] Сергей М. ©   (30.08.07 17:17)

Да спасибо я понял.


> [9] Сергей М. ©   (30.08.07 17:18)

Я думал что RTTI более функционально :)

Вот для чего это надо:
[-------0] Информация    : Экземпляр GlobalLog класса TLog создан.
[------96] Информация    : Экземпляр RenderTime класса TPerformance создан.
[------55] Информация    : Экземпляр FPSCounter класса TPerformance создан.
[------88] Информация    : Экземпляр GlobalInput класса TUserInput создан.
[------36] Информация    : Экземпляр  класса TProcArray создан.
[------56] Информация    : Экземпляр GlobalRender класса TRender создан.
[------95] Информация    : Экземпляр GlobalWindow класса TWindow создан.
[------50] Информация    : Экземпляр  класса TLights создан.
[------56] Информация    : Экземпляр  класса TLight создан.
[------56] Информация    : Экземпляр GlobalCore класса TCore создан.
[------56] Информация    : Экземпляр DebugCounter класса TPerformance создан.
[------56] Информация    : Среднее время выполнения счетчика DebugCounter: 0 ms
[------56] Информация    : Экземпляр DebugCounter класса TPerformance разрушен.
[----6371] Информация    : Экземпляр GlobalWindow класса TWindow разрушен.
[------44] Информация    : Экземпляр  класса TCamera разрушен.
[------56] Информация    : Экземпляр  класса TCamera разрушен.
[------56] Информация    : Экземпляр  класса TSkyBox разрушен.
[------56] Информация    : Экземпляр  класса TObject3D разрушен.
[------56] Информация    : Экземпляр  класса TCamera разрушен.
[------56] Информация    : Экземпляр  класса TModel разрушен.
[------56] Информация    : Экземпляр GlobalData класса TGame разрушен.
[------56] Информация    : Экземпляр GlobalInput класса TUserInput разрушен.
[------56] Информация    : Экземпляр  класса TProcArray разрушен.
[------56] Информация    : Экземпляр GlobalRender класса TRender разрушен.
[------56] Информация    : Среднее время выполнения счетчика RenderTime: 81 ms
[------56] Информация    : Экземпляр RenderTime класса TPerformance разрушен.
[------56] Информация    : Среднее время выполнения счетчика FPSCounter: 3473876 ms
[------56] Информация    : Экземпляр FPSCounter класса TPerformance разрушен.
[------56] Информация    : Экземпляр GlobalCore класса TCore разрушен.
[------56] Информация    : Экземпляр GlobalLog класса TLog разрушен.


 
ANTPro ©   (2007-08-30 17:24) [15]

> [13] Сергей М. ©   (30.08.07 17:22)

Придется сделать :(


 
Reindeer Moss Eater ©   (2007-08-30 17:27) [16]

Вот для чего это надо:
[-------0] Информация    : Экземпляр GlobalLog класса TLog создан.


Присваивай имена экземплярам и будет тебе щастие


 
Ega23 ©   (2007-08-30 17:42) [17]


>
> Это имя класса.
> А мне надо имя Self в коде.
>


А, пардон, нафига?
Просто есть мнение, что у тебя что-то не так с идеологией...


 
Юрий Зотов ©   (2007-08-30 18:32) [18]

> ANTPro ©   (30.08.07 17:23) [14]

> А мне надо имя Self в коде.

А никакого имени у Selph, вообще говоря, нет. Имя есть у компонентов(да и то не всегда), а Self может быть и не компонентом.


 
TUser ©   (2007-08-30 18:52) [19]

Имхо, автору надо получить имя переменной. Только на самом деле не надо, это только там кажется.

Вот в си можно много присвоений сразу делать. Если в билдере (а там такое же RTTI) написать

VarName1 = VarName2 = TAnyObj.Create;

или как там положено, то что надо будет получить - "VarName1" или "VarName2"?


 
Инс ©   (2007-08-30 19:03) [20]

Интересно, если бы это было возможно, то какое "имя" вы бы получили в конструкторе в следующем коде:

with TMyClass.Create do ...

или в таком:

A:=TMyClass.NewInstance;
B:=A;
B.Create;


 
Инс ©   (2007-08-30 19:28) [21]


> Я думал что RTTI более функционально :)


RTTI - это информация о типах, а не об идентификаторах


 
ANTPro ©   (2007-08-30 19:44) [22]

> [21] Инс ©   (30.08.07 19:28)

Да я в курсе, но мало ли :)


> [17] Ega23 ©   (30.08.07 17:42)

Пример я привел, для дебуга это все. Адрес как-то некузяво выглядит :)

> [16] Reindeer Moss Eater ©   (30.08.07 17:27)

Да, так и думаю сделать.
Добавить поле:
FSelfName:String;
А заполнять в конструкторе.


> [20] Инс ©   (30.08.07 19:03)
> Интересно, если бы это было возможно, то какое "имя" вы
> бы получили в конструкторе в следующем коде:
>
> with TMyClass.Create do ...
>
> или в таком:
>
> A:=TMyClass.NewInstance;
> B:=A;
> B.Create;

Если @A будет равен @B. То будут имена одинаковыми.


 
Инс ©   (2007-08-30 19:50) [23]


> Если @A будет равен @B. То будут имена одинаковыми.

Не понял. В данном случае @A <> @B. Значение, содержащееся в A и B одинаковы. Так что же вы бы хотели получить в конструкторе, "A" или "B"? ;)


 
ANTPro ©   (2007-08-30 20:18) [24]

> [23] Инс ©   (30.08.07 19:50)

Что если A и B будут унаследованны от TMyBaseClass?
(Делфя упала немогу проверить, но думаю то что мне нужно)
unit Unit2;

interface
{$M+}
type
 TMyBaseClass = class
   constructor Create(SelfName: string);
 private
 protected
   FSelfName: string;
 public
   property SelfName: read FSelfName;
 published
 end;
{$M-}
implementation

constructor TMyBaseClass.Create(SelfName: string);
begin
 FSelfName:=SelfName;
end;

end.


 
ANTPro ©   (2007-08-30 20:37) [25]

Скомпилял :)

 A:=TMyBaseClass.Create("A");
 A.NewInstance;
 B:=A;
 B.Create("B");


@A<>@B A:=B B:=B
Эх, как, много я еще не знаю :(

Есть более разумные предложения?


 
Инс ©   (2007-08-30 21:00) [26]


> Скомпилял :)


Что это??? :-0


 
ANTPro ©   (2007-08-30 21:10) [27]

> [26] Инс ©   (30.08.07 21:00)

Где-то запятой не хватает?


 
Инс ©   (2007-08-30 21:13) [28]

Я бы сказал чего не хватает... Сам хоть понял что написал? Кодом в [20] я хотел спросить, какую строку в конструкторе ты хотел получить, "A" или "B", так как в данном случае и A и B на момент вызова Create будут ссылаться на этот экземпляр. А вот что ты написал я не понял. Да еще и не правильно, утечка памяти будет.


 
Юрий Зотов ©   (2007-08-30 21:35) [29]

> ANTPro ©   (30.08.07 20:37) [25]

> Эх, как, много я еще не знаю

Не так уж и много. Вы не знаете, что такое указатели, статическая и динамическая память. Очень советую с этим вопросом разобраться.

Потому что как только Вы это поймете, так тут же поймете и другое - что такое объект и ссылки на него. Включая тот самый загадочный Self.

А заодно поймете и то для обращения к объекту никакие имена и вовсе не нужны.


 
ANTPro ©   (2007-08-30 21:59) [30]

> [28] Инс ©   (30.08.07 21:13)
Кодом в [20] я хотел спросить, какую строку в конструкторе ты хотел получить, "A" или "B", так как в данном случае и A и B на момент вызова Create будут ссылаться на этот экземпляр.

Да, я понял, посмотрел реализацию InitInstance.


> [28] Инс ©   (30.08.07 21:13)
> А вот что ты написал я не понял. Да еще и не правильно,
> утечка памяти будет.

Я только хотел посмотреть, что будет результатом выполнения предложенного кода.


 
Инс ©   (2007-08-30 22:18) [31]


> Я только хотел посмотреть, что будет результатом выполнения
> предложенного кода.

Посмотрели? :) Вот вам ссылочка, чтобы легче было разобраться с тем, что делают методы Create, NewInstance, InitInstance.
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=216

Заодно рекомендую найти ответ на вопрос, чем
MyClass.Create
олличается от
MyClass:=TMyClass.Create;


 
ANTPro ©   (2007-08-30 22:57) [32]

> [31] Инс ©   (30.08.07 22:18)

Спасибо. Очень интересно.


> [31] Инс ©   (30.08.07 22:18)
> Заодно рекомендую найти ответ на вопрос, чем
> MyClass.Create
> олличается от
> MyClass:=TMyClass.Create;

Важно знать, что при вызове конструктора класса он вызывается как конструктор и создает экземпляр, при вызове же конструктора у объекта он вызывается как процедура и нового экземпляра не создает. © От туда


 
oxffff ©   (2007-08-30 23:02) [33]


> ANTPro ©   (30.08.07 22:57) [32]
> > [31] Инс ©   (30.08.07 22:18)
>
> Спасибо. Очень интересно.
>
>
> > [31] Инс ©   (30.08.07 22:18)
> > Заодно рекомендую найти ответ на вопрос, чем
> > MyClass.Create
> > олличается от
> > MyClass:=TMyClass.Create;
>
> Важно знать, что при вызове конструктора класса он вызывается
> как конструктор и создает экземпляр, при вызове же конструктора
> у объекта он вызывается как процедура и нового экземпляра
> не создает. © От туда


Привет земляк.

Если хочешь еще больше знать посмотри работу _ClassCreate, обрати внимание на работу с регистром dl в конструкторе.
Лучшее познание Delphi это изучение pas файлов system, Sysinit, TypInfo,variants и конечно отладчик.


 
ANTPro ©   (2007-08-31 00:13) [34]

> [33] oxffff ©   (30.08.07 23:02)

Да, я понял. Спасибо.

Всетаки придется обойтись IntToHex(Integer(@Self),8), а жаль, хотелось наглядности :(


 
Юрий Зотов ©   (2007-08-31 03:15) [35]

> ANTPro ©   (31.08.07 00:13) [34]

@Self - неверно. В который раз уже Вы делаете одну и ту же ошибку. И будете продолжать ее делать, пока не разберетесь с указателями.


 
ANTPro ©   (2007-08-31 13:18) [36]

> [35] Юрий Зотов ©   (31.08.07 03:15)

Можете подсказать хорошую книгу?
Во всех что у меня есть описанно, как-то поверхносно, и без примеров :(


 
Юрий Зотов ©   (2007-08-31 13:51) [37]

> ANTPro ©   (31.08.07 13:18) [36]

1. Указатели, работа с памятью и все остальное, относящееся к Паскалю:

В.В. Фаронов. Программирование в среде Turbo Pascal 5.0.

За точность названия не ручаюсь, но слова "Turbo Pascal 5.0" в нем точно есть. Не смотрите, что книжка старая, пользы от нее будет ОЧЕНЬ много.

2. Delphi (Object Pascal):

Стив Тейксейра и Ксавье Пачеко. У них несколько книг, по разным версиям Delphi, лично мне больше нравится книжка по версии 5. Тоже не смотрите, что книжка старая, пользы от нее тоже будет ОЧЕНЬ много.

3. Объектная модель Delphi, устройство VCL, основы устройства IDE:

Рэй Конопка. И тоже не смотрите, что книжка старая, лучше нее по ЭТОЙ тематике пока еще никто не написал, ИМХО.


 
ANTPro ©   (2007-08-31 17:57) [38]

> [37] Юрий Зотов ©   (31.08.07 13:51)

Спасибо.


> [37] Юрий Зотов ©   (31.08.07 13:51)
> 2. Delphi (Object Pascal):
>
> Стив Тейксейра и Ксавье Пачеко. У них несколько книг, по
> разным версиям Delphi, лично мне больше нравится книжка
> по версии 5. Тоже не смотрите, что книжка старая, пользы
> от нее тоже будет ОЧЕНЬ много.

Прочитал первую часть, как-то поверхностно :(



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.043 c
1-1184871572
TUser
2007-07-19 22:59
2007.09.30
Turbo Delphi


2-1188644231
17Landgraf
2007-09-01 14:57
2007.09.30
Вопрос по поводу свойства Charset класса TFont


4-1175317863
igornov
2007-03-31 09:11
2007.09.30
Как получить список запущенных приложений из службы?


15-1188540152
mixer
2007-08-31 10:02
2007.09.30
Помогите найти минусовку


3-1177057304
Amid
2007-04-20 12:21
2007.09.30
Цикл по всем записям ADODataSet





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский