Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Не получается работа с INI файлом  (Прочитано 19741 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Nevis
Гость
« : 03-05-2005 07:16 » 

Привет знатокам С++ Builder`а  Вот такой я вот
К Вам вопрос коллеги:
Хочу понять как мне записать и считать данные из ini файла. Круто!
Беру за основу пример из хелпа билдера, без каких либо изменений пихаю к себе в код и получаю ответ компилятора, пошел я на .... и т.д.  Здесь была моя ладья...
Вот
Код:
TIniFile *ini;
  ini = new TIniFile( ChangeFileExt( Application->ExeName, ".INI" ) );
  Top     =  ini->ReadInteger( "Form", "Top", 100 );
  Left    =  ini->ReadInteger( "Form", "Left", 100 );
  Caption =  ini->ReadString( "Form", "Caption",
                              "Default Caption" );
  //ini->ReadBool( "Form", "InitMax", false ) ?
        WindowState = wsMaximized :
        WindowState = wsNormal;
  delete ini;
Далее следует ответ компилятора при подключении inilib.h:
Код:
nmsupp.h  Declaration syntax error
Плюс ссылка на строку из этого файла:
Код:
extern LPEXPRESSION         WINAPI InitializeExpression(LPEXPRESSION Expression);

Скажите пожалуйста, у кого-нибудь есть предложения? или комменты по данной теме.
Буду рад, если кто-нибудь оставит мне кусок рабочего кода, мне важно узнать как обстаят здесь дела с синтаксисом и т.д.
Позарез надо сделать, бьюсь уже битый час - все бестолку
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #1 : 03-05-2005 09:14 » 

я вроде "inifiles.hpp" подключал и проблем не было... т.е.

Код:
#include <IniFiles.hpp>
« Последнее редактирование: 03-05-2005 09:18 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
direktorSan
Удачи!
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 03-05-2005 09:18 » 

У меня, собственно, проблем с INI-файлами не возникало (в CB 5.0).
Единственное, что могу посоветовать, подключить не inilib.h, а, насколько я помню, *.hpp файл. (В общем в хелпе в примерах посмотреть надо какой файл подключается)
Но если до вечера терпит, то вечером скину рабочий код.
Записан
Nevis
Гость
« Ответ #3 : 03-05-2005 11:21 » 

Чтение освоил, всем спасибо, а запись не дается!
Не подскажите в чем беда?

Мой ini файл имеет структуру:
Код:
[FirmP]

Block=0

[FirmV]

Block=0

[FirmS]

Block=1

[FirmC]

Block=0

Код куска программы такой:
Код:
void LockDay(char *Sector)
{
int Block = 0;
TIniFile *ini;
ini = new TIniFile("J:\\Graph3\\data.ini");
ini->WriteInteger( Sector, "Block", 1);
  if (Block == 1)
   {Form2->BitBtn8->Enabled = false;
    Form2->BitBtn9->Enabled = false;
    Form2->BitBtn10->Enabled = false;}
  else
   {Form2->BitBtn8->Enabled = true;
    Form2->BitBtn9->Enabled = true;
    Form2->BitBtn10->Enabled = true;}
delete ini;
}
void __fastcall TForm3::Edit1KeyPress(TObject *Sender, char &Key)
{
if (Key==char(13))
{
if (Form3->Edit1->Text == "3038544")
 {
 if (Form2->Edit2->Text == "F")
  {
  if (Form2->Edit3->Text == "P")
   {LockDay("FirmP");}
  else
   {
   if (Form2->Edit3->Text == "V")
    {LockDay("FirmV");}
   else
     {
     if (Form2->Edit3->Text == "S")
      {LockDay("FirmS");}
     else
       {
       if (Form2->Edit3->Text == "C")
        {LockDay("FirmC");}
       else
         {
         if (Form2->Edit3->Text == "Y")
          {LockDay("FirmY");}
         else
           {
           if (Form2->Edit3->Text == "U")
            {LockDay("FirmU");}
           else
             {
             if (Form2->Edit3->Text == "W")
              {LockDay("FirmW");}
  }}}}}}}
  Form3->Close();
 }
else
 {ShowMessage("Ну если не знаешь пароль, чего суешь нос?");
 Form3->Close();}
}
}

Хотел получить следующее, в эдитах буквы P/V/S/C/Y/U/W
В зависимости от буквы надо менять значение Block c нуля на единицу, в определенном контейнере. Какой контейнер - видно из цепочки if`ов, при верно набранном парроле 3038544.
То есть если пароль набран верно, то читаю на другой форме, какая буква содержится в эдите, и от этого меняю в определенном sector значение block
Соответственно сектор должен принимать значения "FirmP", "FirmV", "FirmS" и т.д.
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #4 : 03-05-2005 11:29 » 

и что именно не работает? Кстати, у тебя Block всегда 0 - зачем делать проверку, что он может быть 1?
Записан

Удачного всем кодинга! -=x[PooH]x=-
Nevis
Гость
« Ответ #5 : 03-05-2005 11:51 » 

он у меня не всегда 0
прога читает ини файл, определенный сектор, FirmP например.в нем block может быть равен 0 а может и единице.
сейчас у меня программа читает ини файл и в зависимости от того чему равен block выполняет свою функцию, но изменять то у меня пока и не получается этот block c нуля на единицу
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #6 : 03-05-2005 11:57 » 

Код:
int Block = 0; -- BLOCK =0 !!!!!!!!!!!!!!! Всегда
TIniFile *ini;
ini = new TIniFile("J:\\Graph3\\data.ini");
ini->WriteInteger( Sector, "Block", 1); -- ЗДЕСЬ НЕ ЧИТАЕТСЯ А _ПИШЕТСЯ_ INI-ФАЙЛ
-- ПРИ ЭТОМ ЗНАЧЕНИЕ Block _НЕ_ ИЗМЕНЯЕТСЯ
  if (Block == 1)
   {Form2->BitBtn8->Enabled = false;
    Form2->BitBtn9->Enabled = false;
    Form2->BitBtn10->Enabled = false;}
  else
   {Form2->BitBtn8->Enabled = true;
    Form2->BitBtn9->Enabled = true;
    Form2->BitBtn10->Enabled = true;}
delete ini;

я так понимаю,  сначала надо прочитать, а потом изменить т.е.
Код:
TIniFile *ini;
ini = new TIniFile("J:\\Graph3\\data.ini");
int Block = ini->ReadInteger( Sector, "Block", 0);
  if (Block == 1)
   {Form2->BitBtn8->Enabled = false;
    Form2->BitBtn9->Enabled = false;
    Form2->BitBtn10->Enabled = false;
    ini->WriteInteger( Sector, "Block", 0);
}
  else
   {Form2->BitBtn8->Enabled = true;
    Form2->BitBtn9->Enabled = true;
    Form2->BitBtn10->Enabled = true;
    ini->WriteInteger( Sector, "Block", 1);
}
delete ini;
Код:
« Последнее редактирование: 03-05-2005 11:59 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
Nevis
Гость
« Ответ #7 : 03-05-2005 12:21 » 

нет
но все равно спасибо что ткнули носом
вот что надо:

Код:
void LockDay(char *Sector)
{
 TIniFile *ini;
 ini = new TIniFile("J:\\Graph3\\data.ini");
 ini->WriteInteger( Sector, "Block", 1);
 delete ini;
}

надо просто заменить в нужном секторе 0 на 1
а он не хочет этого делать
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #8 : 03-05-2005 13:04 » 

на что-нибудь ругается?
Записан

Удачного всем кодинга! -=x[PooH]x=-
direktorSan
Удачи!
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 03-05-2005 17:11 » new

Вот кусок рабочего кода:

    FullINIPath = ExtractFilePath(Application->ExeName) + "\\" + Application->Title + ".ini";
    Created = !FileExists(FullINIPath);
    //если файла не было - он будет создан
    //если файл был - он будет открыт
    IniDataFile = new TIniFile (FullINIPath);
    if (Created == true)
      {
        IniDataFile->WriteString("NumberMask", "Prefix", "");
        IniDataFile->WriteString("NumberMask", "PRSeparator", "");
        IniDataFile->WriteString("NumberMask", "Root", "");
        IniDataFile->WriteString("NumberMask", "RSSeparator", "");
        IniDataFile->WriteString("NumberMask", "Suffix", "");
        IniDataFile->WriteString("OrdersFolder", "Path", "");
        IniDataFile->WriteString("AddFilesAndFolders", "CommonFiles", "");
        IniDataFile->WriteString("AddFilesAndFolders", "CommonFolders", "");
      };
Это запись строк.
Или еще один с записью числовых параметров

      TIniFile *OptIni = new TIniFile (ExtractFilePath(Application->ExeName) + "\\" + Application->Title + ".ini");
      OptIni->WriteInteger("Recycled", "Атрибуты", 0);
      OptIni->WriteInteger("Recycled", "Запросы", 0);

Все 100%-но рабочее, т.к. писалось буквально месяц назад и отдавалось заказчику без проблем.
Записан
direktorSan
Удачи!
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 03-05-2005 17:15 » 

И еще дополнение.
У тебя описание функции такое:

void LockDay(char *Sector)

А, насколько я помню, функции INI-класса работают с AnsiString-ами. Т. е. надо

void LockDay(AnsiString Sector)

Проверь. Должно заработать.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines