Главная страница
    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;
одинаково ведут


 
Германн ©   (2014-01-28 04:45) [41]


> ё   (28.01.14 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;
> одинаково ведут

Неправильный пример для демонстрации различия этих вариантов приведения типа. As проверяет соответствие типов, а не равенство nil.


 
ё   (2014-01-28 05:01) [42]


> As проверяет соответствие типов, а не равенство nil.

в данном контексте это одинаково


 
ё   (2014-01-28 05:05) [43]


> Неправильный пример для демонстрации различия этих вариантов
> приведения типа. As проверяет соответствие типов, а не равенство
> nil.

а пример как раз правильный
только толи я не правильно помню, толи хе2 не правильно компилит
естественно думаю, что я не прав


 
й   (2014-01-28 08:27) [44]

ё, замени в обоих случаях "Sender := nil;" на "Sender := Form5;" - и увидишь разницу!

по вопросу ТС: есть мнение, что объявление переменной (указание её типа) по месту использования (как в С-подобных языках) удобнее тем, что при чтении кода не нужно искать/перескакивать глазами к месту объявления (как в паскале), то есть понимание кода происходит быстрее
по этой же причине приведение типа по месту ("TButton(Sender)") удобнее, чем absolute в секции определения переменных - быстрее прочитать и понять (а "Sender as TButton" еще и безопаснее, но это уже другой вопрос)

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


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

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

Итак в регистрах - куда быстрее? :)


 
Стенка ©   (2014-01-28 19:57) [46]

сюда быстрее )


procedure InverseByteOrder(var i: int64);
asm
 mov ecx, [eax]
 mov edx, [eax+4]
 bswap ecx
 bswap edx
 mov [eax], edx
 mov [eax+4], ecx
end;


 
Германн ©   (2014-01-28 20:20) [47]


> ё   (28.01.14 05:05) [43]
>
>
> > Неправильный пример для демонстрации различия этих вариантов
> > приведения типа. As проверяет соответствие типов, а не
> равенство
> > nil.
>
> а пример как раз правильный
>

Пример неправилен тем, что для приведения типов абсолютно неважно указывает ссылка на nil или не nil.


 
bems ©   (2014-01-29 00:36) [48]


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

и операции копирования :)

вообще вопрос поставлен неправильно. почему я должен пользоваться сабжем только в случае если мне не подходит присваивание в отдельный указатель? что если я буду каждый раз когда вижу как кто-то копирует в отдельный указатель спрашивать "а почему не заюзать absolute?"

есть такая фича в языке, вот я и пользуюсь. жаль что нельзя по-первых использовать в случае двух глобальных переменных, во-вторых когда объявляется локальная, а после absolute указывается глобальная


 
bems ©   (2014-01-29 00:36) [49]


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

и операции копирования :)

вообще вопрос поставлен неправильно. почему я должен пользоваться сабжем только в случае если мне не подходит присваивание в отдельный указатель? что если я буду каждый раз когда вижу как кто-то копирует в отдельный указатель спрашивать "а почему не заюзать absolute?"

есть такая фича в языке, вот я и пользуюсь. жаль что нельзя по-первых использовать в случае двух глобальных переменных, во-вторых когда объявляется локальная, а после absolute указывается глобальная


 
ё   (2014-01-29 00:43) [50]


> Пример неправилен тем, что для приведения типов абсолютно
> неважно указывает ссылка на nil или не nil.

вот зачем ты ерунду сейчас несешь?


 
bems ©   (2014-01-29 00:44) [51]


> аль что нельзя по-первых использовать в случае двух глобальных
> переменных, во-вторых когда объявляется локальная, а после
> absolute указывается глобальная


щас проверил - скомпилилось. с чего я это взял...


 
Дмитрий СС   (2014-01-29 12:14) [52]


> есть такая фича в языке, вот я и пользуюсь.

Ну goto тоже есть в языке, если бы я спросил пользуетесь ли вы goto, думаю, ветку бы уже закрыли:)


 
clickmaker ©   (2014-01-29 12:17) [53]

> пользуетесь ли вы goto

я в коде хранимок на sql пользовался )


 
DevilDevil ©   (2014-01-29 12:22) [54]

goto рулит

Кроме того, как показывает практика, Delphi эффективнее компилирует "бесконечный цикл" если его реализовать через goto, а не через while true do


 
DevilDevil ©   (2014-01-29 12:26) [55]

> Стенка ©   (28.01.14 19:57) [46]
> сюда быстрее )


быстрее всего так
ибо возможно, что человеку нужно сохранить в другой место (памяти) или проделать иные манипуляции :)

function InverseByteOrder(X: PInt64): int64;
asm
mov edx, [eax]
mov eax, [eax+4]
bswap edx
bswap eax
end;


 
Стенка ©   (2014-01-29 12:46) [56]

> DevilDevil ©   (29.01.14 12:26) [55]
> быстрее всего так

так оно быстрее в вакууме, а в реале результат ему в памяти нужен


 
DevilDevil ©   (2014-01-29 12:54) [57]

var
 Src, Dest: p8bytes;
begin
 ...

 // your
 pint64(Dest)^ := pint64(Src)^; // 10 ticks
 Стенка.InverseByteOrder(pint64(Dest)^); // excess 6 ticks

 // my
 pint64(Dest)^{6 ticks} := DevilDevil.InverseByteOrder(pint64(Src));
end


 
Стенка ©   (2014-01-29 12:59) [58]

> DevilDevil ©   (29.01.14 12:54) [57]

че за ... на ровном месте? поставь мне

var
 Src, Dest: int64;


 
Стенка ©   (2014-01-29 13:03) [59]

ну т.е. оставь просто один оператор, без всяких своих выдуманных пересылок, нафиг ненужных автору:

InverseByteOrder(i);


 
DevilDevil ©   (2014-01-29 13:08) [60]

var
Src, Dest: int64;
begin
...

// your
Dest:= Src; // 10 ticks
Стенка.InverseByteOrder(Dest); // excess 6 ticks

// my
Dest^{6 ticks} := DevilDevil.InverseByteOrder(@Src);
end


 
Стенка ©   (2014-01-29 13:11) [61]

[59], блин!


 
Стенка ©   (2014-01-29 13:15) [62]

И не на пустом цикле гоняй, а с нагрузкой на другую память. В моем коде запись в память производится раньше, что полюбому лучше.


 
bems ©   (2014-01-29 17:13) [63]


> Ну goto тоже есть в языке, если бы я спросил пользуетесь
> ли вы goto, думаю, ветку бы уже закрыли:)

довольно редко, но пользуюсь в качестве Break(n)


 
Германн ©   (2014-01-29 20:24) [64]


> bems ©   (29.01.14 17:13) [63]
>
>
> > Ну goto тоже есть в языке, если бы я спросил пользуетесь
> > ли вы goto, думаю, ветку бы уже закрыли:)
>
> довольно редко, но пользуюсь в качестве Break(n)
>

А чем хуже Continue и Exit?


 
bems ©   (2014-01-29 20:31) [65]

не понял вопроса. они тут каким боком?


 
Германн ©   (2014-01-29 20:34) [66]


> bems ©   (29.01.14 20:31) [65]
>
> не понял вопроса. они тут каким боком?
>  

Они те же goto, что и Break.


 
bems ©   (2014-01-29 20:41) [67]

может непонятно выразился.
я пользуюсь goto для выхода из нескольких вложенных циклов, там где кроме простого break мне понадобилось бы завести дополнительную переменную или вынести вложенный цикл в подпрограмму. Как тут могут помочь Continue и Exit?


 
Jeer ©   (2014-01-29 20:57) [68]

>может непонятно выразился.

Имелось в виду, что все эти операторы цикла сводятся по сути к специализированным goto.

С другой стороны, goto всегда предполагает предельно развернутый код, что отнюдь не способствует "зрелищности" последнего.


 
Германн ©   (2014-01-29 21:01) [69]


> bems ©   (29.01.14 20:41) [67]
>
> может непонятно выразился.

Наверно.
А также про "все эти операторы цикла".
P.S.
На винграде ты был бы более осторожен в формулировках. :)


 
Inovet ©   (2014-01-29 21:14) [70]

> [52] Дмитрий СС   (29.01.14 12:14)
> Ну goto тоже есть в языке, если бы я спросил пользуетесь
> ли вы goto, думаю, ветку бы уже закрыли:)

Вот щас и закроют, потому что готу обсуждался 100500 раз.


 
bems ©   (2014-01-29 21:23) [71]


> Имелось в виду, что все эти операторы цикла сводятся по
> сути к специализированным goto.

ну это какбы не новость, но речь-то не об этом


> С другой стороны, goto всегда предполагает предельно развернутый
> код, что отнюдь не способствует "зрелищности" последнего.

вот тут не понял. что значит развернутый?


> На винграде ты был бы более осторожен в формулировках

не, такой же


 
antonn ©   (2014-01-29 21:33) [72]


> На винграде ты был бы более осторожен в формулировках. :
> )

он комодератор http://forum.vingrad.ru/users/bems


 
Германн ©   (2014-01-29 22:05) [73]


> antonn ©   (29.01.14 21:33) [72]

А то я не знаю. Он даже как-то имел счастье забанить меня на трое суток за непочтительное отношение к своей персоне. :)
Но то давно было.


 
Jeer ©   (2014-01-29 22:42) [74]

>bems ©   (29.01.14 21:23) [71]
>вот тут не понял. что значит развернутый?

Не так давно, вполне себе "штанистый" Ega тоже "взбрыкнул" по поводу развертывания цикла.
Так вот, развертывание кода в целом - это еще более эпическое действо:)


 
[ВладОшин] ©   (2014-01-30 00:11) [75]

дык, его ж не продают уже вроде? 6)


 
Германн ©   (2014-01-30 00:27) [76]


> [ВладОшин] ©   (30.01.14 00:11) [75]
>
> дык, его ж не продают уже вроде? 6)
>  

Кого? За сколько? Кто последний?
:)


 
Дмитрий Белькевич   (2014-01-30 01:11) [77]

Плохо, что нельзя в регистрах передать и вернуть. По крайней мере - у меня не получилось написать так, что бы Delphi передала данные в регистрах и забрала из них же.

На 64-х битном компиляторе лучше:


function InverseByteOrder(i: int64): int64;
asm
mov rax, rcx
bswap rax
end;


 
Дмитрий Белькевич   (2014-01-30 01:14) [78]

Посмотрел - в [35] данные -то возвращаются в регистрах. Но Delphi опять их в память кладет.


 
DevilDevil ©   (2014-01-30 01:49) [79]

Плохо, что в дельфи нет интринсинков, в частности bswap
Тогда и функцию не нужно было бы вызывать :)


 
NoUser ©   (2014-01-30 17:20) [80]

> Дмитрий Белькевич   (30.01.14 01:11) [77],[78]
function InverseByteOrderR(qH,qL:Cardinal):UInt64;
asm
  BSWAP EDX
  BSWAP EAX
end;

var
 p:Int64;

begin
 p:=InverseByteOrderR($80706050,$40302010)+1;
end.

:: p:=InverseByteOrderR($80706050,$40302010)+1;
0041A3CC BA10203040       mov edx,$40302010
0041A3D1 B850607080       mov eax,$80706050
0041A3D6 E86DD3FFFF       call InverseByteOrderR
0041A3DB 83C001           add eax,$01
0041A3DE 83D200           adc edx,$00


> Но Delphi опять их в память кладет.
А что, нужно выбросить в мусор?


> DevilDevil ©   (30.01.14 01:49) [79]
> Плохо, что в дельфи нет интринсинков, в частности bswap
> Тогда и функцию не нужно было бы вызывать :)


Плохо, что нельзя заинлайнить асм, - тогда и функцию не нужно было бы вызывать!


 
имя   (2014-01-31 13:33) [81]

Удалено модератором


 
DevilDevil ©   (2014-01-31 14:14) [82]

Заинлайнить вообще почти ничего нельзя :)
Не говоря уже об асме :)


 
ТимоховДА   (2014-02-02 03:34) [83]

пользуюсь.
удобно для for ... in ... do


 
Я вас всех знаю   (2014-02-02 22:06) [84]


> ТимоховДА   (02.02.14 03:34) [83]
>
> пользуюсь.
> удобно для for ... in ... do
>


Как это? Нужен пример.


 
Дмитрий Белькевич   (2014-02-03 02:16) [85]

>function InverseByteOrderR(qH,qL:Cardinal):UInt64;

Некрасивый вызов получится:


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;


>Плохо, что нельзя заинлайнить асм, - тогда и функцию не нужно было бы вызывать!

Увы.

>А что, нужно выбросить в мусор?

Вернуть в регистрах.


 
Дмитрий Белькевич   (2014-02-03 02:18) [86]

>Вернуть в регистрах.

Точнее - дальше в регистрах и обрабатывать.


 
NoUser ©   (2014-02-09 17:56) [87]

> Точнее - дальше в регистрах и обрабатывать.
::
0041A3DB 83C001           add eax,$01
0041A3DE 83D200           adc edx,$00


> Некрасивый вызов получится:
Значит Мир он(а,о) не спасет!



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

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

Наверх





Память: 0.67 MB
Время: 0.004 c
15-1391671804
alex_
2014-02-06 11:30
2014.09.14
Кладовка


15-1391718602
Юрий
2014-02-07 00:30
2014.09.14
С днем рождения ! 7 февраля 2014 пятница


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


15-1390565775
DevilDevil
2014-01-24 16:16
2014.09.14
Разбираемся в кодировках


15-1391801247
Novicer
2014-02-07 23:27
2014.09.14
Работа программы в сетевом режиме





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