Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

а ля Self внутри with do   Найти похожие ветки 

 
тщгыук   (2012-05-12 20:12) [0]

А можно ли в конструкции
with TObject.Create do begin
end;

как-то сослаться на результат вызова TObject.Create


 
Германн ©   (2012-05-12 20:19) [1]

А зачем?


 
brother ©   (2012-05-12 20:21) [2]

вообще эта конструкция подразумевает в бегин енд - TObject.


 
MBo ©   (2012-05-12 20:47) [3]

Вообще-то " или крест снимите, или трусы наденьте"

Однако трюк существует:
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=831


 
Юрий Зотов ©   (2012-05-12 20:49) [4]

Когда-то встречал в Сети, где автор получал такую ссылку разными хитрыми манипуляциями. Почитать было интересно, но главного я так и не понял:

- зачем это надо, когда можно ввести обыкновенную переменную;

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


 
Dimka Maslov ©   (2012-05-12 21:19) [5]

Если очень хочется:
type
 TObjectX = class (TObject)
 public
   function GetSelf: TObject;
 end;

 function TObjectX.GetSelf: TObject;
 asm
 end;

 with TObjectX.Create do begin
   GetSelf;
 end;


 
Германн ©   (2012-05-12 21:25) [6]


> Юрий Зотов ©   (12.05.12 20:49) [4]
>
> - зачем это надо, когда можно ввести обыкновенную переменную;

 Ну например чтобы избавиться от лишней переменной. Создал объект и тут же поместил его в список. Переменная получается лишняя.


 
Dimka Maslov ©   (2012-05-12 21:51) [7]


> Создал объект и тут же поместил его в список


List.Add(TObject.Create)?


 
Германн ©   (2012-05-12 22:02) [8]


> Dimka Maslov ©   (12.05.12 21:51) [7]

Если точнее то:
with TMyObj(MyList.Items[MyList.Add(TMyObj.Create)]) do


 
Leonid Troyanovsky ©   (2012-05-13 07:29) [9]


> Dimka Maslov ©   (12.05.12 21:19) [5]

>    function GetSelf: TObject;

Если уж Self, то function GetSelf: TObjectX

http://groups.google.com/group/fido7.ru.delphi.chainik/msg/f18b9a7b2b464a60

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2012-05-13 07:38) [10]


> MBo ©   (12.05.12 20:47) [3]

> Однако трюк существует:

http://groups.google.com/group/fido7.ru.delphi.chainik/msg/30a14953b6ea41a3

--
Regards, LVT.


 
тщгыук   (2012-05-13 12:12) [11]

MBo © , Leonid Troyanovsky © , спасибо за интересные ссылки.

> Юрий Зотов ©   (12.05.12 20:49) [4]
> - зачем нужен код, объем которого наверняка больше размера
>   этой переменной и который еще и требует какого-то времени
>   на свое выполнение.
Это да.

А если через новые helper:
TTObjectHelper = class helper for TObject
public function Self_:TObject; inline;
end;

function TTObjectHelper.Self_:TObject;
begin
Result:=Self;
end;


Кстати, а почему при отладке поля внутри with не отображаются отладчиком?


 
Palladin ©   (2012-05-13 16:13) [12]

Потому что это не локальные переменные.


 
тщгыук   (2012-05-13 17:16) [13]

Возможно, но я о таком:
procedure Test;
var
D: record a,b,c,n: Cardinal; end;
begin
 with D do begin    // тут над D всплывает подсказка о ее содержимом
   a := 0;          // \
   b := 0;          //  а тут нет  // почему?
   c := a+b;        // /
 end;
 D.n := 0;          // тут над D.n тоже всплывает подсказка о ее значении
end;


 
Германн ©   (2012-05-13 17:23) [14]


> а тут нет  // почему?

Потому что потому. Прими как должное.


 
brother ©   (2012-05-13 18:01) [15]

> b := 0;          //  а тут нет  // почему?

а по твоему, это что?


 
тщгыук   (2012-05-13 18:42) [16]

Ну, присваивание, а если его куда-то в процедуру передавать,
а оно поле только что созданного (в with) объекта и зависит
от параметров создания. Вот хотелось значение и подсмотреть.

Но коль нет, так нет, - подождем ХеФрии


 
Inovet ©   (2012-05-13 18:46) [17]

> [16] тщгыук   (13.05.12 18:42)
> а если его куда-то в процедуру передавать

И что


 
Германн ©   (2012-05-13 19:25) [18]


> Вот хотелось значение и подсмотреть

Помимо всплывающей подсказки есть ещё два способа подсмотреть.


 
тщгыук   (2012-05-13 20:21) [19]


> Inovet ©   (13.05.12 18:46) [17]
> > а если его куда-то в процедуру передавать
> И что

Я подумал, что > brother ©   (13.05.12 18:01) [15] указывает на то, что после b := 0;  содержимое уже известно.

> Германн ©   (13.05.12 19:25) [18]
> Помимо всплывающей подсказки есть ещё два способа подсмотреть.

О, а как?


 
Германн ©   (2012-05-13 21:06) [20]


> О, а как?

1. Add Watch
2. Evaluate/Modify


 
тщгыук   (2012-05-13 22:22) [21]

Применительно к

type Tc = class
 fA : Real;
 fB : Real;
 constructor Create;
end;

constructor Tc.Create;
begin
 fA := Random;
end;

procedure TestC;
begin
 with Tc.Create do begin
   fB := fA;                 // Точка останова -> "Ctrl+F5", "Ctrl+F7" ->
                             // значение fA,fB в отладчике так увидеть и не получилось
   Free;
 end;
end;


> Германн ©   (13.05.12 17:23) [14]> Прими как должное.
Угу.

Благодарю мастеров за отклик!


 
Anatoly Podgoretsky ©   (2012-05-13 22:41) [22]


> Юрий Зотов ©   (12.05.12 20:49) [4]

Так проигрыша и нет, вероятно временная переменная заведена компилятором.



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.051 c
15-1327399943
Vulko
2012-01-24 14:12
2013.03.22
ищу complementary filter на java/c/c++/c#/delphi


15-1353245447
Artem
2012-11-18 17:30
2013.03.22
Простой парсинг


15-1333612123
Хаус
2012-04-05 11:48
2013.03.22
Нарисовать кнопку в XP-стиле


4-1261315823
GreyWolf
2009-12-20 16:30
2013.03.22
Установка Windows Caption Icons Size локально для приложения


15-1341788808
RGV
2012-07-09 03:06
2013.03.22
Драйвер.