Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Запись в Ini-файл


Автор: PROeXT 29.11.2006, 02:48
Проблема такая: с Вашего форума взял пример кодировки/раскодировки строк. Вот он:

Код

Function Codec(Input, Key: PChar): PChar;
Var
 I:Integer;
 J:Integer;
 Tmps:String;
 Text:String;
Begin
 Result:=PAnsiChar('');
 Text:=Input;
 For I:=1 To Length(Text) Do
 Begin
  IF I>Length(Key) Then J:=I Mod Length(Key)  Else J:=I;
  Tmps:=Tmps+Chr((Ord(Text[I])) XOR (Ord(Key[J])));
 End; {For}
 Result:=PChar(Tmps);
end;


Однако, когда я начинаю записывать полученные закодированные строки в файл ini, то в этот файл на самом деле записывается совсем не то. Идет подмена символов. Что самое интересное, делаю вот так:

Код

  Str.Add(Codec(PChar(ConnectSection),PChar(GetCompName))); //0
  ...
  Str.Add(Codec(PChar(ConnectLoginIdent),PChar(GetCompName))); //3
  Str.Add(Codec(PChar(edLogin.Text),PChar(GetCompName)));  //4

  With Ini Do
  Begin
   ....
   WriteString(Str.Strings[0],Str.Strings[3],Str.Strings[4]); //Строка 1
   ShowMessage(ReadString(Str.Strings[0],Str.Strings[3],''));  //Строка 2
  End; {With}


И вот в строке 1 значение Str.Strings[4] не совпадает с тем, что выводит ShowMessage(строка 2). И что самое интересное - ShowMesssage вообще показывает пустую строку!!!
Никто не знает, в чем может быть проблема и как ее можно обойти?

Да, в работе использовалась Delphi 7 Enterprise

Автор: pavelv 29.11.2006, 07:06
Я не спец, но всё-таки ShowMessage возвращает пустую строку скорее всего потому, что в ini файле просто нет таких записей. Тоесть вот такая штука:
ShowMessage(ReadString(Str.Strings[0],Str.Strings[3],'Error')); вернет тебе 'Error'.

Если не хочешь пошагово глянуть все параметры, для теста сделай вот так:
Код

  WriteString(Str.Strings[0],Str.Strings[3],'test string'); //Строка 1    
   ShowMessage(ReadString(Str.Strings[0],Str.Strings[3],'Error'));  //Строка 2

Если ShowMessage покажет 'test string' разбирайся с codec, если 'Error' кидай полный код своих процедур.

Автор: Guedda 29.11.2006, 09:25
В ини файлах все данные записываются только после закрытия файла. Т.е. после IniFile.Free; до этого они хранятся в оперативной памяти. Поэтому делай ShowMessage только после закрытия файла.

Автор: PROeXT 29.11.2006, 09:38
Цитата(pavelv @  29.11.2006,  07:06 Найти цитируемый пост)
Я не спец, но всё-таки ShowMessage возвращает пустую строку скорее всего потому, что в ini файле просто нет таких записей


Так ведь и я  об этом же.

Вот пример: трассирую выполнение. Дохожу до строки кода IniFile.WriteString... Вижу, что будет записываться ветка abcd=jkl. Выполняю. Закрываю прогу. Открываю ini средствами ОС. И что я вижу? Вместо abcd=jkl записано dnjf=eif.

Насчет кода.... Ну так вроде я и так уже весь код практически выложил... Или что-то не хватает?

Автор: Elfebet 29.11.2006, 10:47
Цитата

 With Ini Do
  Begin
   ....
   WriteString(Str.Strings[0],Str.Strings[3],Str.Strings[4]); //Строка 1
   ShowMessage(ReadString(Str.Strings[0],Str.Strings[3],''));  //Строка 2
  End; {With}

 И вот в строке 1 значение Str.Strings[4] не совпадает с тем, что выводит ShowMessage(строка 2). И что самое интересное - ShowMesssage вообще показывает пустую строку!!!


Цитата

В ини файлах все данные записываются только после закрытия файла. Т.е. после IniFile.Free; до этого они хранятся в оперативной памяти. Поэтому делай ShowMessage только после закрытия файла. 


зачем ты делаеш
Код

ShowMessage(ReadString(Str.Strings[0],Str.Strings[3],''));  //Строка 2

если еще не записалось в файл
Код

WriteString(Str.Strings[0],Str.Strings[3],Str.Strings[4]); //Строка 1

Автор: Guedda 29.11.2006, 11:58
Просто сделай так, если уж хочешь посмотреть на содержимое инифайла:
Код

  Str.Add(Codec(PChar(ConnectSection),PChar(GetCompName))); //0
  ...
  Str.Add(Codec(PChar(ConnectLoginIdent),PChar(GetCompName))); //3
  Str.Add(Codec(PChar(edLogin.Text),PChar(GetCompName)));  //4
   ....
   Ini.WriteString(Str.Strings[0],Str.Strings[3],Str.Strings[4]); //Строка 1
   Ini.Free;
   Ini := TIniFile.Create('YourNameIni.ini');
   ShowMessage(ReadString(Str.Strings[0],Str.Strings[3],''));  //Строка 2
  End; {With}

и тогда в ShowMessage появится твои данные.

Автор: PROeXT 29.11.2006, 13:46
Цитата(Guedda @  29.11.2006,  11:58 Найти цитируемый пост)
 тогда в ShowMessage появится твои данные.


Я делал иначе: после окончания работы проги, я делал Ini.Free, а потом открывал файл в проводнике и видел, что то, что туда записалось СУЩЕСТВЕННО ОТЛИЧАЛОСЬ ОТ 

Код

Ini.WriteString(Str.Strings[0],Str.Strings[3],Str.Strings[4]);


По моему мнению, это какая-то ошибка с преобразованием и записью символов в текстовый файл (ведь по сути, ini-файл текстовый, не так ли?)....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)