Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

а ля 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.07 c
2-1328461488
Xmen
2012-02-05 21:04
2013.03.22
архивация открытого документа


2-1332928600
ermine13
2012-03-28 13:56
2013.03.22
архиватор


15-1312895393
Kerk
2011-08-09 17:09
2013.03.22
Шахматный турнир


2-1344332083
ramster
2012-08-07 13:34
2013.03.22
юникод DelphiXE


15-1345475256
DdiK
2012-08-20 19:07
2013.03.22
нужная программа мигая в трее забирает фокус





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский