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

Вниз

Пользуетесь ли вы absolute?   Найти похожие ветки 

 
Дмитрий СС   (2014-01-26 19:45) [0]

Например, чтобы обратиться к Result родительской функции?

function Foo: String;
var
 Ret: String absolute Result;
 
 function Bar:String;
 begin
   ...
   Ret := ...;
   ...
 end;

begin
...
end;

Или может еще для чего либо?


 
Юрий Зотов ©   (2014-01-26 20:00) [1]

Иногда бывает удобно. Но не так, как в примере.


 
Дмитрий СС   (2014-01-26 20:04) [2]


> Юрий Зотов ©   (26.01.14 20:00) [1]

А можно ваш пример?


 
RWolf ©   (2014-01-26 20:13) [3]

разобрать Cardinal или Int64 на поля, скажем.


 
Павиа   (2014-01-26 20:19) [4]

Не пользуюсь. Единственно для чего нужно это дря преобразования типа. Но предпочитаю делать это явно.


 
Юрий Зотов ©   (2014-01-26 20:22) [5]

> Дмитрий СС   (26.01.14 20:04) [2]

Например, когда одни и те же данные надо трактовать по-разному.

var
 Var1: TMyDataType1;
 Var2: TMyDataType2 absolute Var1;


 
antonn ©   (2014-01-26 20:27) [6]


> RWolf ©   (26.01.14 20:13) [3]
>
> разобрать Cardinal или Int64 на поля, скажем.

+1


 
DevilDevil ©   (2014-01-26 20:51) [7]

> Например, когда одни и те же данные надо трактовать по-разному.

+1


 
Дмитрий СС   (2014-01-27 04:05) [8]

А как вам такой вариант?

procedure Button1Click(Sender: TObject);
var
 Button: TButton absolute Sender;
begin
...
end;

?


 
Inovet ©   (2014-01-27 04:10) [9]

> [8] Дмитрий СС   (27.01.14 04:05)

И какой в этом смысл?


 
antonn ©   (2014-01-27 08:37) [10]

а если там будет не Tbutton?


 
DevilDevil ©   (2014-01-27 09:36) [11]

> Дмитрий СС   (27.01.14 04:05) [8]

правильно


 
sniknik ©   (2014-01-27 10:02) [12]

> И какой в этом смысл?
приведение типа не нужно каждый раз делать, если в обработке обращаешься к методам сендера, если это частое действие очень помогает. альтернатива with (им тоже можно убрать множественные приведения типа) более явная.

> а если там будет не Tbutton?
значит нужно что-то поменять... например
procedure НеБатон1Click(Sender: TObject);
var
 НеБатон: TНеБатон absolute Sender;
 НеНеБатон: TНеНеБатон absolute Sender;
begin
 if Sender is TНеБатон then begin
    НеБатон.xxxx
 end;

 if Sender is TНеНеБатон then begin
    НеНеБатон.yyyy
 end;
end;


 
clickmaker ©   (2014-01-27 10:07) [13]

> if Sender is TНеБатон then begin
>    НеБатон.xxxx
> end;

я бы не советовал такой код писать в рамках коллективной или open-source разработки.
для себя любимого, сойдет, конечно


 
Sha ©   (2014-01-27 10:10) [14]

Почти всегда применение директивы absolute не является абсолютно необходимым.
Ее побочным эффектом является размещение обеих переменным в памяти.
Вот этим и пользуюсь )


 
antonn ©   (2014-01-27 10:22) [15]


> значит нужно что-то поменять... например

ну, насколько я понял, в его коде был бы смысл в том, что не надо сначала переменную приводить, а пользоваться сразу Button. Впрочем по строчкам особого выигрыша нет :)

а вот когда нужно вытянуть word из 2-го + 3-го байта переменной dword - то удобно с абсолютом :)


 
DVM ©   (2014-01-27 10:25) [16]


> Например, когда одни и те же данные надо трактовать по-разному.

Или воспользоваться вариантными Record-ами


 
Sha ©   (2014-01-27 10:26) [17]

> antonn ©   (27.01.14 10:22) [15]
> а вот когда нужно вытянуть word из 2-го + 3

w:=i shr 8 and $FFFF;
или
w:=pWord(pAnsiChar(@i)+1)^;


 
sniknik ©   (2014-01-27 10:40) [18]

> а пользоваться сразу Button.
а если их несколько? батонов, а обработчик один.


 
Sha ©   (2014-01-27 11:00) [19]

sniknik ©   (27.01.14 10:40) [18]

общую часть обработчиков вынести в процедуру,
а различающиеся части - в отдельные обработчики


 
Inovet ©   (2014-01-27 11:02) [20]

> [12] sniknik ©   (27.01.14 10:02)
> приведение типа не нужно каждый раз делать, если в обработке
> обращаешься к методам сендера, если это частое действие
> очень помогает. альтернатива with (им тоже можно убрать
> множественные приведения типа) более явная.

И более чреватая косяками.


 
antonn ©   (2014-01-27 11:21) [21]


> Sha ©   (27.01.14 10:26) [17]

я вот даже не сомневался что вы напишите это даже не напрягаясь =) но речь же не об необходимости, а про удобство :) у меня девайс возвращает 6 байт, и по статусу их можно интерпретировать по-разному, удобно завести int64 и три record с absolute, и вытягивать нужные поля через них, к тому же даже наглядно в какой-то мере


> а если их несколько? батонов, а обработчик один.

там же абсолют к передаваемому параметру?..


 
Германн ©   (2014-01-27 11:28) [22]


> удобно завести int64 и три record с absolute

А почему не один вариантный record?


 
sniknik ©   (2014-01-27 11:34) [23]

