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

Вниз

Как передать неявно созданный объект в процедуру?   Найти похожие ветки 

 
Eero   (2008-02-22 21:43) [0]

Имеется некая процедура с параметром:
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 - указывает на основную форму.
про объявление локальной переменной - знаю, меня интересует именно данная задача.


 
Palladin ©   (2008-02-22 22:09) [1]

self указывает не на основную форму, а на объект текущего метода


 
Eero   (2008-02-22 22:11) [2]


> self указывает не на основную форму, а на объект текущего
> метода

Я в курсе.
"на основную форму" - имелось ввиду в текущем контексте.

По существу вопроса ответить нечего?


 
Palladin ©   (2008-02-22 22:12) [3]

короче ты бредишь:

есть у тебя  tfrom1.method...

в рамках tform1 ты исполняешь следуещее

procedure tform1.selfmothod;
...
with tform1.crete do
try
 metohod; // будет вызов метода относительно свежесозданного with метода
 self.method; // будт вызов метода относительно объекта в рамках которого исполняется текщий метод selfmethod;
finally
 free;
end;
...


 
Eero   (2008-02-22 22:20) [4]


> короче ты бредишь:
>
> есть у тебя  tfrom1.method...
>
> в рамках tform1 ты исполняешь следуещее


длиннее ты вообще не понял сути вопроса.
я хочу сделать так

procedure tform1.Button1Click(sender:tobject);
begin
With tsomeform.create(self) do begin
  showmodal;
  SomeProcedure(а_сюда_передать_свежесозданную_форму);
  free;
end;


вьехал?


 
Palladin ©   (2008-02-22 22:54) [5]

ага... наслаждайся

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;


 
korneley ©   (2008-02-22 22:55) [6]

Ну может написать свойство у tsomeform, выдающее ссылку на нея саму, и тогда


procedure tform1.Button1Click(sender:tobject);
begin
 With tsomeform.create(self) do begin
   showmodal;
   SomeProcedure(someform_self);
   free;
 end;


только не понятно, зачем? И кто освободит память, в случае возникновения эксепшена до free?


 
korneley ©   (2008-02-22 22:57) [7]

Ага... про овобождение я погорячился %))


 
Плохиш ©   (2008-02-23 02:19) [8]

Афигеть, какого только маразма не придумывают ради экономии 4х байт в стеке.


 
Германн ©   (2008-02-23 02:24) [9]


> Плохиш ©   (23.02.08 02:19) [8]
>
> Афигеть, какого только маразма не придумывают ради экономии
> 4х байт в стеке.
>

Это всё эстетство виновато. А кто такие эстеты ты и сам наверно знаешь. :)
Читал ведь Гашека :)


 
Германн ©   (2008-02-23 02:34) [10]

Хотя если это было бы как-то реализовано в CompilerMagic, я бы не возражал. Ведь ссылка на созданный объект компилятору известна. Стоило бы только ввести служебное слово соответствующее этой ссылке и можно было бы не думать о лишней переменной в стеке.


 
Leonid Troyanovsky ©   (2008-02-23 11:01) [11]


> Eero   (22.02.08 22:20) [4]

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

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2008-02-23 11:10) [12]


> Германн ©   (23.02.08 02:34) [10]

> известна. Стоило бы только ввести служебное слово соответствующее
> этой ссылке и можно было бы не думать о лишней переменной

Не нужно ради пары экзотических случаев вводить некое слово.
И, во-ще-то, кроме эстетства тут попахивает bad design, бо
у локального объекта не должно быть потребностей в глобальных
процедурах и стоило оные вызовы делать в методах объекта, где
ссылка на себя есть.

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2008-02-23 11:33) [13]


> Афигеть, какого только маразма не придумывают ради экономии
> 4х байт в стеке.

А где ты экономию нашел, они есть, просто они анонимны.


 
Anatoly Podgoretsky ©   (2008-02-23 11:34) [14]


> и можно было бы не думать о лишней переменной в стеке.

И ты тоже где нашел лишнюю.
Чтобы чтото продать, сначала надо что то купить.


 
Anatoly Podgoretsky ©   (2008-02-23 11:37) [15]


> про объявление локальной переменной - знаю

А ведь знаю же, но назло маме уши отморожу.
Тут еще люди не подходили, которые тебе посоветуют создать метод, для получения анонимного адреса.
До чего только не дойдет русский программист, только бы не работать.


 
Leonid Troyanovsky ©   (2008-02-23 11:46) [16]


