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

Обнуление AnsiString

17.12.2009, 11:24. Показов 2025. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru