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

Обнуление AnsiString

17.12.2009, 11:24. Показов 2005. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.12.2009, 11:24
Ответы с готовыми решениями:

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

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

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

7
Программист TH
 Аватар для DanUnited
292 / 147 / 12
Регистрация: 06.01.2009
Сообщений: 537
17.12.2009, 17:54
До входа в деструктор главной формы (Application->Run(); - отработал) - все поля заполнены нормально. Что за дела??
Понятно, дык тогда и деструктор для чего тогда?
0
17 / 17 / 4
Регистрация: 03.12.2009
Сообщений: 103
17.12.2009, 18:06  [ТС]
Так деструктор главной формы. А ломается объект для работы с 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
 Аватар для DanUnited
292 / 147 / 12
Регистрация: 06.01.2009
Сообщений: 537
17.12.2009, 20:45
Показывай полный код твоего примера
0
17 / 17 / 4
Регистрация: 03.12.2009
Сообщений: 103
18.12.2009, 11:25  [ТС]
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
54 / 50 / 9
Регистрация: 16.05.2008
Сообщений: 162
18.12.2009, 13:38
kdv, программируй события формы OnCreate и OnClose вместо конструктора и деструктора. И будет тебе счастье.

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

Цитата Сообщение от BornLeader Посмотреть сообщение
kdv,
P.S. в теле класса TrBaseIni ты дважды память выделяешь и ни разу не освобождаешь.
Это пример сделанный на коленях на скорую руку. В моей реальной проге несколько по-другому и все красиво, все освобождается
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
18.12.2009, 16:56
Цитата Сообщение от kdv Посмотреть сообщение
Но интересно же разобраться почему первоначальный способ не работает
Потому что в начале вызывается деструктор static AnsiString'а. Если Вы замените AnsiString на тот же int - Вы будете иметь возможность лицезреть его и в деструкторе формы.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.12.2009, 16:56
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru