17 / 17 / 4
Регистрация: 03.12.2009
Сообщений: 103

Обнуление AnsiString

17.12.2009, 11:24. Показов 2012. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru