Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2014, 00:35   #1
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
Вопрос Вытаскивание строк из Stringtable.ini

Код:
 var i:Integer;
       stbuff:string;
if OpenDialog1.Execute then
 begin

  multipleIni:=TIniFIle.Create(OpenDIalog1.FileName);
  justOpened:=OpenDIalog1.FileName;
Cleared.Delimiter:=';';
//Cleared.NameValueSeparator:='';
Cleared.StrictDelimiter:=True;
buffered.LoadFromFile(OpenDIalog1.FileName);
ProgressBar1.Max:=buffered.Count-1;

ProgressBar1.Visible:=True;
 for I := 0 to buffered.Count-1 do
  begin
   Caption:=IntToStr(i);
 Cleared.Clear;
 Cleared.DelimitedText:=multipleini.readString('LocAdmin_Strings',schmutzige.Strings[i],'-');
   if SpinEdit2.Value>cleared.Count then
    Continue;
    stbuff:=cleared.Strings[spinedit2.Value];
  if spinedit2.Value<cleared.Count then
  NewTxt(schmutzige.Strings[i],stbuff);
  ProgressBar1.Position:=I;
строчки располагаются в файле примерно так:
Цитата:
[LocAdmin_Languages]
Languages=English;Italian;French;Ge rman;Spanish;Czech;Hungarian;Polish ;Russian;TRC
CurrentLanguage=English
CurrentRevision=0
[LocAdmin_Strings]
ATTRIB_ALC=Alchemy;;Alchimia;;Alchi mie;;Alchemie;;Alquimia;;Alchymie;; Alkímia;;Alchemia;;Алхимия;;煉金術;
ATTRIB_DEX=Hunting skill;;Abilità nella caccia;;Compétence de chasse;;Jagdgeschick;;Habilidad de caza;;Lov;;Vadászat;;Zdolności łowieckie;;Ловкость;;狩獵技能;
ATTRIB_HP=Life energy;;Energia vitale;;Énergie vitale;;Lebensenergie;;Energía vital;;Životy;;Életerő;;Energia życiowa;;Жизненная энергия;;生命能量;
ATTRIB_HPMax=Max. life energy;;Energia vitale massima;;Vitalité maximale;;Max. Lebensenergie;;Energía vital máxima;;Max. životy;;Max életenergia;;Maks. Siły życiowej;;Максимальная жизнен. энергия;;最大生命能量;
ATTRIB_INT=Ancient knowledge;;Antica conoscenza;;Savoir des Anciens;;Altes Wissen;;Conocimiento antiguo;;Znalosti Prastarých;;Ősi tudás;;Prastara wiedza;;Древнее знание;;遠古知識;
при попытке считать строчки на русском ListIndex out of Bounds (9)

при начале изьятия строк, есть несоовтетсвие отображаемого языка и его номера к реальным строкам, например немецкий идет 4м тоесть цыфра 3, реально немецкие ситрочки извлекаются при значение спин эдита = 7, при этом при прокрутке больше 6 постоянно ошибка об выходе индекса из "боундс"
Код:
procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
   Begin
   multipleIni:=TIniFIle.Create(JustOpened);
Cleared.Delimiter:=';';
Cleared.StrictDelimiter:=True;

 Cleared.Clear;
 Cleared.DelimitedText:=multipleini.readString('LocAdmin_Languages','Languages','unknown');
  if  (SpinEdit2.Value<Cleared.Count) then
 CurrLang:=Cleared[spinedit2.Value];
 Caption:= CurrLang;

   End;
Вложения
Тип файла: rar Textes.rar (112.6 Кб, 10 просмотров)
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.

Последний раз редактировалось HellMercenariess; 19.06.2014 в 00:48. Причина: архив с проэктом и текстовыми файлами
HellMercenariess вне форума Ответить с цитированием
Старый 19.06.2014, 05:52   #2
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Меня иероглифы смущают, я бы переписал код на TMemIniFile, чтобы явно указывать чем файл закодирован. Например:
TMemIniFile.Create(filename, TEncoding.UTF8);
PS: Обратил внимание, что ini-файл больше 64кб - это тоже повод отказаться от TIniFIle, который не умеет работать с большими файлами.

Последний раз редактировалось StriderX; 19.06.2014 в 06:10.
StriderX вне форума Ответить с цитированием
Старый 19.06.2014, 07:34   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

По-моему StringList так и не научился работать с юникодом. Как бы там ни было у меня тоже не получалось японские тексты прочитать в переменную этого типа, как бы я не конвертировал.
Цитата:
HellMercenariess
Если просто получить строку multipleini.readString('LocAdmin_La nguages','Languages','unknown'); и вывести ее в какой нить Эдит или посмотреть в отладке - значения там все будут на месте?

есть возможность разделить строки на разные ключи, чтоб не было ";" ?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.06.2014, 07:56   #4
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
По-моему StringList так и не научился работать с юникодом. Как бы там ни было у меня тоже не получалось японские тексты прочитать в переменную этого типа, как бы я не конвертировал.
Проспал момент, когда всё поголовно в дельфях было дописано под TEncoding, но суть в том, что практически все методы работы с файлами имеют overload вариант куда его надо передать.
TStrings.LoadFromFile соответственно тоже может его использовать.
StriderX вне форума Ответить с цитированием
Старый 19.06.2014, 08:05   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
TStrings.LoadFromFile соответственно тоже может его использовать.
Так в том то и проблема что ТС данные не из файла загружает
Я кагбэ не совсем правильно выразился - мне не удалось работать если данные берутся из другой переменки, или считываются из базы. По поводу загрузки да там можно кодировку указать.
А вообще надо в хелпе Эмбаркадэро глянуть есть ли у StringList отдельное свойство для указания кодировщика.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.06.2014, 08:12   #6
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Так в том то и проблема что ТС данные не из файла загружает
Я кагбэ не совсем правильно выразился - мне не удалось работать если данные берутся из другой переменки, или считываются из базы. По поводу загрузки да там можно кодировку указать.
А вообще надо в хелпе Эмбаркадэро глянуть есть ли у StringList отдельное свойство для указания кодировщика.
Это меня запутывает. Условно можно считать String нейтральным форматом. StringList работает с нейтралью, что ей скормят, то там и будет. Она и не должна отвечать за кодирование. Если данные пришли из базы, значит их надо предварительно привести к нейтральному формату (с помощью того же энкодера - он же просто с байтами работает).
Ну то есть, сам энкодер - это и есть отдельный кодировщик для StringList, в моём понимании.
StriderX вне форума Ответить с цитированием
Старый 19.06.2014, 11:38   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Условно можно считать String нейтральным форматом.
Вот собственно он в последних юникодных делфи как-то плавает. Я уже и сам толком не пойму как там устроена работа с юникодом, поэтому везде где есть такая необходимость стараюсь использовать ansistring.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.06.2014, 12:35   #8
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Вот собственно он в последних юникодных делфи как-то плавает. Я уже и сам толком не пойму как там устроена работа с юникодом, поэтому везде где есть такая необходимость стараюсь использовать ansistring.
По факту там строка с фиксированными двумя байтами на символ. По работе постоянно с RAW приходится иметь дело, никаких проблем с кодировками туда-сюда не было.
С другой стороны, если невнимательно писать код, то можно очень часто залетать на сужающих преобразованиях (это implicit касты когда происходят) - они будут производиться согласно выставленным настройкам локали (они в свою очередь по-умолчанию выставятся исходя из настроек ОС).
StriderX вне форума Ответить с цитированием
Старый 20.06.2014, 23:58   #9
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию

Немного переделал

Код:
multipleIni:=TmemIniFIle.Create(OpenDIalog1.FileName,TEncoding.UTF8);
  justOpened:=OpenDIalog1.FileName;
Cleared.Delimiter:=';';
Cleared.StrictDelimiter:=True;
buffered.LoadFromFile(OpenDIalog1.FileName);

 for I := 0 to schmutzige.Count-1 do
  begin
 Cleared.Clear;
 Cleared.DelimitedText:=multipleini.readString('LocAdmin_Strings',schmutzige.Strings[i],'-');
   Hinter.Clear;
  for Ix := 0 to cleared.Count - 1 do
    begin
     Hinter.Items.Add(cleared[ix]);
    stbuff:=cleared.Strings[ix];
  NewText(schmutzige.Strings[i],stbuff,ix);
    end;
Код:
procedure NewText(FullNomo:string; Text:string; Numer:integer);
 var
   f: Textfile;
    TmpFile:string;
 begin

  try
   TmpFile:='E:\Russ\Folder'+IntToStr(numer)+'\'+FullNomo;
   AssignFile(f,TmpFile);
   ReWrite(f);

   write(f, #$EF+#$BB+#$BF);
   Writeln(f,UTF8Encode(Text));

   Closefile(f); 
    finally
 end;
 end;
Содержимое папок:
Цитата:
Folder0
English
Folder1
<Empty>
Folder2
Insegnami a produrre delle frecce avvelenate.
Folder3
<Empty>
Folder4
Apprends-moi à fabriquer des flèches empoisonnées !
Folder5
<Empty>
Folder6
Zeig mir, wie ich Giftpfeile herstellen kann. (German)
Folder7
<Empty>
Folder8
Enséñame a fabricar flechas venenosas.
Folder9
<Empty>
Folder10
Ukaž mi, jak vyrobit otrávené šípy.
Folder11
<Empty>
Folder12
Mutasd meg, hogyan tudok mérgezett nyilakat készíteni!
Folder13
<Empty>
Folder14
Pokaż mi, jak produkować zatrute strzały.
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.
HellMercenariess вне форума Ответить с цитированием
Старый 21.06.2014, 00:05   #10
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию

Создал еще 2 папки 15 и 16
Folder16
Цитата:
Чтобы вернуть себе человеческий облик, нажмите ENTER или просто подождите, пока действие магии не закончится.
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.
HellMercenariess вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вытаскивание строк из одного листа на другой. Sorgan Microsoft Office Excel 7 04.12.2013 17:25
if Pos(Readstring... двух строк .ini файла, как? FleXik Общие вопросы Delphi 2 14.07.2013 13:07
Программное комменирование/раскомментирование строк в INI Человек_Борща Общие вопросы Delphi 9 15.08.2010 18:03
Как записывать и считывать Ini File с набором строк (#10#13) в одном параметре?) SkAndrew Общие вопросы Delphi 4 15.11.2008 00:02