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

Вниз

Люди, которые пишут begin..end вокруг одного оператора   Найти похожие ветки 

 
DVM ©   (2012-12-16 22:18) [160]

Inc и Dec это и не функции или процедуры вообще в привычном понимании, это магия компилятора скорее, Inc(p) дает более оптимальный код, чем p := p + 1


 
QAZ9   (2012-12-16 22:29) [161]


> Особенно с учетом inline?

нету инлайна в "старых" делфях


 
Rouse_ ©   (2012-12-16 22:36) [162]


> QAZ9   (16.12.12 22:29) [161]
>
> > Особенно с учетом inline?
>
> нету инлайна в "старых" делфях

Та шош ты так уперся :) Ну во первых есть, нужно только уметь его использовать. Во вторых не там ты ищешь :)


 
QAZ9   (2012-12-16 22:38) [163]

где в 7ке например искать?


 
DVM ©   (2012-12-16 22:40) [164]


> QAZ9   (16.12.12 22:29) [161]
>
> > Особенно с учетом inline?
>
> нету инлайна в "старых" делфях

Ну применительно к Inc Dec хоть есть он хоть нет его, все одно код будет вставлен по месту, никакого вызова функции то и не будет, самой функции то и нет.

Речь даже не о скорости, а о наглядности, удобстве использования. Там где все упрется в быстродействие, можно и ASM использовать.


 
Игорь Шевченко ©   (2012-12-16 22:44) [165]

Rouse_ ©   (16.12.12 22:09) [159]


> люди реализовавшие Inc/Dec/Max/Min


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


 
Игорь Шевченко ©   (2012-12-16 22:46) [166]

DVM ©   (16.12.12 22:18) [160]


> Inc(p) дает более оптимальный код, чем p := p + 1


Это было давно и неправда


 
Rouse_ ©   (2012-12-16 22:46) [167]


> QAZ9   (16.12.12 22:38) [163]
> где в 7ке например искать?

Открою тайну - инклуды :)


 
Rouse_ ©   (2012-12-16 22:55) [168]


> Я про другое - в каком-то юните (по-моему, из VCL, не могу
> найти, не хочу врать) есть масса нелепых конструкций, повторяющих
> поведение сишных операторов.

А вот это уже нюанс - покажешь, может и соглашусь...


 
DVM ©   (2012-12-16 23:00) [169]


> Игорь Шевченко ©   (16.12.12 22:46) [166]


> Это было давно и неправда

да, посмотрел, действительно теперь компилятор заменяет выражения k := k + 1 на точно такой же код, какой раньше он порождал для Inc(k). Один в один.


Unit5.pas.37: inc(k, 10);
00510639 8345E80A         add dword ptr [ebp-$18],$0a

Unit5.pas.52: k := k + 10;
005106E9 8345E80A         add dword ptr [ebp-$18],$0a


 
DVM ©   (2012-12-16 23:05) [170]


> Игорь Шевченко ©   (16.12.12 22:44) [165]


> Я про другое - в каком-то юните (по-моему, из VCL, не могу
> найти, не хочу врать) есть масса нелепых конструкций, повторяющих
> поведение сишных операторов.

этот юнит случайно не для линковки какой то сишной либы типа zlib?


 
Rouse_ ©   (2012-12-16 23:10) [171]


> DVM ©   (16.12.12 23:00) [169]
>
> > Игорь Шевченко ©   (16.12.12 22:46) [166]
>
>
> > Это было давно и неправда
>
> да, посмотрел, действительно теперь компилятор заменяет
> выражения k := k + 1 на точно такой же код, какой раньше
> он порождал для Inc(k). Один в один.

с адресной арифметикой INC выиграет, но на нюансах, надо найти в загашниках код который кажет данный нюанс...


 
Игорь Шевченко ©   (2012-12-16 23:11) [172]

DVM ©   (16.12.12 23:05) [170]

Нет, но явно что-то сишное переписывалось. Даже в блогах по этому модулю или связанному с ним проходились.


 
Игорь Шевченко ©   (2012-12-16 23:34) [173]

Дабы не слыть голословным

возможно, я натыкался на это

