Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

with tMyObject.Create do begin

27 views
Skip to first unread message

Serikoff

unread,
Mar 19, 2002, 8:15:59 AM3/19/02
to

Может несколько повторюсь. Извините.

with tMyObject.Create do begin
Func({ тут вставить экземпляр только-что созданого объекта })
end;

Прототип функции выглядит так:

function Func(Object: tMyObject);

Можно ли сделать подобное?

--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Andrew V. Fionik

unread,
Mar 19, 2002, 8:24:15 AM3/19/02
to
Serikoff wrote:
> Может несколько повторюсь. Извините.
>
> with tMyObject.Create do begin
> Func({ тут вставить экземпляр только-что созданого объекта })
> end;
>
> Прототип функции выглядит так:
>
> function Func(Object: tMyObject);
>
> Можно ли сделать подобное?

Насчет можно или нет не знаю, но мне вот интересно что ты будешь делать
когда внутри Func поднимается exception?

Serikoff

unread,
Mar 19, 2002, 8:49:04 AM3/19/02
to

> Насчет можно или нет не знаю, но мне вот интересно что ты будешь делать
> когда внутри Func поднимается exception?

with tMyObject.Create do begin
try


Func({ тут вставить экземпляр только-что созданого объекта })

finally
Free;
end
end;

Так лучше?

Ivan Klimov

unread,
Mar 19, 2002, 9:34:29 AM3/19/02
to
Приветствую, Serikoff!
Tue, 19 Mar 2002 13:15:59 +0000 (UTC) you wrote:


S> Может несколько повторюсь. Извините.

S> with tMyObject.Create do begin
S> Func({ тут вставить экземпляр только-что созданого объекта
S> })
S> end;

S> Прототип функции выглядит так:

S> function Func(Object: tMyObject);

S> Можно ли сделать подобное?

А почему не Funct(tMyObject.Create)?

Успехов!

Иван Климов, ivkl...@mail.ru


Ivan Klimov

unread,
Mar 19, 2002, 9:42:42 AM3/19/02
to
Приветствую, Serikoff!

Tue, 19 Mar 2002 13:49:04 +0000 (UTC) you wrote to Andrew V. Fionik:


>> Насчет можно или нет не знаю, но мне вот интересно что ты будешь
>> делать когда внутри Func поднимается exception?

S> with tMyObject.Create do begin try
S> Func({ тут вставить экземпляр только-что созданого объекта
S> })
S> finally
S> Free;
S> end end;

S> Так лучше?

Это неправильно. Нужно делать try..finally внутри функции.
Помотри хелп: finally _обязательно_ отрабатывает до выхода
из функции, даже если где сделаешь в блоке try..finally вызов
Exit. А посему, в Funct(AAA: tMyObject) нужно ИМХО написать:

Funct(AAA: tMyObject)
// var и прочее...
begin
try
{...}
finally
AAA.Free;
end
end;

Успехов!

Иван Климов, ivkl...@mail.ru


Serikoff

unread,
Mar 19, 2002, 10:11:34 AM3/19/02
to

> >> Насчет можно или нет не знаю, но мне вот интересно что ты будешь
> >> делать когда внутри Func поднимается exception?
>
> S> with tMyObject.Create do begin try
> S> Func({ тут вставить экземпляр только-что созданого объекта
> S> })
> S> finally
> S> Free;
> S> end end;
>
> S> Так лучше?
>
> Это неправильно. Нужно делать try..finally внутри функции.
> Помотри хелп: finally _обязательно_ отрабатывает до выхода
> из функции, даже если где сделаешь в блоке try..finally вызов
> Exit. А посему, в Funct(AAA: tMyObject) нужно ИМХО написать:
> Funct(AAA: tMyObject)
> // var и прочее...
> begin
> try
> {...}

а вот тут я вызываю еще одну функцию - которая генерит исключение...
И что дальше??

> finally
> AAA.Free;
> end
> end;

Ivan Klimov

unread,
Mar 19, 2002, 10:28:01 AM3/19/02
to
Приветствую, Serikoff!

Tue, 19 Mar 2002 15:13:38 +0000 (UTC) you wrote to Ivan Klimov:


S>>> Прототип функции выглядит так:

S>>> function Func(Object: tMyObject);

S>>> Можно ли сделать подобное?

>> А почему не Funct(tMyObject.Create)?


S> Потому что описан был _прототип_.

Разве не понятно, что я описал вызов???

Успехов!

Иван Климов, ivkl...@mail.ru


Ivan Klimov

unread,
Mar 19, 2002, 10:30:04 AM3/19/02
to
Приветствую, Serikoff!

Tue, 19 Mar 2002 15:11:34 +0000 (UTC) you wrote to Ivan Klimov:


>>>> Насчет можно или нет не знаю, но мне вот интересно что ты
>>>> будешь делать когда внутри Func поднимается exception?

S>>> with tMyObject.Create do begin try
S>>> Func({ тут вставить экземпляр только-что созданого

S>>> объекта })


S>>> finally
S>>> Free;
S>>> end end;

S>>> Так лучше?

>> Это неправильно. Нужно делать try..finally внутри функции.
>> Помотри хелп: finally _обязательно_ отрабатывает до выхода из
>> функции, даже если где сделаешь в блоке try..finally вызов
>> Exit. А посему, в Funct(AAA: tMyObject) нужно ИМХО написать:
>> Funct(AAA: tMyObject)
>> // var и прочее...
>> begin try {...}

S> а вот тут я вызываю еще одну функцию - которая генерит
S> исключение...
S> И что дальше??

Дальше - то, что написано ниже:

Serikoff

unread,
Mar 19, 2002, 10:54:49 AM3/19/02
to

> >> Это неправильно. Нужно делать try..finally внутри функции.
> >> Помотри хелп: finally _обязательно_ отрабатывает до выхода из
> >> функции, даже если где сделаешь в блоке try..finally вызов
> >> Exit. А посему, в Funct(AAA: tMyObject) нужно ИМХО написать:
> >> Funct(AAA: tMyObject)
> >> // var и прочее...
> >> begin try {...}
>
> S> а вот тут я вызываю еще одну функцию - которая генерит
> S> исключение...
> S> И что дальше??
>
> Дальше - то, что написано ниже:
>
> >> finally
> >> AAA.Free;
> >> end end;

1. А теперь объясни мне - должен-ли я вызывать обработку try .. except
в теле функции вызванной мной (ту - что генерит исключение) ?
2. Знаешь -ли ты ответ на первый вопрос, поставленный мной в начале трэда?

Alexander Gossen

unread,
Mar 19, 2002, 9:57:29 PM3/19/02
to
"Ivan Klimov" wrote...

> S> with tMyObject.Create do begin try

> S> Func()


> S> finally
> S> Free;
> S> end end;
>
> S> Так лучше?
>
> Это неправильно. Нужно делать try..finally внутри функции.

Зачем? Потому что try..finally это круто?

> Помотри хелп: finally _обязательно_ отрабатывает до выхода

ну и?

> из функции, даже если где сделаешь в блоке try..finally вызов
> Exit. А посему, в Funct(AAA: tMyObject) нужно ИМХО написать:

а вот это как раз неправильно: только вызывающая программа может знать,
нужен ей объект далее или нет. И вообще - где создал, там и освобождай.

> Funct(AAA: tMyObject)
> // var и прочее...
> begin
> try
> {...}
> finally
> AAA.Free;
> end
> end;

--
Regards, Alex


Alexander Gossen

unread,
Mar 19, 2002, 10:16:17 PM3/19/02
to
"Serikoff" wrote...

> Может несколько повторюсь. Извините.

ты, главное, пости свои творения куда-нибудь в одно место

> with tMyObject.Create do begin
> Func({ тут вставить экземпляр только-что созданого объекта })
> end;
>
> Прототип функции выглядит так:
>
> function Func(Object: tMyObject);
>
> Можно ли сделать подобное?

без локальной переменной нельзя. with позволяет обойтись без локальной
переменной, если она не нужна, а если нужна, то увольте.

--
Regards, Alex


Leonid Troyanovsky

unread,
Mar 20, 2002, 1:37:56 AM3/20/02
to
Приветствую, Serikoff.

Tue Mar 19 2002 16:15, Serikoff wrote to All:

> with tMyObject.Create do begin
> Func({ тут вставить экземпляр только-что созданого объекта })
> end;

> Прототип функции выглядит так:

> function Func(Object: tMyObject);

В принципе, такие вещи, IMHO, нагляднее с переменной.
Если она будет типа TObject, то ее можно использовать повторно.

Hу, и можно получить ссылку на объект из его виртуального метода:

type
TObjectMethod = procedure of object;

function GetInstanceFromMethod(proc: TObjectMethod): TObject;
begin
Result := TMethod(proc).Data;
end;

Т.е.

with tMyObject.Create do
try
Func(TMyObject(GetInstanceFromMethod(Free)));
..
finally
Free;
end;

С уважением, LVT

Ivan Klimov

unread,
Mar 20, 2002, 1:58:40 AM3/20/02
to
Приветствую, Alexander!
Wed, 20 Mar 2002 02:57:29 +0000 (UTC) you wrote to Ivan Klimov:

AG> "Ivan Klimov" wrote...

AG> а вот это как раз неправильно: только вызывающая программа может
AG> знать, нужен ей объект далее или нет. И вообще - где создал, там
AG> и освобождай.

Справедливое замечание :)
Если ты уже заметил, то я предлагал создавать объект _в вызове функции_
Тогда где мне его освобождать? И вообще, все это мне не нравится Ж-)

Serikoff, да сделай ты локальную переменную для создаваемого объекта!!!

Успехов!

Иван Климов, ivkl...@mail.ru


Ivan Klimov

unread,
Mar 20, 2002, 2:04:47 AM3/20/02
to
Приветствую, Serikoff!

Tue, 19 Mar 2002 15:54:49 +0000 (UTC) you wrote to Ivan Klimov:

>>>> Это неправильно. Нужно делать try..finally внутри функции.
>>>> Помотри хелп: finally _обязательно_ отрабатывает до выхода из
>>>> функции, даже если где сделаешь в блоке try..finally вызов
>>>> Exit. А посему, в Funct(AAA: tMyObject) нужно ИМХО написать:
>>>> Funct(AAA: tMyObject)
>>>> // var и прочее...
>>>> begin try {...}

S>>> а вот тут я вызываю еще одну функцию - которая генерит
S>>> исключение...
S>>> И что дальше??

>> Дальше - то, что написано ниже:

>>>> finally
>>>> AAA.Free;
>>>> end end;

S> 1. А теперь объясни мне - должен-ли я вызывать обработку try ..
S> except в теле функции вызванной мной (ту - что генерит исключение)?

Это - не важно. Я же советовал Ф1 почитать :(

S> 2. Знаешь -ли ты ответ на первый вопрос, поставленный мной в
S> начале трэда?

Извини, но твой вопрос был:
-- цитирую --
Можно ли сделать подобное?
-- конец цитаты --
Вот я и другие понимаем подобие по-своему. Если бы ты поставил задачу
более ясно, получил бы более приемлемый ответ.

Успехов!

Иван Климов, ivkl...@mail.ru


Serikoff

unread,
Mar 20, 2002, 7:51:40 AM3/20/02
to

> Извини, но твой вопрос был:
> -- цитирую --
> Можно ли сделать подобное?
> -- конец цитаты --

Ivan, читай весь вопрос, а не последнее предложение, содержаще "?" в конце.

Досвиданья!

Alexander Gossen

unread,
Mar 20, 2002, 7:54:09 AM3/20/02
to
"Ivan Klimov" wrote...

> Если ты уже заметил, то я предлагал создавать объект _в вызове функции_
> Тогда где мне его освобождать? И вообще, все это мне не нравится Ж-)

Освобождать - там где он перестал быть нужен, как ни странно :)) Пример:

MyStringList.AddObject('my string', TMyObject.Create)
...........
for ....
MyStringList.Objects[i].Free;
MyStringList.Free;

Если уж тебе нужен "одноразовый" объект, так и создай его в функции, это же
логично

function ServerName(const URL: string): string;
begin
with TIdURI.Create(URL) do
try
if Protocol = '' then
Result := Host
else
Result := Protocol +'://'+ Host;
finally
Free;
end;
end;

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

С учетом последнего, твой вариант не имеет практического смысла, аргумент
там просто не нужен, а вызывать ее только и можно как

Func(Txxx.Create),

т.к. переданной ей переменной все равно пользоваться дальше нельзя.

--
Regards, Alex


Serikoff

unread,
Mar 20, 2002, 8:09:51 AM3/20/02
to

> В принципе, такие вещи, IMHO, нагляднее с переменной.
> Если она будет типа TObject, то ее можно использовать повторно.

Дело в том, что я надеялся, что есть переменная - некий аналог Self, но
обозначающая указатель на "анонимный" объект, созданный внутри конструкции
with.
С ним, бы все выглядело логично, imho:

with tMO.Create do
func(LocalSelf)
end;

?

Но раз его нет - тогда нет.

>
> Hу, и можно получить ссылку на объект из его виртуального метода:
>
> type
> TObjectMethod = procedure of object;
>
> function GetInstanceFromMethod(proc: TObjectMethod): TObject;
> begin
> Result := TMethod(proc).Data;
> end;
>
> Т.е.
>
> with tMyObject.Create do
> try
> Func(TMyObject(GetInstanceFromMethod(Free)));
> ..
> finally
> Free;
> end;

Спасибо за ответ.

Leonid Troyanovsky

unread,
Mar 21, 2002, 8:29:08 AM3/21/02
to
Приветствую, Serikoff.

Wed Mar 20 2002 16:09, Serikoff wrote to Leonid Troyanovsky:

LT> В принципе, такие вещи, IMHO, нагляднее с переменной.
LT> Если она будет типа TObject, то ее можно использовать повторно.

> Дело в том, что я надеялся, что есть переменная - некий аналог Self, но
> обозначающая указатель на "анонимный" объект, созданный внутри конструкции

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

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

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

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

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

С уважением, LVT

Serikoff

unread,
Mar 21, 2002, 10:37:45 AM3/21/02
to

> В этой ситуации Борланд логично посчитал, что это избыточная информация
> т.к. такое поле будет у всех потомков, а получить нужную ссылку не так
> уж сложно.
>
> Каноническое решение задачи предложил Андрей Лобанов: для объектов,
> нуждающихся в самопознании, создается потомок, которому добавляется
> функция This:
>
> type
> TSomeObjectRef = class (TSomeObject)
> public
> function This: TSomeObjectRef;
> end;
>
> function TSomeObjectRef.This: TSomeObjectRef;
> begin
> Result := Self;
> end;
>
> Учитывая то, что объекты предполагается создавать динамически,
> предварительное описание требуемого потомка выглядит ненапряжно.

А еще лучше решил-бы борланд ввести сей код в код tObject. Тогда
не нужно было-бы создавать наследников ни от каких объектов. imho

Serikoff

unread,
Mar 21, 2002, 10:48:00 AM3/21/02
to

Извиняюсь. Невнимательно читал.

Timur Shemsedinov

unread,
Mar 22, 2002, 2:56:41 PM3/22/02
to
|||| | | | | | | | | ti...@niist.ntu-kpi.kiev.ua | | | | | | | | ||||

S> А еще лучше решил-бы борланд ввести сей код в код tObject. Тогда
S> не нужно было-бы создавать наследников ни от каких объектов. imho
Я навеpно пpопустил начало pазговоpа, но из поскипанного кода не ясно зачем
нужен This, что он позволяет делать, ну напpимеp?

... Team[Tim] Team[Broken ] Team[XNP] Team[IETF] Team[Одуванчики со стажем]

Andrey Repin

unread,
Mar 23, 2002, 11:38:20 AM3/23/02
to
Отписал Serikoff к All пpо with tMyObject.Create do begin

S> Может несколько повтоpюсь. Извините.

S> with tMyObject.Create do begin

S> Func({ тyт вставить экземпляp только-что созданого объекта })
S> end;

А
Func(Self);
не pаботает? Или я не понял вопpоса? (а пpочтя обсyждение - таки не понял....)


/Daemon/ aka /ANR Daemon/ aka /sirAndrey/ в миpy /*Андpей Репин/*
... Что-то надоел он мне... NP что ли сюда вставить?

Anatoly Podgoretsky

unread,
Mar 24, 2002, 1:53:23 AM3/24/02
to
Hi, Andrey Repin!

You wrote to Serikoff on Sat, 23 Mar 2002 19:38:20 +0300:

S>> with tMyObject.Create do begin
S>> Func({ тyт вставить экземпляp только-что созданого объекта })
S>> end;

AR> Func(Self);
AR> не pаботает? Или я не понял вопpоса? (а пpочтя обсyждение - таки не
AR> понял....)

Не понял, ему нужно вставить не Self, а анонимный указатель объекта
созданный с помощью tMyObject.Create, явную переменную видимо использовать
не хочет.

С уважением
Анатолий Подгорецкий
http://www.podgoretsky.com

Andrew V. Fionik

unread,
Mar 26, 2002, 12:31:29 AM3/26/02
to
AR> А
AR> Func(Self);
AR> не pаботает? Или я не понял вопpоса? (а пpочтя обсyждение - таки не
AR> понял....)

А тут возникает путаница если вызывается внутри метода другого объекта. Чей
Self будет? Понятное дело что взять да посмотреть как эту конструкцию
компилятор обрабатывает. Hо, IMHO, лучше не доводить до этого.


Leonid Troyanovsky

unread,
Mar 26, 2002, 1:26:31 AM3/26/02
to
Приветствую, Andrew.

Tue Mar 26 2002 08:31, Andrew V. Fionik wrote to Andrey Repin:

AR> Func(Self);
AR> не pаботает? Или я не понял вопpоса? (а пpочтя обсyждение - таки не

> А тут возникает путаница если вызывается внутри метода другого объекта.


> Чей Self будет? Понятное дело что взять да посмотреть как эту
> конструкцию компилятор обрабатывает. Hо, IMHO, лучше не доводить до

Такого рода путаницы быть не должно, т.к. Self определен только в
контексте метода объекта. Поэтому для самопознания (которое
происходит в контексте метода другого объекта) и нужен This.

С уважением, LVT

0 new messages