Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Проблема с ini


Автор: popapo 29.2.2008, 15:03
Суть в том что с помощью опен диалога выбрать файл, а его путь записать в Edit
Потом я сохраняю в ini при onclose формы

Код

WritePrivateProfileSection("Options","","./settings.ini");
AnsiString dirf;
dirf = test2->Text;
WritePrivateProfileString("Options","file",(AnsiString () +dirf).c_str(),"./settings.ini");


но он не записывает, всё остальное записывает, а это нет, что делать?

Автор: Sharkfire 29.2.2008, 15:52
Цитата(popapo @  29.2.2008,  15:03 Найти цитируемый пост)
(AnsiString () +dirf).c_str()

чо за интересная конструкция )))
возможно ты имел ввиду:
Код

..AnsiString (dirf).c_str()..

Автор: popapo 29.2.2008, 15:58
Sharkfire, всё равно не записывает :( может из за того что в пути содержиться "\" ?

Автор: popapo 29.2.2008, 17:57
а можно ли какнибудь через масив записать?

Автор: UniBomb 29.2.2008, 18:08
Сразу бросается в глаза то, что в первом вызове функции WritePrivateProfileSection всего три параметра, хотя должно быть четыре. Во-вторых "" (это второй параметр в первом вызове) недопустим, т.к. :

Цитата

If this parameter is NULL, the entire section, including all entries within the section, is deleted.
[Platform SDK: Windows System Information]


Дальше. (AnsiString () +dirf).c_str() - это преобразование AnsiString к char*? Если да, то хватит просто dirf.c_str().


ЗЫ. Есть у борладна ещё класс TIniFile, с которым как мне кажеться намного удобней работать, так как он может записывать и считывать не только строки, но и числа (в т.ч. и вещественные).....

Автор: popapo 29.2.2008, 18:55
написал 

Код

AnsiString dirf;
dirf = Edit2->Text;
TIniFile *Ini = new TIniFile("./settings.ini");
Ini->WriteString("Options", "file",dirf);


тоже самое

Автор: Sharkfire 29.2.2008, 19:16
Ини файл лучьше всегда указыватьь полный путь !!!! Я тоже намучался пока взял за правило.
Код

....
String MyPath;
.....
MyPath = ExtractFilePath(Application->ExeName);
...
TIniFile *Ini = new TIniFile(MyPath+"settings.ini");

Автор: popapo 29.2.2008, 19:25
Sharkfire, работает! спасибо большое!  smile 

Автор: popapo 1.3.2008, 11:33
А  нет, пробема осталась.
Когда выбираешь путь и выходиш, то он его сохраняет.
А когда вместе с ним выбираешь ещё где то какие то значения которые тоже должны сохраниться, то и путь и значения не сохраняются.
А когда путь сохранён и ты запустил программу, то после выбора других значений пропадает и путь и они.

Автор: popapo 1.3.2008, 12:11
Я посмотрел, он сохраняет путь к файлу, а всё другое не сохраняет, после закрытия в ini записывается токо 

Код

[Options]
[Menu]
[srcds]
filedir=D:\games\server\server.exe


а если не указывать путь, то всё нормально
Код

[Options]
console=-1
LAN=-1
bot=-1
ProcesClass=1
PORT=
update=0
ADDIP=0
NAME=
IPADRESS=
[Menu]
SevOp=1
AutoRanProg=0
AutoRanServ=0
UPdatePROG=0
[srcds]
filedir=

Автор: 586 1.3.2008, 14:38
Что возвращает функция WritePrivateProfileString и GetLastError после неё? Попробуй поискать незаписанные параметры в реестре (они туда как-то умудряются попасть).

Автор: popapo 1.3.2008, 15:48
GetLastError показывает 0. 
А можно как то с txt считать в Edit ?

Автор: popapo 1.3.2008, 16:23
Прям заговорённый Edit какой то, даже когда в txt записывет значение, тоже самое происходит.

Автор: popapo 1.3.2008, 16:45
А вот если с клавы вводить в Edit, то всё прекрасно сохраняется.

Автор: 586 1.3.2008, 16:47
Так трудно что-либо сказать. Выкладывай код, и более полный, и то, как получаешь значения записываемых переменных.

Автор: popapo 1.3.2008, 16:57
Открытие
Код

void __fastcall TForm1::Button5Click(TObject *Sender)
{
OpenDialog2->Execute();
String dir2;
dir2 = OpenDialog2->FileName;
Edit2->Text = dir2;
}


Запись в ini при выходе

Код

String dirf;
dirf = Edit2->Text;

String MyPath;
MyPath = ExtractFilePath(Application->ExeName);

TIniFile *Ini = new TIniFile(MyPath+"settings.ini");
Ini->WriteString("srcds", "filedir",dirf);


эта фигня из за OpenDialog, в другом месте у меня тоже из него значение берётся, и тоже самое происходит.


Автор: 586 1.3.2008, 17:09
Да вроде всё работает...
Код
void __fastcall TForm1::Button5Click(TObject *Sender)
{
    if(OpenDialog2->Execute()) Edit2->Text = OpenDialog2->FileName;
}

Код
TIniFile *Ini = new TIniFile(ExtractFilePath(Application->ExeName)+"settings.ini");
Ini->WriteString("srcds", "filedir", Edit2->Text);
//...
delete Ini;

Автор: popapo 1.3.2008, 17:31
нашл в чём проблема, другие настройки я таки способом записывал просто.

Код

WritePrivateProfileString("Menu","SevOp",(AnsiString () +sevop).c_str(),"./settings.ini");


из за этого не хотели работать.

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