function Incr(var Arg: Integer): Integer; inline;
begin
 Inc(Arg);
 Result := Arg;
end;

function Decr(var Arg: Integer): Integer; inline;
begin
 Dec(Arg);
 Result := Arg;
end;

function IncrAfter(var Arg: Integer): Integer; inline;
begin
 Result := Arg;
 Inc(Arg);
end;

function DecrAfter(var Arg: Integer): Integer; inline;
begin
 Result := Arg;
 Dec(Arg);
end;

function C_Conditional(const Condition: Boolean; const TruePart, FalsePart: UnicodeString): UnicodeString;
begin
 if Condition then
   Result := TruePart
 else
   Result := FalsePart;
end;


C:\Program Files\Embarcadero\RAD Studio\7.0\source\database\dbxplatform.pas

причем, только в 10% эти функции используются, как функции, в 90% - как процедуры, то есть, ничем не отличаются от стандартных Inc, Dec


 
Игорь Шевченко ©   (2012-12-16 23:39) [174]

Оттуда же

 if Hex = nil then
 begin
   SetLength(Hex,16);
   Hex[0] := Ord("0");
   Hex[1] := Ord("1");
   Hex[2] := Ord("2");
   Hex[3] := Ord("3");
   Hex[4] := Ord("4");
   Hex[5] := Ord("5");
   Hex[6] := Ord("6");
   Hex[7] := Ord("7");
   Hex[8] := Ord("8");
   Hex[9] := Ord("9");
   Hex[10] := Ord("A");
   Hex[11] := Ord("B");
   Hex[12] := Ord("C");
   Hex[13] := Ord("D");
   Hex[14] := Ord("E");
   Hex[15] := Ord("F");
   SetLength(MethodStart,10);
   MethodStart[0] := Ord("{");
   MethodStart[1] := Ord(""");
   MethodStart[2] := Ord("m");
   MethodStart[3] := Ord("e");
   MethodStart[4] := Ord("t");
   MethodStart[5] := Ord("h");
   MethodStart[6] := Ord("o");
   MethodStart[7] := Ord("d");
   MethodStart[8] := Ord(""");
   MethodStart[9] := Ord(":");
   SetLength(ParamsStart,10);
   ParamsStart[0] := Ord(""");
   ParamsStart[1] := Ord("p");
   ParamsStart[2] := Ord("a");
   ParamsStart[3] := Ord("r");
   ParamsStart[4] := Ord("a");
   ParamsStart[5] := Ord("m");
   ParamsStart[6] := Ord("s");
   ParamsStart[7] := Ord(""");
   ParamsStart[8] := Ord(":");
   ParamsStart[9] := Ord("[");
   SetLength(Connect,10);
   Connect[0] := Ord(""");
   Connect[1] := Ord("c");
   Connect[2] := Ord("o");
   Connect[3] := Ord("n");
   Connect[4] := Ord("n");
   Connect[5] := Ord("e");
   Connect[6] := Ord("c");
   Connect[7] := Ord("t");
   Connect[8] := Ord(""");
   Connect[9] := Ord(",");
   SetLength(Disconnect,13);
   Disconnect[0] := Ord(""");
   Disconnect[1] := Ord("d");
   Disconnect[2] := Ord("i");
   Disconnect[3] := Ord("s");
   Disconnect[4] := Ord("c");
   Disconnect[5] := Ord("o");
   Disconnect[6] := Ord("n");
   Disconnect[7] := Ord("n");
   Disconnect[8] := Ord("e");
   Disconnect[9] := Ord("c");
   Disconnect[10] := Ord("t");
   Disconnect[11] := Ord(""");
   Disconnect[12] := Ord(",");
   SetLength(Prepare,10);
   Prepare[0] := Ord(""");
   Prepare[1] := Ord("p");
   Prepare[2] := Ord("r");
   Prepare[3] := Ord("e");
   Prepare[4] := Ord("p");
   Prepare[5] := Ord("a");
   Prepare[6] := Ord("r");
   Prepare[7] := Ord("e");
   Prepare[8] := Ord(""");
   Prepare[9] := Ord(",");
   SetLength(Parameters,15);
   Parameters[0] := Ord("{");
   Parameters[1] := Ord(""");
   Parameters[2] := Ord("p");
   Parameters[3] := Ord("a");
   Parameters[4] := Ord("r");
   Parameters[5] := Ord("a");
   Parameters[6] := Ord("m");
   Parameters[7] := Ord("e");
   Parameters[8] := Ord("t");
   Parameters[9] := Ord("e");
   Parameters[10] := Ord("r");
   Parameters[11] := Ord("s");
   Parameters[12] := Ord(""");
   Parameters[13] := Ord(":");
   Parameters[14] := Ord("[");
   SetLength(Execute,10);
   Execute[0] := Ord(""");
   Execute[1] := Ord("e");
   Execute[2] := Ord("x");
   Execute[3] := Ord("e");
   Execute[4] := Ord("c");
   Execute[5] := Ord("u");
   Execute[6] := Ord("t");
   Execute[7] := Ord("e");
   Execute[8] := Ord(""");
   Execute[9] := Ord(",");
   SetLength(CommandClose,16);
   CommandClose[0] := Ord(""");
   CommandClose[1] := Ord("c");
   CommandClose[2] := Ord("o");
   CommandClose[3] := Ord("m");
   CommandClose[4] := Ord("m");
   CommandClose[5] := Ord("a");
   CommandClose[6] := Ord("n");
   CommandClose[7] := Ord("d");
   CommandClose[8] := Ord("_");
   CommandClose[9] := Ord("c");
   CommandClose[10] := Ord("l");
   CommandClose[11] := Ord("o");
   CommandClose[12] := Ord("s");
   CommandClose[13] := Ord("e");
   CommandClose[14] := Ord(""");
   CommandClose[15] := Ord(",");
   SetLength(ReaderClose,15);
   ReaderClose[0] := Ord(""");
   ReaderClose[1] := Ord("r");
   ReaderClose[2] := Ord("e");
   ReaderClose[3] := Ord("a");
   ReaderClose[4] := Ord("d");
   ReaderClose[5] := Ord("e");
   ReaderClose[6] := Ord("r");
   ReaderClose[7] := Ord("_");
   ReaderClose[8] := Ord("c");
   ReaderClose[9] := Ord("l");
   ReaderClose[10] := Ord("o");
   ReaderClose[11] := Ord("s");
   ReaderClose[12] := Ord("e");
   ReaderClose[13] := Ord(""");
   ReaderClose[14] := Ord(",");
   SetLength(ResultStart,11);
   ResultStart[0] := Ord("{");
   ResultStart[1] := Ord(""");
   ResultStart[2] := Ord("r");
   ResultStart[3] := Ord("e");
   ResultStart[4] := Ord("s");
   ResultStart[5] := Ord("u");
   ResultStart[6] := Ord("l");
   ResultStart[7] := Ord("t");
   ResultStart[8] := Ord(""");
   ResultStart[9] := Ord(":");
   ResultStart[10] := Ord("[");
   SetLength(ErrorStart,17);
   ErrorStart[0] := Ord("{");
   ErrorStart[1] := Ord(""");
   ErrorStart[2] := Ord("e");
   ErrorStart[3] := Ord("r");
   ErrorStart[4] := Ord("r");
   ErrorStart[5] := Ord("o");
   ErrorStart[6] := Ord("r");
   ErrorStart[7] := Ord(""");
   ErrorStart[8] := Ord(":");
   ErrorStart[9] := Ord("{");
   ErrorStart[10] := Ord(""");
   ErrorStart[11] := Ord("n");
   ErrorStart[12] := Ord("a");
   ErrorStart[13] := Ord("m");
   ErrorStart[14] := Ord("e");
   ErrorStart[15] := Ord(""");
   ErrorStart[16] := Ord(":");
   SetLength(CodeLabel,7);
   CodeLabel[0] := Ord(""");
   CodeLabel[1] := Ord("c");
   CodeLabel[2] := Ord("o");
   CodeLabel[3] := Ord("d");
   CodeLabel[4] := Ord("e");
   CodeLabel[5] := Ord(""");
   CodeLabel[6] := Ord(":");
   SetLength(MessageLabel,10);
   MessageLabel[0] := Ord(""");
   MessageLabel[1] := Ord("m");
   MessageLabel[2] := Ord("e");
   MessageLabel[3] := Ord("s");
   MessageLabel[4] := Ord("s");
   MessageLabel[5] := Ord("a");
   MessageLabel[6] := Ord("g");
   MessageLabel[7] := Ord("e");
   MessageLabel[8] := Ord(""");
   MessageLabel[9] := Ord(":");
   SetLength(NullValue,4);
   NullValue[0] := Ord("n");
   NullValue[1] := Ord("u");
   NullValue[2] := Ord("l");
   NullValue[3] := Ord("l");
   SetLength(TrueValue,4);
   TrueValue[0] := Ord("t");
   TrueValue[1] := Ord("r");
   TrueValue[2] := Ord("u");
   TrueValue[3] := Ord("e");
   SetLength(FalseValue,5);
   FalseValue[0] := Ord("f");
   FalseValue[1] := Ord("a");
   FalseValue[2] := Ord("l");
   FalseValue[3] := Ord("s");
   FalseValue[4] := Ord("e");
...
 end;


 
GEN++ ©   (2012-12-16 23:40) [175]

Пусть я n! раз тормоз прогресса и заклятый враг программистов
все времен и народов - но ставить begin ... end даже на один оператор
буду!!!!!


 
DVM ©   (2012-12-16 23:55) [176]


> Игорь Шевченко ©   (16.12.12 23:34) [173]


> function C_Conditional(const Condition: Boolean; const TruePart,
>  FalsePart: UnicodeString): UnicodeString;

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


> Игорь Шевченко ©   (16.12.12 23:39) [174]

а это какая то жесть, зачем так было делать мне не очень понятно. Оно и не наглядно и длинно. Как будто кто-то для теста по быстрому написал и так оно и осталось.


 
Игорь Шевченко ©   (2012-12-17 00:01) [177]

DVM ©   (16.12.12 23:55) [176]


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


Расстреливать из ржавого пистолета за такое применение. Во-первых, вызов влечет за собой вычисление ВСЕХ ее операндов, даже тех, которые по условию не будут нужны, во-вторых, код становится непонятнее.

Что делается в этой строке ? (indy)

     StreamWrite(AStream, iif(HeadContent <> "", HeadContent));


 
Игорь Шевченко ©   (2012-12-17 00:02) [178]

DVM ©   (16.12.12 23:55) [176]


> а это какая то жесть


целиком код не влез, там еще сотня строк такого же плана


 
DVM ©   (2012-12-17 00:07) [179]


> Игорь Шевченко ©   (17.12.12 00:01) [177]


> Во-первых, вызов влечет за собой вычисление ВСЕХ ее операндов,
>  даже тех, которые по условию не будут нужны

ну это критично редко бывает


> во-вторых, код становится непонятнее.

Есть такое. Но все равно, на мой взгляд удобно с ней.


>
> Что делается в этой строке ? (indy)
>
>      StreamWrite(AStream, iif(HeadContent <> "", HeadContent));
>
>
>

а где еще один параметр у iif ?


 
Игорь Шевченко ©   (2012-12-17 00:18) [180]

DVM ©   (17.12.12 00:07) [179]

А почему должно быть несколько параметров ?

Я привел код, источник
C:\Program Files\Embarcadero\RAD Studio\7.0\source\IntraWeb\iwtemplateprocessorwap.pas

еще пример (не из indy)

         for I := 0 to S.Count - 1 do
           writeln(T, Format("   ""%s""%s", [S[I], IIF(S.Count - 1 - I,
                 0, "", "||CHR(13)||CHR(10)||")]));

сколько времени потребуется, чтобы понять смысл действий ?


 
DVM ©   (2012-12-17 00:28) [181]


> Игорь Шевченко ©   (17.12.12 00:18) [180]
> DVM ©   (17.12.12 00:07) [179]
>
> А почему должно быть несколько параметров ?

А какой смысл когда параметров только 2 (условие и один из вариантов)?

Ну обычно IIF(условие, результат при ИСТИНА, результат при ЛОЖНО): тип результата;

Я только за такой вариант.


> for I := 0 to S.Count - 1 do
>            writeln(T, Format("   ""%s""%s", [S[I], IIF(S.
> Count - 1 - I,
>                  0, "", "||CHR(13)||CHR(10)||")]));
>
> сколько времени потребуется, чтобы понять смысл действий
> ?

Кому как, это дело привычки, если знать доподлинно, что делает IIF тому понятно, остальным нет.
А вообще мудрено написано. В си стиле я бы даже сказал.


 
Игорь Шевченко ©   (2012-12-17 00:36) [182]

DVM ©   (17.12.12 00:28) [181]


> А какой смысл когда параметров только 2 (условие и один
> из вариантов)?


Смотрим потроха indy и видим несколько объявлений:

function iif(ATest: Boolean; const ATrue: Integer; const AFalse: Integer): Integer; overload;
function iif(ATest: Boolean; const ATrue: string; const AFalse: string = ""): string; overload; { do not localize }
function iif(ATest: Boolean; const ATrue: Boolean; const AFalse: Boolean): Boolean; overload;

Я сам в таком же недоумении был - как это, iif и два параметра ?

а стандартная конструкция if then else не может быть overload, поэтому всегда понятна :)

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


 
Германн ©   (2012-12-17 02:12) [183]

А в результате весь спор свёлся к тому, что давно уже очевидно:
Borland/CodeGear/Embarkadero собирают весь "мусор", если он бесплатный.
Ну или его можно купить со скидкой.


 
RGV ©   (2012-12-17 05:09) [184]

я пишу так
 
 case day of
    1: FeedCat("Мурзик");
    2: begin
           FeedCat("Масяня");
           FeedCat("Мурзик");
        end;
    else FeedAllCats;
 end;
 try getObject(obj) except  DoSomething end;


 
TUser ©   (2012-12-17 07:04) [185]

у iif 4 параметра?

IIF(
S.Count - 1 - I,
0,
"",
"||CHR(13)||CHR(10)||")


 
DVM ©   (2012-12-17 10:14) [186]


> TUser ©   (17.12.12 07:04) [185]
> у iif 4 параметра?

да их там хоть 100 сделать можно, тогда он CASE подобным становится.


 
QAZ9   (2012-12-17 10:16) [187]


> Открою тайну - инклуды :)

мдаааа ,так и думал что про них вспомнишь
и как ты себе это представляеш?
например x:=x+1; помещенный в иклюд каким местом мне применить для y ?


 
RWolf ©   (2012-12-17 10:35) [188]


>  [180]
>          for I := 0 to S.Count - 1 do
>            writeln(T, Format("   ""%s""%s", [S[I], IIF(S.
> Count - 1 - I,                  0, "", "||CHR(13)||CHR(10)||")]));
>


этот код непрозрачен не из-за IIF, а из-за кривой записи.

for I := 0 to S.Count - 1 do
begin
 arg := IIF(S.Count - 1 - I, 0,
               "",
               "||CHR(13)||CHR(10)||");
 writeln(T, Format("   ""%s""%s", [S[I], arg]));
end;


 
Дмитрий С ©   (2012-12-17 10:37) [189]


> например x:=x+1; помещенный в иклюд каким местом мне применить
> для y ?

{$I include_begin.inc}y{$I include_middle.inc}1{$I include_end.inc} :)


 
Rouse_ ©   (2012-12-17 10:38) [190]


> QAZ9   (17.12.12 10:16) [187]
>
> > Открою тайну - инклуды :)
>
> мдаааа ,так и думал что про них вспомнишь

А зачем x := x + 1 в инклуд то помещать, когда есть Inc? :)
В остальных случаях соблюдаются определенные правила.


 
QAZ9   (2012-12-17 10:43) [191]


> А зачем x := x + 1 в инклуд то помещать

это минимальный гипотетический пример на твой гипотетический ответ

> Дмитрий С ©   (17.12.12 10:37) [189]

а содержимое этих самых файлов?
и кстати по любому проще повторить 100500 раз нужный код в разных местах чем инклюдить или и тут поспорим ?


 
DVM ©   (2012-12-17 11:22) [192]


> QAZ9   (17.12.12 10:43) [191]


> и кстати по любому проще повторить 100500 раз нужный код
> в разных местах

Проще функцию сделать, чем повторять код 100500 раз в нужных местах. А накладные расходы на вызов функции как правило в обычном коде не заметны, если только функция не вызывается в цикле миллионы раз.


 
QAZ9   (2012-12-17 11:35) [193]


> DVM ©   (17.12.12 11:22) [192]

неспорю :)
но батонокидатели обожают такие функции пихать в циклы миллиоразные :)
типа чем меньше букв тем оптимизированней код


 
Игорь Шевченко ©   (2012-12-17 11:53) [194]

RWolf ©   (17.12.12 10:35) [188]

А чем вариант


        for I := 0 to S.Count - 1 do
          if I <> S.Count - 1 then //Не последняя строка
            writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||", [S[I]]))
          else
            writeln(T, Format("   ""%s""", [S[I]]));


менее прозрачен ?


 
RWolf ©   (2012-12-17 11:56) [195]


> [194]

ничем, лично я так и написал бы.


 
RWolf ©   (2012-12-17 11:58) [196]

впрочем, вру, я написал бы
writeln(T, "   """, S[I], ""||CHR(13)||CHR(10)||")
;)


 
Sha ©   (2012-12-17 12:32) [197]

> Игорь Шевченко ©   (17.12.12 11:53) [194]

Я бы и этот вариант развернул.
Спрашивается, нафига там формат, а не обычное сцепление?

P.S.
Сейчас как раз ковыряю корпоративный софт.
Настоящее лекарство от альцгеймера:
ребусы, кроссворды, анекдоты рядом не стояли.


 
Компромисс1   (2012-12-17 12:47) [198]

Кстати, всегда раздражал код вида

for I := 0 to S.Count - 1 do
          if I <> S.Count - 1 then //Не последняя строка
            writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||", [S[I]]))
          else
            writeln(T, Format("   ""%s""", [S[I]]));

так и хочется его заменить на

if S.Count > 0 then
begin
 for I := 0 to S.Count - 2 do
 begin
     writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||", [S[I]]))
 end;
 // последняя строка
  writeln(T, Format("   ""%s""", [S[S.Count-1]]));
end;


 
Компромисс1   (2012-12-17 12:47) [199]

Кстати, всегда раздражал код вида

for I := 0 to S.Count - 1 do
          if I <> S.Count - 1 then //Не последняя строка
            writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||", [S[I]]))
          else
            writeln(T, Format("   ""%s""", [S[I]]));

так и хочется его заменить на

if S.Count > 0 then
begin
 for I := 0 to S.Count - 2 do
 begin
     writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||", [S[I]]))
 end;
 // последняя строка
  writeln(T, Format("   ""%s""", [S[S.Count-1]]));
end;


 
Игорь Шевченко ©   (2012-12-17 15:16) [200]

Компромисс1   (17.12.12 12:47) [199]


> if S.Count > 0 then
> begin
>  for I := 0 to S.Count - 2 do
>  begin
>      writeln(T, Format("   ""%s""||CHR(13)||CHR(10)||",
> [S[I]]))
>  end;
>  // последняя строка
>   writeln(T, Format("   ""%s""", [S[S.Count-1]]));
> end;


непонятно

Sha ©   (17.12.12 12:32) [197]


> Я бы и этот вариант развернул.
> Спрашивается, нафига там формат, а не обычное сцепление?
>


Кстати, да. Формат там ни к селу


> Сейчас как раз ковыряю корпоративный софт.
> Настоящее лекарство от альцгеймера:
> ребусы, кроссворды, анекдоты рядом не стояли.


Не сыпь мне соль на рану :)



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

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

Наверх




Память: 0.86 MB
Время: 0.987 c
15-1355913207
Дмитрий С
2012-12-19 14:33
2013.04.14
Открыть файл от имени администратора.


4-1264578817
Interesting
2010-01-27 10:53
2013.04.14
Время по GMT


15-1355208502
alexdn
2012-12-11 10:48
2013.04.14
Пхп


2-1349843928
bashik77
2012-10-10 08:38
2013.04.14
выбор компонента


4-1264583204
GanibalLector
2010-01-27 12:06
2013.04.14
Проверка создания дополнительного потока.