> И более чреватая косяками.
ну, не знаю... я вот чаще с with "косяки" ловлю, особенно в вложенными друг в друга, а таких конструкций практически не встречаю... как знать, что было бы, если бы использовали равновероятно (было бы примерно равно и так и так)...


 
antonn ©   (2014-01-27 13:42) [24]


> А почему не один вариантный record?

у разных можно назвать поля более человечными именами, и там то byte+word+byte, то word+reserved byte+word

да и в графике вместо пикселя record на 4 байта, считывая dword из массива через абсолют имею, по сути, 4 переменных "в одном месте" рекорда, путаницы меньше, как мне кажется красивше код.


 
antonn ©   (2014-01-27 13:43) [25]


> А почему не один вариантный record?

аа, понял. как то не привык их использовать :)


 
Eraser ©   (2014-01-27 14:39) [26]


> Дмитрий СС   (26.01.14 19:45) 

как-то исторически сложилось, что использую исключительно в с связке с OVERLAPED структурой ) хотя, по хорошему, надо уходить от этих анахронизмов.


 
bems ©   (2014-01-27 20:55) [27]

пользуюсь в качестве приведения типа, когда приводить нужно много раз
да, по типу этого


> procedure НеБатон1Click(Sender: TObject);
> var
>  НеБатон: TНеБатон absolute Sender;
>  НеНеБатон: TНеНеБатон absolute Sender;
> begin
>  if Sender is TНеБатон then begin
>     НеБатон.xxxx
>  end;
>
>  if Sender is TНеНеБатон then begin
>     НеНеБатон.yyyy
>  end;
> end;


 
Palladin ©   (2014-01-27 21:52) [28]

не использую и другим не советую


 
Inovet ©   (2014-01-27 21:59) [29]

> [27] bems ©   (27.01.14 20:55)
> пользуюсь в качестве приведения типа, когда приводить нужно
> много раз да, по типу этого

Почему явно не привести с присвоением в отдельный указатель? Экономия 4 (8) байт на стеке?


 
DevilDevil ©   (2014-01-27 22:35) [30]

> Почему явно не привести с присвоением в отдельный указатель?
>  Экономия 4 (8) байт на стеке?


Может потому, что в обычных обработчиках удобство ценнее?


 
ё   (2014-01-27 23:23) [31]


> > И какой в этом смысл?приведение типа не нужно каждый раз
> делать, если в обработке обращаешься к методам сендера,
> если это частое действие очень помогает. альтернатива with
> (им тоже можно убрать множественные приведения типа) более
> явная.

хм, я давно уже на делфи не пишу, но разве
var
button : TButton;
...
button := Sender as Tbutton;
не ровно тоже самое делает?


 
DevilDevil ©   (2014-01-27 23:36) [32]

> ё   (27.01.14 23:23) [31]

нет
в приведённом тобой коде вызывает TObject.InheritsFrom()


 
ё   (2014-01-27 23:48) [33]


> в приведённом тобой коде вызывает TObject.InheritsFrom()

и?
развивай мысль


 
DevilDevil ©   (2014-01-28 00:49) [34]

obsolute не делает TObject.InheritsFrom()


 
Дмитрий Белькевич   (2014-01-28 01:24) [35]


procedure ParseFloat64(Stream: TStream; var Value: double; ByteOrder: TDICOMByteOrder);
var
Swapper: int64 absolute Value;
begin
Stream.Read(Value, 8);
if ByteOrder = boBIGENDIAN then
 Swapper := InverseByteOrder(Swapper);
end;



function InverseByteOrder(i: int64): int64;
asm
mov eax, dword ptr i[4]
mov edx, dword ptr i
bswap eax
bswap edx
end;


 
DevilDevil ©   (2014-01-28 01:53) [36]

> Дмитрий Белькевич   (28.01.14 01:24) [35]

передавай по указателю/ссылке - так быстрее :)


 
ё   (2014-01-28 02:52) [37]


> obsolute не делает TObject.InheritsFrom()

и?
ты что сказать то хотел?
это плохо?
ты странный человек


 
asail ©   (2014-01-28 03:28) [38]


> ё   (27.01.14 23:23) [31]

> button := Sender as Tbutton;
> не ровно тоже самое делает?

Тады уж скорее
button := Tbutton(Sender)


 
ё   (2014-01-28 03:49) [39]


> Тады уж скорее button := Tbutton(Sender)

неа
насколько помню, "as" может кинуть ексепшен
ваш вариант же в этом случае приведет к АВ


 
ё   (2014-01-28 04:11) [40]

соврал
точнее не знал
procedure TForm5.Button1Click(Sender: TObject);
begin
 Sender := nil;
 TButton(sender).Font.Color := clRed;
end;

procedure TForm5.Button2Click(Sender: TObject);
var
b : TButton;
begin
 Sender := nil;
 b := Sender as TButton;
 b.Font.Color := clRed;
end;
одинаково ведут



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

Форум: "Прочее";
Текущий архив: 2014.09.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.003 c
2-1381930351
[ВладОшин]
2013-10-16 17:32
2014.09.14
Combobox/Strings, спозиционироваться на строке


15-1391758562
АндрейК
2014-02-07 11:36
2014.09.14
DelphiX


15-1391632202
Юрий
2014-02-06 00:30
2014.09.14
С днем рождения ! 6 февраля 2014 четверг


2-1381158756
OlegSkal
2013-10-07 19:12
2014.09.14
XE5 Win32 Android Viewport3D Layer3D искажение размеров


2-1381816621
aka
2013-10-15 09:57
2014.09.14
JSON русские символы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский