Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
17 / 17 / 4
Регистрация: 03.12.2009
Сообщений: 103
1

Обнуление AnsiString

17.12.2009, 11:24. Просмотров 1590. Ответов 7
Метки нет (Все метки)


Доброго всем времени суток. Помогите понять/разобраться как так происходит. Есть собственный класс A для работы с ini файлом со статическими переменными типа AnsiString и int

C++
1
2
3
4
5
6
7
8
class A
{
  public:
  static AnsiString x;
  ----------
  static int y;
  ----------
}
В конструкторе главной формы происходит чтение ini файла и заполнение всех полей класса A.
В процессе выполнения программы поля класса A могут изменяться.
В деструкторе главной формы происходит сохранение полей класса А в тот же ini файл.
Но!!! При отладке я вижу, что все AnsiStringи заполнены значением NULL, в то время как intы - с корректным значениями. До входа в деструктор главной формы (Application->Run(); - отработал) - все поля заполнены нормально. Что за дела??
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.12.2009, 11:24
Ответы с готовыми решениями:

обнуление AnsiString
Всем привет! Что-то я столкнулся с проблемой при обнуление AnsiString есть такое AnsiString...

Как перевести текст из AnsiString (в формате UTF8) в AnsiString формата Windows-1251?
Поиск по форуму не решил текущую проблему: 1. Есть текст в формате UTF-8 в величине: AnsiString...

Ansistring -> string
Собственно, проблема в том, что мне нужно использовать сишную строку, но в Edit->Text она хранится...

Переменная AnsiString
Как можно занести в переменную типа AnsiString текст с кавычками? Вот так выдает ошибку:...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
7
Программист TH
290 / 145 / 12
Регистрация: 06.01.2009
Сообщений: 537
17.12.2009, 17:54 2
До входа в деструктор главной формы (Application->Run(); - отработал) - все поля заполнены нормально. Что за дела??
Понятно, дык тогда и деструктор для чего тогда?
0
17 / 17 / 4
Регистрация: 03.12.2009
Сообщений: 103
17.12.2009, 18:06  [ТС] 3
Так деструктор главной формы. А ломается объект для работы с ini файлом, который в этой форме объявлен. Он должен ломаться после выхода из деструктора, но не перед ним.

Пример:
A.h
C++
1
2
3
4
class A
{
   B *b;
}
A.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
А::A()
{
  b = new B();
}
 
A::~A
{
  b еще живой.
  delete b; b = NULL;
  b уже не живой
}
а у меня уже при входе в деструктор - плохо ((
0
Программист TH
290 / 145 / 12
Регистрация: 06.01.2009
Сообщений: 537
17.12.2009, 20:45 4
Показывай полный код твоего примера
0
17 / 17 / 4
Регистрация: 03.12.2009
Сообщений: 103
18.12.2009, 11:25  [ТС] 5
TrBaseIni.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//------------------------------------------------------------------------------
#ifndef TrBaseIniH
  #define TrBaseIniH
//------------------------------------------------------------------------------
#include <vcl.h>
//------------------------------------------------------------------------------
class TrBaseIni//: public TIniFile
{
  private:
    AnsiString iniName;
    
  public:
    TrBaseIni() {}
    TrBaseIni(AnsiString _iniName);
 
    static AnsiString mailPath;    // путь к почтовому каталогу)
    static AnsiString logPath;     // полный путь к лог-файлу
    static int timeout;            // таймаут приема
 
    bool Read();
    void Write();
};
//------------------------------------------------------------------------------
#endif
TrBaseIni.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//------------------------------------------------------------------------------
#include <Inifiles.hpp>
#include "TrBaseIni.h"
//------------------------------------------------------------------------------
AnsiString TrBaseIni::mailPath;
AnsiString TrBaseIni::logPath;
int    TrBaseIni::timeout = 0;
//------------------------------------------------------------------------------
TrBaseIni::TrBaseIni(AnsiString _iniName)//: TIniFile(_iniName)
{
  iniName = _iniName;
}
//------------------------------------------------------------------------------
bool TrBaseIni::Read()
{
  TIniFile *iniFile;
  iniFile = new TIniFile(iniName);
 
  mailPath = iniFile->ReadString("Mail", "Path", "_");
  logPath  = iniFile->ReadString("Log", "path", "_");
  timeout  = iniFile->ReadInteger("Transport", "Timeout", 5000);
 
  return true;
}
//------------------------------------------------------------------------------
void TrBaseIni::Write()
{
  TIniFile *iniFile;
  iniFile = new TIniFile(iniName);
 
  iniFile->WriteString ("Mail",      "Path",    mailPath);
  iniFile->WriteString ("Log",       "Path",    logPath);
  iniFile->WriteInteger("Transport", "Timeout", timeout);
}
//------------------------------------------------------------------------------
ServForm.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//---------------------------------------------------------------------------
#ifndef ServFormH
#define ServFormH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include <memory>
#include "TrBaseIni.h"
//---------------------------------------------------------------------------
class TfrmServer : public TForm
{
__published:    // IDE-managed Components
  TRichEdit *reLog;
  TPanel *pBottom;
  TPanel *pButtons;
private:    // User declarations
  std::auto_ptr<TrBaseIni> ini;
 
public:     // User declarations
  __fastcall TfrmServer(TComponent* Owner);
  __fastcall ~TfrmServer();  
};
//---------------------------------------------------------------------------
extern PACKAGE TfrmServer *frmServer;
//---------------------------------------------------------------------------
#endif
ServForm.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#include "ServForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmServer *frmServer;
//---------------------------------------------------------------------------
__fastcall TfrmServer::TfrmServer(TComponent* Owner)
  : TForm(Owner)
{
  ini.reset(new TrBaseIni(".\\file.ini"));
  ini->Read();
 
  //TrBaseIni::mailPath  имеет значение, которое прочитал;
  //TrBaseIni::logPath имеет значение, которое прочитал;
  //TrBaseIni::logPath имеет значение, которое прочитал;
  
}
//---------------------------------------------------------------------------
__fastcall TfrmServer::~TfrmServer()
{
  //TrBaseIni::mailPath  имеет значение NULL;
  //TrBaseIni::logPath имеет значение NULL;
  //TrBaseIni::logPath имеет значение, которое прочитал;
  ini->Write();
}
//---------------------------------------------------------------------------

Это не совсем то, что у меня (все урезано до минимума), но и этот кусок не работает, если его вставить в пустой проект.
0
53 / 49 / 9
Регистрация: 16.05.2008
Сообщений: 162
18.12.2009, 13:38 6
kdv, программируй события формы OnCreate и OnClose вместо конструктора и деструктора. И будет тебе счастье.

P.S. в теле класса TrBaseIni ты дважды память выделяешь и ни разу не освобождаешь.
0
17 / 17 / 4
Регистрация: 03.12.2009
Сообщений: 103
18.12.2009, 14:04  [ТС] 7
Цитата Сообщение от BornLeader Посмотреть сообщение
kdv, программируй события формы OnCreate и OnClose вместо конструктора и деструктора. И будет тебе счастье.
Так давно уже сделал и получил свое счастье! Но интересно же разобраться почему первоначальный способ не работает.

Цитата Сообщение от BornLeader Посмотреть сообщение
kdv,
P.S. в теле класса TrBaseIni ты дважды память выделяешь и ни разу не освобождаешь.
Это пример сделанный на коленях на скорую руку. В моей реальной проге несколько по-другому и все красиво, все освобождается
0
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
18.12.2009, 16:56 8
Цитата Сообщение от kdv Посмотреть сообщение
Но интересно же разобраться почему первоначальный способ не работает
Потому что в начале вызывается деструктор static AnsiString'а. Если Вы замените AnsiString на тот же int - Вы будете иметь возможность лицезреть его и в деструкторе формы.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2009, 16:56

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Массив AnsiString**
Здравствуйте, есть вопрос: Почему при попытке удалить динамический массив AnsiString** возникает...

Из vector в AnsiString
Здравствуйте, перевожу из десятичного числа в двоичное, требуется вывести результат в Edit1-&gt;Text ...

float to ansistring
void __fastcall TFKoef::ConcCLChange(TObject *Sender) { lbKoefCL-&gt;Caption = ...

AnsiString vs Caption
в затыке - код наотрез отказывается работать void __fastcall TForm1::BClick(TObject *Sender) {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.