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

Вниз

Исключение EConvertError c SInvalidDateTime   Найти похожие ветки 

 
Германн ©   (2005-10-15 00:53) [0]

Ткните меня плиииз носом в дерьмо, если кто знает как подобное исключение может выдаваться в таком варианте:
               try
                 FieldByName("EvDateTime").AsDateTime:=StrToDateTime(BCDDateTimeToStr(Dt));
               except
                 on EConvertError do
                   FieldByName("EvDateTime").AsDateTime:=StrToDateTime("01.01.80 00:00");
               end;

или в таком
               try
                 FieldByName("EvDateTime").AsDateTime:=StrToDateTime(BCDDateTimeToStr(Dt));
               except
                 FieldByName("EvDateTime").AsDateTime:=StrToDateTime("01.01.80 00:00");
               end;


P.S. работа не под отладчиком.

Проверил всю свою программу. Явно, функция StrToDateTime вызывается только там. Неявные её вызовы, вроде бы, в программе отсутствуют. (XXX:=TStringField.AsDateTime не пользую. TDateTimeField.AsString:=... - то же. Фильтр на таблицу - то же не использую. Это все возможные вызовы StrToDateTime, которые я накопал в Delphi\Source. Есть ещё, правда и IniFiles, но это я исключил, поскольку в нём я не использую ДатуВремя.

P.P.S.
 Нифига не понял, зачем было в Consts объявлять ещё раз константу SInvalidDateTime, которая уже объявлена в SysConsts, но с другим форматом вывода!


 
GuAV ©   (2005-10-15 02:23) [1]

Да хотя бы так:

 DateSeparator := "/";
 StrToDateTime("01.01.80 00:00");


Причём, DateSeparator изначально берётся из настроек системы, поэтому поведение может различатся на различных машинах.

В D7 я бы порекомендовал другую overloaded версию. В данном случае, видимо, следует явно задать DateSeparator или писать дату числом (const 01_01_80__18_00=29221).

Может исключение и не здесь. Следовало бы запомнить дату, указанную в тескте исключения.


 
GuAV ©   (2005-10-15 02:30) [2]


> Это все возможные вызовы StrToDateTime, которые я
> накопал в Delphi\Source.


А варианты ? Или их в четвёрке ещё нет ?


 
Германн ©   (2005-10-15 02:39) [3]

2 GuAV ©   (15.10.05 02:23) [1]

Запоминать дату тут нет нужды. В тексте исключения приведено: "  ", т.е. пробел.


 
Германн ©   (2005-10-15 02:43) [4]


> GuAV ©   (15.10.05 02:30) [2]
>
>
> > Это все возможные вызовы StrToDateTime, которые я
> > накопал в Delphi\Source.
>
>
> А варианты ? Или их в четвёрке ещё нет ?
>


Не понял! Это ты об чём?


 
GuAV ©   (2005-10-15 02:45) [5]

Тогда два варианта. Или следует поискать вызовы ещё, или настолько тяжелый (и невероятный) случай, что память под константу портится. У меня, ктати grep search выдал много результатов, не только IniFiles.


 
GuAV ©   (2005-10-15 02:46) [6]


>> А варианты ? Или их в четвёрке ещё нет ?
>>
>
>
> Не понял! Это ты об чём?


D:\Program Files\Borland\Delphi7\Source\Indy\IdFTPList.pas
   362 AItem.ModifiedDate := StrToDateTime(LModified);

D:\Program Files\Borland\Delphi7\Source\Indy\IdGlobal.pas
   209 function GmtOffsetStrToDateTime(S: string): TDateTime;
  1228 function GmtOffsetStrToDateTime(S: string): TDateTime;
  1257 DateTimeOffset := GmtOffsetStrToDateTime(S);

D:\Program Files\Borland\Delphi7\Source\Rtl\Common\IniFiles.pas
   225 Result := StrToDateTime(DateStr);

D:\Program Files\Borland\Delphi7\Source\Rtl\Sys\SysUtils.pas
  2248 { StrToDateTime converts the given string to a date and time value. The
  2253 function StrToDateTime(const S: string): TDateTime; overload;
  2254 function StrToDateTime(const S: string;
  2257 function StrToDateTimeDef(const S: string;
  2259 function StrToDateTimeDef(const S: string; const Default: TDateTime;
  2262 function TryStrToDateTime(const S: string;
  2264 function TryStrToDateTime(const S: string; out Value: TDateTime;
  2375 ""at" hh:mm AM/PM", StrToDateTime("2/15/95 10:30am"));
 12650 function StrToDateTime(const S: string): TDateTime;
 12652 if not TryStrToDateTime(S, Result) then
 12656 function StrToDateTime(const S: string;
 12659 if not TryStrToDateTime(S, Result, FormatSettings) then
 12663 function StrToDateTimeDef(const S: string; const Default: TDateTime): TDateTime;
 12665 if not TryStrToDateTime(S, Result) then
 12669 function StrToDateTimeDef(const S: string; const Default: TDateTime;
 12672 if not TryStrToDateTime(S, Result, FormatSettings) then
 12676 function TryStrToDateTime(const S: string; out Value: TDateTime): Boolean;
 12696 function TryStrToDateTime(const S: string; out Value: TDateTime;

D:\Program Files\Borland\Delphi7\Source\Rtl\Sys\VarUtils.pas
   795 Dest.VDate := StrToDateTime(WideString(LSource.VOleStr));
  1133 Result := CResult[TryStrToDateTime(strIn, dateOut)];

D:\Program Files\Borland\Delphi7\Source\ToolsAPI\DesignEditors.pas
  1963 else DT := StrToDateTime(Value);

D:\Program Files\Borland\Delphi7\Source\Vcl\ComCtrls.pas
 21517 DT := StrToDateTime(pszUserString);

D:\Program Files\Borland\Delphi7\Source\Vcl\DB.pas
  4317 Result := StrToDateTime(GetAsString);
  5160 DateTime := StrToDateTime(Value);

D:\Program Files\Borland\Delphi7\Source\Vcl\DBCommon.pas
   927 DateTime := StrToDateTime(string(TVarData(Value).VString)) else

D:\Program Files\Borland\Delphi7\Source\Vcl\IBSQL.pas
  1241 SetAsDateTime(StrToDateTime(Value))

D:\Program Files\Borland\Delphi7\Source\Vcl\SqlTimSt.pas
   609 Result := TryStrToDateTime(S, DT);

D:\Program Files\Borland\Delphi7\Source\WebSnap\xmlutil.pas
   562 Date := StrToDateTime(DateStr);


 
GuAV ©   (2005-10-15 02:57) [7]

FloatToDateTime и EncodeDateTime, DecodeDateTime из DateUtils тоже понимают это исключение, а


 
Германн ©   (2005-10-15 03:01) [8]

2 GuAV ©   (15.10.05 02:46) [6]
Ну, так это же от Д7. А у меня Д4.

2 GuAV ©   (15.10.05 02:45) [5]
>Или следует поискать вызовы ещё, или настолько тяжелый (и невероятный) случай, что память под константу портится.
Имхо, может и портится, но как?


 
Германн ©   (2005-10-15 03:12) [9]

2 GuAV ©   (15.10.05 02:57) [7]
Ну дык ещё раз! В Д4 - оборзел, тьфу ты, обозрел :) всё, что смог! Но ничего не нашёл!


 
sniknik ©   (2005-10-15 14:45) [10]

что за функция BCDDateTimeToStr? и нет ли там же где взял эту другой BCDDateTimeToDateTime?


 
Германн ©   (2005-10-15 18:54) [11]

2 sniknik ©   (15.10.05 14:45) [10]

Не.  BCDDateTimeToStr - это моя собственная.


 
sniknik ©   (2005-10-15 19:47) [12]

> это моя собственная.
aaa... а ошибку значит ищеш в стандартной, проверенной многими и многими  ее использовавшими...
> ... Явно, функция StrToDateTime вызывается только там. Неявные её вызовы ...

========================================
- гражданин, чего это вы тут под фанарем на карачках ползаете?
- да, я там в подворотне десятку потерял, вот ищу...
- чего вы ее здесь ищете? если там потеряли.
- а здесь светлее!


 
Германн ©   (2005-10-16 00:02) [13]

sniknik ©   (15.10.05 19:47) [12]

> > это моя собственная.
> aaa... а ошибку значит ищеш в стандартной, проверенной многими
> и многими  ее использовавшими...
> > ... Явно, функция StrToDateTime вызывается только там.
>  Неявные её вызовы ...

Блин, ну ты и написал. Вопрос то хоть прочёл? Или "как всегда"?

Не ищу я ошибки в стандартной StrToDateTime!
Я ищу Как ёклмн Исключение указанное в сабже вылезло из блока try except end. Кстати в той самой моей функции происходит как раз  преобразование данных в строку.


 
beglec   (2005-10-16 00:47) [14]

это тебе и пытаются объяснить что случаев может быть множетсво и не только тут
но внимательно прочитав суть твоего вопроса и написанный код "запудырил" следующее :)

try
FieldByName("EvDateTime").AsDateTime:=StrToDateTime(BCDDateTimeToStrDt));
except
FieldByName("EvDateTime").AsDateTime:=StrToDateTime("01.01.80 00:00"); шибка здесь
end;

Если шибка в этой строчке то тебе ни один Try Except не поможет - так что разбирайся
проблемы могут быть в следующей
1. в системе Windows используется разделитель [,] вместо [.] - самая распространенная ошибка. сам делаю постоянно.
2. не правильны формат записи даты - может быть первым указывает год и т.д. а 80 дня или месяца не бывает - сам понимаешь
3. скорее всего см. п.1.


 
sniknik ©   (2005-10-16 00:56) [15]

Германн ©   (16.10.05 00:02) [13]
> Не ищу я ошибки в стандартной StrToDateTime!
а где же ты это ищеш? сам то перечитай свой вопрос. или "как всегда" пишем одно, на уме другое?

> Я ищу Как ёклмн Исключение указанное в сабже вылезло из
> блока try except end. Кстати в той самой моей функции происходит
> как раз  преобразование данных в строку.

ну так ёклмн ищи это в своей функции! то что ты ее не приводиш конечно должно нас уверить что она идеальна, и написана безукоризненно....

и кстати покажи мне в вопросе где написано то что написано в [13]. перечитал еше раз и не нашол там ничего о выходе исключения за блок... видать это в прикрепленной телепатограмме.

по ответу, раз непонятно, коментарий кодом (примерный сценарий разумеется)
procedure TForm1.Button1Click(Sender: TObject);
var
 TempDate: TDateTime;

 function BCDDateTimeToStr(dt: TDateTime): string;
 begin
   DateSeparator:= "/";
   result:= DateTimeToStr(dt);
 end;

begin
 try
   TempDate:= StrToDateTime(BCDDateTimeToStr(Now()));
 except
   on EConvertError do
     TempDate:= StrToDateTime("01.01.80 00:00");
 end;
end;

вот это к примеру гарантированно выйдет за блок try except т.к. вызовет двойное исключение сначала в блоке а после в обработке исключения.


 
Германн ©   (2005-10-16 01:37) [16]

2 beglec   (16.10.05 00:47) [14]
2 sniknik ©   (16.10.05 00:56) [15]

Сначала вам обоим. Да обсуждаемая прога написана не очень корректно. Но уж так сложилось исторически. Но в ответе:

> Германн ©   (15.10.05 02:39) [3]
>
> 2 GuAV ©   (15.10.05 02:23) [1]
>
> Запоминать дату тут нет нужды. В тексте исключения приведено:
>  "  ", т.е. пробел.
>
т.е. сообщение об исключении выглядит так
29.09.2005 11:22:23-EConvertError : " " is not a valid date and time
Это запись из лог-файла, который записывается моей программой следущим образом :
procedure TFMain.SaveLog(E: Exception; EStr, PlaceSt: String);  
var
 i : Integer;
 FT : TextFile;
 St : String;
begin
 St:=ChangeFileExt(Application.ExeName,"."+FormatDateTime("yymm",Now)+".log.txt");
 AssignFile(FT,St);
 if FileExists(St) then Append(FT) else ReWrite(FT);
 if E <> nil then begin
   St:=DateTimeToStr(Now)+"-"+ E.ClassName+" : "+E.Message;
   Writeln(FT,St);
 end;
 ... тут следуют некие проверки E.ClassName и особые реакции на некоторые их них

Вы пробовали получить такое сообщение об ошибке при вызове StrToDateTime("01.01.80 00:00") с неправильными DateSeparator или
TimeSeparator? Имхл нет. Поскольку тогда бы сообщение об ошибке выглядело бы так:
29.09.2005 11:22:23-EConvertError : "01.01.80 00:00" is not a valid date and time

Теперь лично к sniknik ©   (16.10.05 00:56) [15]
> а где же ты это ищеш? сам то перечитай свой вопрос. или "как всегда"
пишем одно, на уме другое?

В программе возникает исключение указанное в сабже. Прошерстил исходники идущие с Д4. Нашел, что данное исключение вызывается только в функции StrToDateTime. Прошерстил исходники своей программы.StrToDateTime вызывается только в тех двух случаях, которые указаны в вопросе. (Это я проясняю термин "явный вызов".) Далее прошерстил снова исходники Дельфи на предмет вызова сей функции внутри VCL или RTL. Нашел несколько этих вызовов. Убедился, что они в моей программе не испльзуются. (Это я пояснил термин "неявный вызов".)

Вот поэтому-то "Я ищу Как ёклмн Исключение указанное в сабже вылезло из блока try except end." :(


 
GuAV ©   (2005-10-16 01:54) [17]

Даже не знаю..

Код из [0] был приведен Ctrl+C, Ctrl+V и употреблений только 2  штуки ? Может быть except получился относящимся к другому try...

Точно ли исполняется этот код, а не другая копия ?

Память под строки не затирается (признаком чего м.б. AV и INvalidPointer при выходе) ?


 
Германн ©   (2005-10-16 02:11) [18]

2 GuAV ©   (16.10.05 01:54) [17]

> Код из [0] был приведен Ctrl+C, Ctrl+V и употреблений только
> 2  штуки ? Может быть except получился относящимся к другому
> try...
ДА. Только "Copy&Paste" и "только две штуки".


> Точно ли исполняется этот код, а не другая копия ?
Да.


> Память под строки не затирается (признаком чего м.б. AV
> и INvalidPointer при выходе) ?

Лог-файл, ведение которого я описал в [16] свидетельствует, что ни AV, ни ещё чего нибудь нет. Указанная процедура вызывается в Application.OnException.


 
неважно   (2005-10-16 02:35) [19]


try
                FieldByName("EvDateTime").AsDateTime:=StrToDateTime(BCDDateTimeToStr(Dt));
              except
                FieldByName("EvDateTime").AsDateTime:=Now
              end;


А так? Тоже исключение???


 
неважно   (2005-10-16 02:38) [20]

Кстати,Вы так и не показали проверяете ли Вы формат даты\времени??? Какие настройки в ОС??? Может Вам надо так :

StrToDateTime("01.01.80 00:00 PM"); // или
StrToDateTime("01.01.80 00:00 AM");


 
Германн ©   (2005-10-16 02:44) [21]

2 неважно   (16.10.05 02:35) [19]
А что это меняет в "осмыслении причин сабжа"?


 
Германн ©   (2005-10-16 02:48) [22]

2 неважно   (16.10.05 02:38) [20]

> Кстати,Вы так и не показали проверяете ли Вы формат даты\времени?
> ?? Какие настройки в ОС???

Имхо, на сей вопрос я уже ответил.


 
неважно   (2005-10-16 02:54) [23]

>А что это меняет в "осмыслении причин сабжа"?
Многое. Если [19] выполняется,то ошибка явно в формате.

З.Ы. В конце концов,проверьте Ваш сабж на более поздних версия D.


 
Германн ©   (2005-10-16 03:08) [24]

2 неважно   (16.10.05 02:54) [23]

>>А что это меняет в "осмыслении причин сабжа"?
>Многое. Если [19] выполняется,то ошибка явно в формате.

Ну опять дважды-два! :(
Меня не интересует реализация [19].

>З.Ы. В конце концов,проверьте Ваш сабж на более поздних версия D.
А Вы мне оплатите сию работу? Готов обсудить варианты!


 
неважно   (2005-10-16 03:28) [25]

2 Германн ©   (16.10.05 03:08) [24]
>Меня не интересует реализация [19]
Странно. Да хотя бы просто убедится и все...  сообщить нам результат.

>А Вы мне оплатите сию работу?
А я тут при чем? Я почему предложил...дело в том,что на borland.public.delphi частенько пишут о различных bug-фиксах.Точно помню,что был такой при использовании IBX.Возникал при переводе\установке даты\времени. Как раз на 4!!!

З.Ы. Нельзя быть таким ЗЛЫМ. Что я Вам сделал??? Я просто хотел помочь. Ну Вас...


 
sniknik ©   (2005-10-16 11:19) [26]

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

p.s.
Германн ©   (16.10.05 01:37) [16]
> т.е. сообщение об исключении выглядит так
> 29.09.2005 11:22:23-EConvertError : " " is not a valid date and time
важно, но поздно. (надоело)
пример ошибочного кода который может привести к подобного рода ошибке с пустой датой. "забыта" инициализация всех нужных параметров
procedure TForm1.Button1Click(Sender: TObject);
var
 TempDate: TDateTime;

 function BCDDateTimeToStr(dt: TDateTime): string;
 var
   FormatSettings: TFormatSettings;
 begin
   FormatSettings.DateSeparator:= "/";
   result:= DateTimeToStr(dt, FormatSettings);;
 end;

begin
 try
   TempDate:= StrToDateTime(BCDDateTimeToStr(Now()));
 except
   on EConvertError do
     TempDate:= StrToDateTime("01.01.80 00:00");
 end;
end;

но это конечно не вывалится. т.к. это опять догадка.


 
Германн ©   (2005-10-16 17:15) [27]

2 sniknik ©   (16.10.05 11:19) [26]
Ну хорошо, хорошо допустим, что я ничего не хочу и т.д. и т.п.
Но в чём смысл примера
>  ошибочного кода который может привести к подобного рода
> ошибке с пустой датой
, если он не может в принципе привести к к подобного рода
> ошибке с пустой датой будучи выполненным не под отладчиком?


 
sniknik ©   (2005-10-16 19:09) [28]

смысл? ну если ты не видиш смысла в более точной локализации места глюка... и продолжаеш искать его в стандартной StrToDateTime. вместо поиска своего кода порождающего эту пустую строку. пример подобного кода и был дан.
и естественно он в принципе не приводит такой ситуации потому как это мой код, а предполагается аналог в твоем, а в нем ты принципиально не ищеш. как и не делаеш посоветованных исправлений которые теоретически или вообше исключают глюки перевода строк в дату (BCDDateTimeToDateTime) либо позволяют исключить данный участок кода из "подозреваемых" > неважно   (16.10.05 02:35) [19]

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

хотя иногда и весело...
особенно это
> А Вы мне оплатите сию работу? Готов обсудить варианты!
оплату за поиски глюка в собственном коде требовать? с человека который вам помогает (пытается) абсоолютно бескорыстно... круто. это ШЕДЕВР. достойный занесения в анналы местной ореховой рощи. имхо.


 
Германн ©   (2005-10-16 19:36) [29]

2 sniknik ©   (16.10.05 19:09) [28]

Да я вообще и не думал искать какие-то ошибки в стандартной StrToDateTime!
Я ищу варианты невозможного. Как исключение произощедшее внутри защищённого блока всё-таки вылезло из оного наружу.

Кстати а что это за BCDDateTimeToDateTime, которую ты уже не первый раз указываешь? У меня такой нет!
А если ты про мою BCDDateTimeToStr то вот её текст:

function BCD2Byte(BCD: Byte): Byte;
begin
 BCD2Byte:=(BCD shr 4)*10+(BCD and $0F);
end;

function BCDDateTimeToStr(DT: BCDDateTime): String;
begin
 Result:=LeftPad(IntToStr(BCD2Byte(DT[3])),"0",2)+"."+LeftPad(IntToStr(BCD2Byte(DT[4])),"0",2)+"."+
 LeftPad(IntToStr(BCD2Byte(DT[5])),"0",2)+"   "+LeftPad(IntToStr(BCD2Byte(DT[2])),"0",2)+":"+
 LeftPad(IntToStr(BCD2Byte(DT[1])),"0",2)+":"+LeftPad(IntToStr(BCD2Byte(DT[0])),"0",2);
end;


 
sniknik ©   (2005-10-16 19:47) [30]

> У меня такой нет!
ну так вот и сделай. тогда вообще отпадет надобность в последующем конвертировании.

и я указывал, я спросил
> что за функция BCDDateTimeToStr? и нет ли там же где взял эту другой BCDDateTimeToDateTime?
если ты одну придумал, то значит и другую сможеш. более правильную. т.к. операции с числами от форматов не зависят.


 
Германн ©   (2005-10-16 19:52) [31]

2 sniknik ©   (16.10.05 19:47) [30]

Не ну ты суть вопроса не понял. То что у меня в функцию StrToDateTime передаётся неверная строка это очевидно. С прибора пришла лажа, бывает. Меня то волнует почему происходящее при этом исключение не глушится в защищённом блоке.


 
sniknik ©   (2005-10-16 20:16) [32]

это ты сути ответов не понял. пришла лажа? - обрабатывай! сам генери исключения по этому поводу. не плоди кучи преобразований  которые поотенциально источники глюков. не думай что в обработчике ошибки не может возникнуть другой ошибки, ведь у тебя и там преобразования (OnException тоже касается).
и т.д. ищи глюки в своем коде.
а на try except не греши, не может этого быть, чтобы не глушилось... потоков же у тебя в них нет, насколько код приведен. (если из зашишенного блока вызов потока/сом обьекта, и уже в нем исключение... имхо, это единственная возможность "упустить" исключение из блока)

и кстати. этой "сути" в вопросе нет, только в дополнениях. а это не равнозначно, потому что изначально тебе на другое отвечали.


 
Германн ©   (2005-10-16 20:33) [33]

2 sniknik ©   (16.10.05 20:16) [32]
> не может этого быть, чтобы не глушилось...

(Грустно) Вот и я об том же :(

> ищи глюки в своем коде.
Ищу. Но не нахожу пока.



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

Форум: "Основная";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.037 c
2-1129180521
Timur
2005-10-13 09:15
2005.11.06
MS SQL и Delphi


2-1129544845
lodir
2005-10-17 14:27
2005.11.06
поворот массива


14-1129701752
Rentgen
2005-10-19 10:02
2005.11.06
удаленно(COM1-RS232) запустить программу


11-1110634509
Watcher
2005-03-12 16:35
2005.11.06
Transparent


3-1127453269
Bless
2005-09-23 09:27
2005.11.06
ADOConnection=3 потока?





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