Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Пропадает значения переменных


Автор: GraNit 20.10.2007, 11:17
Здравствуйте, уважаемые господа!
Мне "по наследству" досталась одна программа. Написали ее на CBuilder3. Использует не стандартные компоненты. Пробую перенести ее на Builder5. Вот вроде все нормально, при компиляции нет ошибок, НО!!! пропадают значения переменных объявленных в public-е. Переменные разных типов. Одни зачения беруться из ini файла, а рабочая дата назначается при загрузке (вибирается  календарем). Что интересно, до метода show() все значения на месте, а после того как отображается форма, все значения равны NULL или 0. Форма для печати выходит так же пустая, она формируется в самой программе. Еще, открытие формы стала происходить в течении 20 секунд. Очень долго. Программа работает, не дает никаких ошибок. Полдергейст какой-та  smile 
Что происходит, я не понимаю. Прошу помощи.

Автор: Fazil6 20.10.2007, 11:54
Цитата(GraNit @  20.10.2007,  11:17 Найти цитируемый пост)
Что происходит, я не понимаю. Прошу помощи.

в коде ошибки. Что тут непонятного?

Автор: GraNit 22.10.2007, 05:36
Fazil6, Вы видать человек опытний, подскажите мне, пожалуйста:
почему конструктор ANSIString вызывается после присвоения переменным значения? Я присваиваю значения переменным в FormOnCreate. Значит мне лучше переместить все хотя бы в OnActivate, когда все готово для отображения?

Автор: Lazin 22.10.2007, 07:27
Цитата(GraNit @  22.10.2007,  05:36 Найти цитируемый пост)
почему конструктор ANSIString вызывается после присвоения переменным значения

либо вызывается конструктор копирования для строки, либо происходит неявное преобразование типов
AnsiString str;
str = "это const char*";
в этом примере вызывается сначала конструктор для создания AnsiString из "это const char*", затем происходит присваивание.

Автор: GraNit 22.10.2007, 12:42
Lazin, в моем случае получается так:

Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include "Unit3.h"
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "RxMenus.hpp"
#include <ComCtrls.hpp>
#include <Menus.hpp>
#include <inifiles.hpp>
#include "ACE.hpp"
class TMN : public TForm
{
    TMenuItem *N1;
    TMenuItem *N2;
bla-bla-bla
private:    // User declarations
public:        // User declarations
    __fastcall TMN(TComponent* Owner);
    AnsiString director, mainbuh, company;
    AnsiString lastdate, path_base, path_doc, disk, path_in, path_out, numdoc, my_oper, my_drive;
    TDateTime curdat;
};
//---------------------------------------------------------------------------
extern PACKAGE TMN *MN;
//---------------------------------------------------------------------------
#endif

а вот уже unit.cpp
тут в начале как всегда куча кода

void __fastcall TMN::FormCreate(TObject *Sender)
{
     SetEnvironmentVariable("TMP","C:\\WINDOWS\\TEMP");

     TIniFile *pIniFile = new TIniFile( GetCurrentDir( )+"\\pack.ini");
     director = pIniFile->ReadString( "MAIN", "DIRECTOR", "Íåèçâåñòåí" );
     mainbuh = pIniFile->ReadString( "MAIN", "MAINBUH", "Íåèçâåñòåí" );
     company = pIniFile->ReadString( "MAIN", "COMPANY", "Íåèçâåñòåí" );
     lastdate = pIniFile->ReadString( "SYSTEM", "LASTDATE", DateToStr(Now()) );
     path_base = pIniFile->ReadString( "SYSTEM", "PATHBASE", "BASES\\" );
     path_doc = pIniFile->ReadString( "SYSTEM", "PATHDOC", "DOC\\" );
     disk = pIniFile->ReadString( "SYSTEM", "DISK", "ARCHIVE\\" );
     path_in = pIniFile->ReadString( "SYSTEM", "PATHIN", "IN\\" );
     path_out = pIniFile->ReadString( "SYSTEM", "PATHOUT", "OUT\\" );
     numdoc = pIniFile->ReadString( "SYSTEM", "NUMDOC", "0" );
     my_oper = pIniFile->ReadString( "SYSTEM", "OPERATOR", "" );
     my_drive = pIniFile->ReadString( "SYSTEM", "DRIVE", "A:\\" );
     delete pIniFile;
ну и так далее....
я попробовал пошаговое исполнение и был выяснил, что сначала выполняется OnCreate, а затем создается мой класс формы. Странно все как-то. Я думал, что должно наоборот. Сначала создается касс формы, а потом начинаю исполняться процедуры класса.
И вот, получилось так что заполнились все переменные, а при создании формы они обнунинись.
Ничего не понимаю.
У меня Builder5

Автор: pandrew 22.10.2007, 12:47
Цитата(GraNit @  22.10.2007,  12:42 Найти цитируемый пост)
я попробовал пошаговое исполнение и был выяснил, что сначала выполняется OnCreate, а затем создается мой класс формы. Странно все как-то. Я думал, что должно наоборот. Сначала создается касс формы, а потом начинаю исполняться процедуры класса.
И вот, получилось так что заполнились все переменные, а при создании формы они обнунинись.
Ничего не понимаю.
У меня Builder5 

Описание порядка событий есть в литературе. Зачем думать? Надо знать.
Члены класса (переменные формы) разумно всегда инициализировать в конструкторе и удалять в деструкторе.

Автор: GraNit 22.10.2007, 12:53
pandrew, извиняюсь, я не профессионал. Говорю, что мне она досталась в наследство.
Буду тады книжки читать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)