![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
оператор With [D6]
wild_arg © (2004-10-26 10:50:00)Как внутри оператора with получить ссылку на сам объект, по которому строим оператор?
Пример:
with TMyObject.Create do begin
...
MyProc({здесь, типа, надо передать ссылку на созданный объект})
...
end;
SergP (2004-10-27 09:06:00) [1]
> [14] КаПиБаРа © (27.10.04 05:52)
> SergP © (26.10.04 14:39) [11]
> Предложеные примеры были куда сложнее чем если бы
>
> Что сложного в КаПиБаРа © (26.10.04 13:11) [10]? Или такого
> примера не предлагали?
Вроде бы не предлагали... хотя дело не в этом.
Дело в том что я не говорил что что-то сложно,
я говорил что что-то одно сложнеечем другое.
Т.е. речь шла не об абсолютной сложности а об относительной.
пример приведенный Вами простой, там действительно ничего сложного нет :-)
но он сложнее чем если использовать дополнительную переменную, хотя бы по кол-ву строк кода.
SergP (2004-10-27 09:00:00) [2]
> [14] КаПиБаРа © (27.10.04 05:52)
> SergP © (26.10.04 14:39) [11]
> Предложеные примеры были куда сложнее чем если бы
>
> Что сложного в КаПиБаРа © (26.10.04 13:11) [10]? Или такого
> примера не предлагали?
Вроде бы не предлагали... хотя дело не в этом.
Дело в том что я не говорил что что-то сложно,
я говорил что что-то одно сложнеечем другое.
Т.е. речь шла не об абсолютной сложности а об относительной.
пример приведенный Вами простой, там действительно ничего сложного нет :-)
но он сложнее чем если использовать дополнительную переменную, хотя бы по кол-ву строк кода.
КаПиБаРа (2004-10-27 08:16:00) [3]Ученик (27.10.04 8:15) [16]
Похоже одни книжки читаем :)
Ученик (2004-10-27 08:15:00) [4]Сорри :-) КаПиБаРа © (26.10.04 13:11) [10]
Ученик (2004-10-27 08:13:00) [5]type
TClassTypeMethod = function: TClass of object;
function GetSelf(aClassType: TClassTypeMethod): Pointer;
begin
Result := TMethod(aClassType).Data
end;
with TMyObject.Create do begin
...
MyProc(GetSelf(ClassType));
...
end;
КаПиБаРа (2004-10-27 05:52:00) [6]SergP © (26.10.04 14:39) [11]
Предложеные примеры были куда сложнее чем если бы
Что сложного в КаПиБаРа © (26.10.04 13:11) [10]? Или такого примера не предлагали?
Германн (2004-10-27 04:10:00) [7]2 Alekc (27.10.04 00:19) [12]
Имхо, тут главное "Время жизни" ссылки и "Область видимости ссылки".
Alekc (2004-10-27 00:19:00) [8]
with TMyObject.Create do begin
...
MyProc(TMyObject(TMethod({@}Create).Data));
// Насчёт @ не уверен....
...
end;
SergP (2004-10-26 14:39:00) [9]
> [2] Плохиш © (26.10.04 10:54)
> Примерно весной это здесь уже обсуждалось :-)
> Может быть кто-нибуть это для тебя и поищет.
Ага... Я тогда спрашивал...
Но у меня была ситуация где в with был довольно большой код, и только в одном месте как назло требовалась ссылка (указатель) на сам объект...
Просто хотелось "красиво" написать код
Предложеные примеры были куда сложнее чем если бы я сделал все с дополнительной переменной.
Вобщем я тогда решил не мучаться и добавил переменную....
КаПиБаРа (2004-10-26 13:11:00) [10]type
TProc = procedure of object;
function GetSelf(Proc: TProc): TObject;
begin
Result := TObject(TMethod(proc).Data);
end;
with TMyObject.Create do begin
...
MyProc(GetSelf(Free))
...
end;
Digitman (2004-10-26 12:32:00) [11]
> wild_arg (26.10.04 10:59) [4]
тебе Плохиш © (26.10.04 10:57) [3] верно говорит - есть и иное решение - удаление гланд через причинное место ..
желаешь испытать ? объяви в своем классе TMyObject что-то вроде публ.метода GetInstance и реализуй его примерно так :
function TMyObject.GetInstance: TMyObject;
begin
Result := Self;
end;
тогда "хирургическая операция" сможет выглядеть тем самым образом, который ты столь жаждешь:
with TMyObject.Create do begin
...
MyProc(GetInstance)
...
end;
вопросы тебе "на засыпку" к рассуждениям во время викенда :
- чем тебе это грозит ?
- стоит ли "овчинка выделки" ?
ssk (2004-10-26 12:19:00) [12]... и констант!
Gero (2004-10-26 11:09:00) [13]Даешь написание программ без переменных!
Плохиш (2004-10-26 11:02:00) [14]
> wild_arg (26.10.04 10:59) [4]
> блин
> заводить дополнительную переменную.... оцтой!
Да! А во всех ошибках Билл Гейтц виноват
Johnmen (2004-10-26 11:01:00) [15]Да весь программинг - полный оцтой.
wild_arg (2004-10-26 10:59:00) [16]блин
заводить дополнительную переменную.... оцтой!
:)
Плохиш (2004-10-26 10:57:00) [17]
> Digitman © (26.10.04 10:54) [1]
В том обсуждении был пример удаления гланд не через рот ;-) Люди же лёгких путей не ищут :-)
Digitman (2004-10-26 10:54:00) [18]никак.
решение обычное :
MyObject := TMyObject.Create;
with MyObject do begin
...
MyProc(MyObject);
...
end;
Плохиш (2004-10-26 10:54:00) [19]Примерно весной это здесь уже обсуждалось :-)
Может быть кто-нибуть это для тебя и поищет.