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

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

Как передать неявно созданный объект в процедуру? [D5, WinXP]


Страницы:   1 2 3

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-25 03:15:00) [1]


> Leonid Troyanovsky ©   (24.02.08 20:23) [37]

Кстати о бритве!
:)


Германн   (2008-02-25 02:57:00) [2]


> IMHO не стоит привязываться к with в подобных случаях, и
> писать with в сложных случаях, а вместо этого таки объявить
> переменную в var.
>

Это не наш путь.
В "сложных случаях" with очень вреден. А почему и что есть "сложные случаи"?
А и приходится "объявлять переменную в var".


Германн   (2008-02-25 02:36:00) [3]


> Германн ©   (25.02.08 01:35) [40]
>
>

Поясню свою мысль
На этапе компиляции компилятор умеет обращаться к относительному адресу вновь созданного объекта. Так кто же запрещает использовать сей относительный адрес?
Почему для "дважды-два" нужно использовать "экспоненту от логарифма"?


guav   (2008-02-25 02:29:00) [4]

> [8] Плохиш ©   (23.02.08 02:19)

Согласен. Более того экономия тоже неочевидна. Компилятор может выделить паять для неявой with переменной на стеке, может поместить в регистр локальныю var-переменную.

Думаю в with привлекает больше не само "присоединение класса к пространству имён", а возможность создать-и-инициализировать переменную в месте где она нужна, С++ way, в обход обычного синтаксиса паскаля (вот в C++ и C# with нет и ни разу он там не нужен). При этом неявность переменной приносит неудобства - нельзя использовать её как хочет автор темы, и создаётся путаница между членами класса в with и не членами класса в with. IMHO не стоит привязываться к with в подобных случаях, и писать with в сложных случаях, а вместо этого таки объявить переменную в var.


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


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

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


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

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

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


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

var
SomeStringList:TStringList;
SomeForm:TForm;

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


Leonid Troyanovsky   (2008-02-24 20:23:00) [8]


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

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

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

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

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

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

--
Regards, LVT.


Loginov Dmitry   (2008-02-24 20:17:00) [9]

> Согласен, просто - 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:04:00) [10]


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

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

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

--
Regards, LVT.


Loginov Dmitry   (2008-02-24 19:47:00) [11]

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


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


{RASkov}   (2008-02-24 13:23:00) [12]

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

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


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


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

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


Leonid Troyanovsky   (2008-02-24 09:24:00) [14]


> 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.


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

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


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


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

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


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

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

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


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


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

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


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


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

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


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


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

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


Страницы:   1 2 3

Наверх

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