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

Вниз

Пользуетесь ли вы 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;
Скачать: CL | DM;

Наверх




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


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


15-1392150605
Юрий
2014-02-12 00:30
2014.09.14
С днем рождения ! 12 февраля 2014 среда


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


15-1391977802
Юрий
2014-02-10 00:30
2014.09.14
С днем рождения ! 10 февраля 2014 понедельник