> Anatoly Podgoretsky ©   (23.02.08 11:37) [15]

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

Как это не подходили :)

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2008-02-23 11:52) [17]

> Leonid Troyanovsky  (23.02.2008 11:46:16)  [16]

А что были?
Я помню эти советы, не понимаю только почему я жив.


 
GrayFace   (2008-02-23 21:17) [18]

Leonid Troyanovsky ©   (23.02.08 11:10) [12]
Не нужно ради пары экзотических случаев вводить некое слово.
И, во-ще-то, кроме эстетства тут попахивает bad design, бо
у локального объекта не должно быть потребностей в глобальных
процедурах и стоило оные вызовы делать в методах объекта, где
ссылка на себя есть.

Такие ситуации возникают довольно часто и с плохим дизайном никак не связано (может, кроме этого случая). В большинстве случаев объекты в with - чужие и процедуры в них не добавить. Последний раз у меня такое возникало при чтении/записи ini-шек и при чтении/записи Stream"а.


 
Плохиш ©   (2008-02-24 00:41) [19]


> GrayFace   (23.02.08 21:17) [18]


> Такие ситуации возникают довольно часто и с плохим дизайном
> никак не связано

О, маразмом ещё и хвалятся...


 
Плохиш ©   (2008-02-24 00:43) [20]

Кстати, аФФтару, а объект-то создаёшь явно.


 
Германн ©   (2008-02-24 00:51) [21]


> Плохиш ©   (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:54) [22]


> Германн ©   (24.02.08 00:51) [21]

Честно, не понимаю почему бы не описать одну переменную типа TCommand или (подозреваю, что команд было несколько) типа общего предка?


 
Германн ©   (2008-02-24 01:07) [23]


> подозреваю, что команд было несколько

Несколько? Ну примерно от нескольких единиц до нескольких десятков в час :)
И так круглосуточно.

> Честно, не понимаю почему бы не описать одну переменную
> типа TCommand

Так ес-сно и сделал. Command : TCommand; Но ведь суть-то в том, что эта переменная сама по себе нужна только для того чтобы написать:
CommandList.Add(Command); И больше ни для чего.


 
Плохиш ©   (2008-02-24 01:27) [24]


> Германн ©   (24.02.08 01:07) [23]


> Но ведь суть-то в том, что эта переменная сама по себе нужна
> только для того чтобы написать:
> CommandList.Add(Command); И больше ни для чего.

Блин, представляю, мучения истерзанной души в том, что дя цикла for обязательно надо явно описывать переменную цикла, даже если она больше нигде не используется :-))


 
Плохиш ©   (2008-02-24 01:28) [25]


> Германн ©   (24.02.08 01:07) [23]
>
> > подозреваю, что команд было несколько
>
> Несколько? Ну примерно от нескольких единиц до нескольких
> десятков в час :)

Я имел в виду разные типы команд.


 
Германн ©   (2008-02-24 01:35) [26]


> Блин, представляю, мучения истерзанной души в том, что дя
> цикла for обязательно надо явно описывать переменную цикла,
>  даже если она больше нигде не используется :-))
>

Почему нигде? Я завсегда стараюсь использовать её как можно чаще в пределах процедуры/функции, где она описана. Ну а уж если в процедуре/функции кроме цикла больше ничего нет, тогда пользую repeat или while!
:-)


 
Германн ©   (2008-02-24 01:36) [27]


> Плохиш ©   (24.02.08 01:28) [25]
>
>
> > Германн ©   (24.02.08 01:07) [23]
> >
> > > подозреваю, что команд было несколько
> >
> > Несколько? Ну примерно от нескольких единиц до нескольких
> > десятков в час :)
>
> Я имел в виду разные типы команд.
>

Наверно понял, что ты имел в виду.


 
Германн ©   (2008-02-24 01:42) [28]

В дополнение к
> Германн ©   (24.02.08 01:35) [26]

В цикле for - это меня не задевает.
 1. Это всё-таки относится к стандартам Паскаля. Т.е. к временам Царя Гороха.
 2. А кто сказал что переменная цикла необязательная? Я должен внутри цикла иметь возможность использовать её значение! Ну а вводить две разные конструкции for - это перебор явный.


 
Германн ©   (2008-02-24 02:25) [29]


> Anatoly Podgoretsky ©   (23.02.08 11:34) [14]
>
>
> > и можно было бы не думать о лишней переменной в стеке.
>
>
> И ты тоже где нашел лишнюю.
>

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


 
Семеныч   (2008-02-24 08:40) [30]

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


 
Leonid Troyanovsky ©   (2008-02-24 09:24) [31]


> GrayFace   (23.02.08 21:17) [18]

> Такие ситуации возникают довольно часто и с плохим дизайном
> никак не связано (может, кроме этого случая). В большинстве
> случаев объекты в with - чужие и процедуры в них не добавить.

Почему ж не добавить? Вот, пожалуйста (в обозначениях автора):

type
 tsomeform = class (TSmbElseForm)
 public
    procedure SomeMethod;
 end;

procedure tsomeform.SomeMethod;
begin
  SomeProcedure(Self);
end;

И ничего использованию with не мешает.

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2008-02-24 13:12) [32]


> тогда я сильно удивился - а за каким?

А только бы не работать.


 
{RASkov} ©   (2008-02-24 13:23) [33]

> [32] Anatoly Podgoretsky ©   (24.02.08 13:12)
> А только бы не работать.

А "умные" они всегда ленивые :)


 
Loginov Dmitry ©   (2008-02-24 19:47) [34]

> Не нужно ради пары экзотических случаев вводить некое слово.
> И, во-ще-то, кроме эстетства тут попахивает bad design


Естесвенно, никакого слова вводить в спецификацию языка не нужно. Но подобные ситуации действительно возникают часто и отнюдь они не экзотически, и попахивать здесь ничем не может.


 
Leonid Troyanovsky ©   (2008-02-24 20:04) [35]


> Loginov Dmitry ©   (24.02.08 19:47) [34]

> и отнюдь они не экзотически, и попахивать здесь ничем не
> может.

Согласен, просто - bad design.

--
Regards, LVT.


 
Loginov Dmitry ©   (2008-02-24 20:17) [36]

> Согласен, просто - bad design.


Вот пример (причем достаточно популярный):


var
 List: TStringList;
begin
 List := TStringList.Create;
 try
   DataBase.GetTableList(List);
   if List.IndexOf("MyTable") < 0 then
     raise Exception.Create("Can not find table "MyTable"");
 finally
   List.Free;
 end;
end;


Видно, что ради простейшей проверки приходится объявлять переменную. WITH тут не катит. Это что, bad design?


 
Leonid Troyanovsky ©   (2008-02-24 20:23) [37]


> Loginov Dmitry ©   (24.02.08 20:17) [36]

> Видно, что ради простейшей проверки приходится объявлять
> переменную. WITH тут не катит. Это что, bad design?

То, что это BD - очевидно.

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

Кто ж виноват?

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

--
Regards, LVT.


 
Virgo_Style ©   (2008-02-25 00:04) [38]

var
SomeStringList:TStringList;
SomeForm:TForm;

with  SomeStringList, SomeForm do begin
// чему тут равно current?
end;


 
Anatoly Podgoretsky ©   (2008-02-25 00:11) [39]

> Virgo_Style  (25.02.2008 00:04:38)  [38]

Контексту, а если контекст одинаковый, то SomeForm


 
Германн ©   (2008-02-25 01:35) [40]


> Leonid Troyanovsky ©   (24.02.08 20:23) [37]
>
>
> > Loginov Dmitry ©   (24.02.08 20:17) [36]
>
> > Видно, что ради простейшей проверки приходится объявлять
> > переменную. WITH тут не катит. Это что, bad design?
>
> То, что это BD - очевидно.
>
> Некто объявляет класс, планируя использовать его в конструкции
> with. Однако, выясняется, что класс к этому не приспособлен.
>
>

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



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

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

Наверх





Память: 0.55 MB
Время: 0.007 c
15-1202698088
Dmitry S
2008-02-11 05:48
2008.03.23
Вопрос про ООП


2-1204013996
kiberg
2008-02-26 11:19
2008.03.23
свойство в виде массива


2-1204008466
boba
2008-02-26 09:47
2008.03.23
TCriticalSection


15-1202683406
Германн
2008-02-11 01:43
2008.03.23
Ещё один пример нестандартного мЫшления некоторых "кодеров"


15-1202565066
vrem_
2008-02-09 16:51
2008.03.23
Фото участников форума, самые новые





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