Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TObject.Create(без переменной), как добраться до полей?


Kolan ©   (2007-05-21 18:29:00) 

Вот код:
var
 Command: TFFTMeasuredCommand;
begin
 Command := TPressureMeasuredCommand.Create;
 Command.FFFT := FFTResults;
 TSystemMediator.GetInstance.SendMessage(Command);
end;


Если бы ненадо было заполнять Command.FFFTможно было бы написать:
TSystemMediator.GetInstance.SendMessage(TPressureMeasuredCommand.Create);< /CODE>

А тут как быть? Можно ли сократить запись?


SpellCaster   (2007-05-22 16:12:00) [1]

> [16] Leonid Troyanovsky ©   (22.05.07 15:06)

А, теперь понял. Просто линк не пащет, поэтому я статью и не сумел прочитать.
Хм, порождать дочерний класс и реализовывать функцию только ради того, чтобы избавиться от объявления переменной? Сомнительный выигрыш...


Leonid Troyanovsky   (2007-05-22 15:06:00) [2]


> SpellCaster   (22.05.07 14:45) [15]
> Что-то я первый раз встречаю использорвание This в Дельфе.
> .. У меня такая конструкция не заработала.

Ты читал не сначала.

Хотя, раз уж ссылка сейчас не работает, повторю своими словами:

Классический способ решения предложил Андрей Лобанов:
для объектов, нуждающихся в самопознании, можно создать
такого потомка:

type
 TSomeObjectREf = class(TSomeObject)
    function This: TSomeObjectRef;
 end;

function TSomeObjectRef.This;
begin
  Result := Self;
end;


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

--
Regards, LVT.


SpellCaster   (2007-05-22 14:45:00) [3]

Что-то я первый раз встречаю использорвание This в Дельфе... У меня такая конструкция не заработала.


Однокамушкин   (2007-05-22 11:13:00) [4]


> Kolan ©   (22.05.07 10:37) [13]

Зато с переменной всё просто и понятно... А то какой-то this, с которым ещё разбираться... да и оператор with считается не совсем безопасным - там не вссегда понятно, что к чему относится... И всё это нагромождение, чтобы всего лишь не объявлять вспомогательную переменную? Не вижу логики...


Kolan   (2007-05-22 10:37:00) [5]

> Простой и ясный код заменили на какую-то ерунду

Вот ести у меня ф-ция которая скажем что считает. Нах в ней объявлять Command, который к ней отношения не имеет. Приходится делать Что=то тима DoSendMessage.  А так это не требуется…


Kolan   (2007-05-22 10:35:00) [6]

> И вы считаете, что это проще, чем первоначальный вариант?

Угу, переменной нет.


Однокамушкин   (2007-05-22 08:11:00) [7]


> Kolan ©   (21.05.07 22:03) [9]
> Или можно так:, тоже ниче имхо…

И вы считаете, что это проще, чем первоначальный вариант? Простой и ясный код заменили на какую-то ерунду, через которую ещё продраться надо, чтобы понять, что к чему... О накладных расходах на вызов метода я вообще молчу...


Loginov Dmitry   (2007-05-21 22:15:00) [8]

Имхо, удобнее, так объявлять:

ThisLoadPressureCommand: TLoadPressureCommand;
ThisPressureMeasuredCommand: TPressureMeasuredCommand;

Тогда можно во вложенных withиспользовать различные объекты, обладающие общим набором методов.


Kolan   (2007-05-21 22:03:00) [9]

Или можно так:, тоже ниче имхо…
 with TLoadPressureCommand.Create do
   with TLoadPressureCommand(This) do
   begin
     FFileName := '';
     TSystemMediator.GetInstance.SendMessage(This);
   end;


Kolan   (2007-05-21 22:01:00) [10]

> This — сделай TPressureMeasuredCommand,

Не не этих комманд много, запарюсь делать, я лучьше в предке…


Leonid Troyanovsky   (2007-05-21 22:00:00) [11]


> Leonid Troyanovsky ©   (21.05.07 21:59) [5]

> опережающее объявление TPressureMeasuredCommand = class

Это даже не нужно, sorry.

--
Regards, LVT.


Kolan   (2007-05-21 22:00:00) [12]

> Leonid Troyanovsky ©   (21.05.07 21:44)

Короче круто, то что нужно :). Благодарю.


Leonid Troyanovsky   (2007-05-21 21:59:00) [13]


> Kolan ©   (21.05.07 21:51) [4]

> Вроде короче, еще бы приведения не былобы…

Зачем приведение? This - сделай TPressureMeasuredCommand,
опережающее объявление TPressureMeasuredCommand = class

--
Regards, LVT.


Kolan   (2007-05-21 21:51:00) [14]

Итого, было:
var
Command: TFFTMeasuredCommand;
begin
Command := TPressureMeasuredCommand.Create;
Command.FFFT := FFTResults;
TSystemMediator.GetInstance.SendMessage(Command);
end;


Станет:
begin
with TPressureMeasuredCommand.Create do
  (This as TPressureMeasuredCommand).Command.FFFT := FFTResults;
TSystemMediator.GetInstance.SendMessage(Command);
end;


Вроде короче, еще бы приведения не былобы…


Leonid Troyanovsky   (2007-05-21 21:44:00) [15]


> Kolan ©   (21.05.07 21:22) [2]

> Я имел ввиду что то с with…

http://rsdn.ru/Forum/Message.aspx?mid=673350&only=1

--
Regards, LVT.


Kolan   (2007-05-21 21:22:00) [16]

> constructor TPressureMeasuredCommand.Create; override.

Нет нет это не то.
Я имел ввиду что то с with…


Leonid Troyanovsky   (2007-05-21 19:16:00) [17]


> Kolan ©   (21.05.07 18:29)  

> А тут как быть? Можно ли сократить запись?

constructor TPressureMeasuredCommand.Create; override.

--
Regards, LVT.


Наверх

Титульная страница Поиск, карта сайта Написать письмо