![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как передать неявно созданный объект в процедуру? [D5, WinXP]
Eero © (2008-02-22 21:43:00)Имеется некая процедура с параметром:
procedure tform1.SomeProc(f:tform);
begin
some_code;
end;
Где-то в программе я создаю новую форму:
procedure tform1.Button1Click(sender:tobject);
begin
With tsomeform.create(self) do begin
showmodal;
free;
end;
хочется вовнутрь with..end вставить вызов SomeProc, передав указатель на свежесозданную форму.
Как-нибудь типа так
showmodal;
SomeProc(current);
free;
но что-то не могу найти ничего подобного.
self - указывает на основную форму.
про объявление локальной переменной - знаю, меня интересует именно данная задача.
Плохиш (2008-02-24 01:27:00) [21]
> Германн © (24.02.08 01:07) [23]
> Но ведь суть-то в том, что эта переменная сама по себе нужна
> только для того чтобы написать:
> CommandList.Add(Command); И больше ни для чего.
Блин, представляю, мучения истерзанной души в том, что дя цикла for обязательнонадо явно описывать переменную цикла, даже если она больше нигде не используется :-))
Германн (2008-02-24 01:07:00) [22]
> подозреваю, что команд было несколько
Несколько? Ну примерно от нескольких единиц до нескольких десятков в час :)
И так круглосуточно.
> Честно, не понимаю почему бы не описать одну переменную
> типа TCommand
Так ес-сно и сделал.Command : TCommand;Но ведь суть-то в том, что эта переменная сама по себе нужна только для того чтобы написать:
CommandList.Add(Command);И больше ни для чего.
Плохиш (2008-02-24 00:54:00) [23]
> Германн © (24.02.08 00:51) [21]
Честно, не понимаю почему бы не описать одну переменную типа TCommand или (подозреваю, что команд было несколько) типа общего предка?
Германн (2008-02-24 00:51:00) [24]
> Плохиш © (24.02.08 00:41) [19]
>
>
Это ты здря :-)
У меня тоже было нечто подобное. По запросу пользователя создавались "команды" для устройства:
TCommand = class
Addr, Cmd : Integer;
...
Поскольку эти команды не могли быть исполнены сразу, то я создалCommandList типа TList и в него их добавлял. Вот мне было бы удобно написать нечто такое:
with TCommand.Create do begin
Addr:=...;
Cmd:=...;
...
CommandList.Add(...);
Плохиш (2008-02-24 00:43:00) [25]Кстати, аФФтару, а объект-то создаёшь явно.
Плохиш (2008-02-24 00:41:00) [26]
> GrayFace (23.02.08 21:17) [18]
> Такие ситуации возникают довольно часто и с плохим дизайном
> никак не связано
О, маразмом ещё и хвалятся...
GrayFace (2008-02-23 21:17:00) [27]Leonid Troyanovsky © (23.02.08 11:10) [12]
Не нужно ради пары экзотических случаев вводить некое слово.
И, во-ще-то, кроме эстетства тут попахивает bad design, бо
у локального объекта не должно быть потребностей в глобальных
процедурах и стоило оные вызовы делать в методах объекта, где
ссылка на себя есть.
Такие ситуации возникают довольно часто и с плохим дизайном никак не связано (может, кроме этого случая). В большинстве случаев объекты в with - чужие и процедуры в них не добавить. Последний раз у меня такое возникало при чтении/записи ini-шек и при чтении/записи Stream'а.
Anatoly Podgoretsky (2008-02-23 11:52:00) [28]> Leonid Troyanovsky (23.02.2008 11:46:16) [16]
А что были?
Я помню эти советы, не понимаю только почему я жив.
Leonid Troyanovsky (2008-02-23 11:46:00) [29]
> Anatoly Podgoretsky © (23.02.08 11:37) [15]
> Тут еще люди не подходили, которые тебе посоветуют создать
> метод, для получения анонимного адреса.
Как это не подходили :)
--
Regards, LVT.
Anatoly Podgoretsky (2008-02-23 11:37:00) [30]
> про объявление локальной переменной - знаю
А ведь знаю же, но назло маме уши отморожу.
Тут еще люди не подходили, которые тебе посоветуют создать метод, для получения анонимного адреса.
До чего только не дойдет русский программист, только бы не работать.
Anatoly Podgoretsky (2008-02-23 11:34:00) [31]
> и можно было бы не думать о лишней переменной в стеке.
И ты тоже где нашел лишнюю.
Чтобы чтото продать, сначала надо что то купить.
Anatoly Podgoretsky (2008-02-23 11:33:00) [32]
> Афигеть, какого только маразма не придумывают ради экономии
> 4х байт в стеке.
А где ты экономию нашел, они есть, просто они анонимны.
Leonid Troyanovsky (2008-02-23 11:10:00) [33]
> Германн © (23.02.08 02:34) [10]
> известна. Стоило бы только ввести служебное слово соответствующее
> этой ссылке и можно было бы не думать о лишней переменной
Не нужно ради пары экзотических случаев вводить некое слово.
И, во-ще-то, кроме эстетства тут попахивает bad design, бо
у локального объекта не должно быть потребностей в глобальных
процедурах и стоило оные вызовы делать в методах объекта, где
ссылка на себя есть.
--
Regards, LVT.
Leonid Troyanovsky (2008-02-23 11:01:00) [34]
> Eero (22.02.08 22:20) [4]
http://www.rsdn.ru/Forum/Message.aspx?mid=673350&only=1
--
Regards, LVT.
Германн (2008-02-23 02:34:00) [35]Хотя если это было бы как-то реализовано в CompilerMagic, я бы не возражал. Ведь ссылка на созданный объект компилятору известна. Стоило бы только ввести служебное слово соответствующее этой ссылке и можно было бы не думать о лишней переменной в стеке.
Германн (2008-02-23 02:24:00) [36]
> Плохиш © (23.02.08 02:19) [8]
>
> Афигеть, какого только маразма не придумывают ради экономии
> 4х байт в стеке.
>
Это всё эстетство виновато. А кто такие эстеты ты и сам наверно знаешь. :)
Читал ведь Гашека :)
Плохиш (2008-02-23 02:19:00) [37]Афигеть, какого только маразма не придумывают ради экономии 4х байт в стеке.
korneley (2008-02-22 22:57:00) [38]Ага... про овобождение я погорячился %))
korneley (2008-02-22 22:55:00) [39]Ну может написать свойство у
tsomeform, выдающее ссылку на нея саму, и тогда
procedure tform1.Button1Click(sender:tobject);
begin
With tsomeform.create(self) do begin
showmodal;
SomeProcedure(someform_self);
free;
end;
только не понятно, зачем? И кто освободит память, в случае возникновения эксепшена доfree?
Palladin (2008-02-22 22:54:00) [40]ага... наслаждайся
type
tmo=class
sss:string;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
d:procedure of object;
begin
with tmo.Create Do
try
sss:='12';
d:=free;
ShowMessage(tmo(TMethod(d).Data).sss);
finally
free;
end;
end;