with tMyObject.Create do begin
Func({ тут вставить экземпляр только-что созданого объекта })
end;
Прототип функции выглядит так:
function Func(Object: tMyObject);
Можно ли сделать подобное?
--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
Насчет можно или нет не знаю, но мне вот интересно что ты будешь делать
когда внутри Func поднимается exception?
with tMyObject.Create do begin
try
Func({ тут вставить экземпляр только-что созданого объекта })
finally
Free;
end
end;
Так лучше?
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
>> Насчет можно или нет не знаю, но мне вот интересно что ты будешь
>> делать когда внутри 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
а вот тут я вызываю еще одну функцию - которая генерит исключение...
И что дальше??
> finally
> AAA.Free;
> end
> end;
S>>> Прототип функции выглядит так:
S>>> function Func(Object: tMyObject);
S>>> Можно ли сделать подобное?
>> А почему не Funct(tMyObject.Create)?
S> Потому что описан был _прототип_.
Разве не понятно, что я описал вызов???
Успехов!
Иван Климов, ivkl...@mail.ru
>>>> Насчет можно или нет не знаю, но мне вот интересно что ты
>>>> будешь делать когда внутри 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> И что дальше??
Дальше - то, что написано ниже:
> >> Это неправильно. Нужно делать 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. Знаешь -ли ты ответ на первый вопрос, поставленный мной в начале трэда?
> 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
> Может несколько повторюсь. Извините.
ты, главное, пости свои творения куда-нибудь в одно место
> with tMyObject.Create do begin
> Func({ тут вставить экземпляр только-что созданого объекта })
> end;
>
> Прототип функции выглядит так:
>
> function Func(Object: tMyObject);
>
> Можно ли сделать подобное?
без локальной переменной нельзя. with позволяет обойтись без локальной
переменной, если она не нужна, а если нужна, то увольте.
--
Regards, Alex
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
AG> "Ivan Klimov" wrote...
AG> а вот это как раз неправильно: только вызывающая программа может
AG> знать, нужен ей объект далее или нет. И вообще - где создал, там
AG> и освобождай.
Справедливое замечание :)
Если ты уже заметил, то я предлагал создавать объект _в вызове функции_
Тогда где мне его освобождать? И вообще, все это мне не нравится Ж-)
Serikoff, да сделай ты локальную переменную для создаваемого объекта!!!
Успехов!
Иван Климов, ivkl...@mail.ru
>>>> Это неправильно. Нужно делать 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
Ivan, читай весь вопрос, а не последнее предложение, содержаще "?" в конце.
Досвиданья!
> Если ты уже заметил, то я предлагал создавать объект _в вызове функции_
> Тогда где мне его освобождать? И вообще, все это мне не нравится Ж-)
Освобождать - там где он перестал быть нужен, как ни странно :)) Пример:
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
Дело в том, что я надеялся, что есть переменная - некий аналог 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;
Спасибо за ответ.
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
А еще лучше решил-бы борланд ввести сей код в код tObject. Тогда
не нужно было-бы создавать наследников ни от каких объектов. imho
S> А еще лучше решил-бы борланд ввести сей код в код tObject. Тогда
S> не нужно было-бы создавать наследников ни от каких объектов. imho
Я навеpно пpопустил начало pазговоpа, но из поскипанного кода не ясно зачем
нужен This, что он позволяет делать, ну напpимеp?
... Team[Tim] Team[Broken ] Team[XNP] Team[IETF] Team[Одуванчики со стажем]
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 что ли сюда вставить?
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
А тут возникает путаница если вызывается внутри метода другого объекта. Чей
Self будет? Понятное дело что взять да посмотреть как эту конструкцию
компилятор обрабатывает. Hо, IMHO, лучше не доводить до этого.
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