![]() |
| ||
|
|
Новости |
Поиск |
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-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]
>
> > подозреваю, что команд было несколько
>
> Несколько? Ну примерно от нескольких единиц до нескольких
> десятков в час :)
Я имел в виду разные типы команд.