//----------------------------------------------------------------------------//
// module: FMain.h //
// //
// Main form of the GUI for the PNC cluster/learning algorithm //
// //
// copyright (c) 2003 by Lars Haendel //
// home: www.newty.de //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 2 of the License. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program; if not, write to the Free Software //
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. //
// //
//----------------------------------------------------------------------------//
#ifndef FMainH
#define FMainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <Menus.hpp>
#include <Dialogs.hpp>
#include <ExtCtrls.hpp>
#include <Buttons.hpp>
#include <ImgList.hpp>
#include <Mask.hpp>
#include <Chart.hpp>
#include <Series.hpp>
#include <TeEngine.hpp>
#include <TeeProcs.hpp>
#include <AppEvnts.hpp>
#include <ToolWin.hpp>
//----------------------------------------------------------------------------------------------------------------------
#include <Registry.hpp> // due to: TRegistry
#include <time> // clock_t
#include "data.h" // TData
#include "paraset.h" // TParaSet & TParaSetList
#include "para.h" // TParameter and default values
#include "projectG.h" // TProjectG
#include "cluster.h" // TCluster
#include "prediction.h" // TPrediction
#include "lossfunc.h" // TLossFucntion
#include "tune.h" // TTune
//----------------------------------------------------------------------------------------------------------------------
// forward declarations
class ThrLoadData; // thread object, used to load data
class ThrUseModel; // thread object, used to use model
class ThrLearnModel; // thread object, used to learn pnc model
class ThrTune; // thread object, used to tune parameters
//----------------------------------------------------------------------------------------------------------------------
#define SZ_DISABLE_WARNINGS "Disable Warnings" // registry keys ...
#define SZ_DISABLE_QUESTIONS "Disable Questions"
#define SZ_COM_CHAR "Comment Character"
#define DEF_DISABLE_WARNINGS (bool) false // ... and default settings
#define DEF_DISABLE_QUESTIONS (bool) false
#define SZ_REGISTRY_KEY "\\Software\\PNC2"
void WriteDefaultsToRegistry(TRegistry* registry, const bool& f_SkipIfExisting); // write defaults to registry
//----------------------------------------------------------------------------------------------------------------------
// globals
extern bool f_DisableWarnings; // flag: disable warning message boxes
extern bool f_DisableQuestions; // flag: assume YES on silly questions
//----------------------------------------------------------------------------------------------------------------------
// main window
class TFMain : public TForm
{
__published:
TPageControl *PageControl;
TTabSheet *TsBasic;
TTabSheet *TsTuneResults;
TTabSheet *TsModel;
TTabSheet *TsUseModel;
TMainMenu *MainMenu;
TMenuItem *File1;
TMenuItem *Help1;
TMenuItem *MnNew;
TMenuItem *MnOpenProject;
TMenuItem *MnLoadModel;
TMenuItem *MnExit;
TMenuItem *MnHelp;
TMenuItem *About;
TOpenDialog *OpenDialog;
TSaveDialog *SaveDialog;
TGroupBox *GbLearnData;
TGroupBox *GbTune;
TGroupBox *GbParameters;
TBitBtn *BtLearnData;
TProgressBar *PbLearnData;
TBitBtn *BtLearnDataPause;
TBitBtn *BtLearnDataAbort;
TTimer *LoadDataTimer;
TBitBtn *BtLearnDataContinue;
TBitBtn *BtEditSets;
TLabel *LaIntervals;
TLabel *LaWmin;
TLabel *LaEta;
TLabel *LaCardinality;
TLabel *LaSigma;
TLabel *LaSpecial;
TCheckBox *CbWeights;
TCheckBox *CbPrune;
TCheckBox *CbEuclidean;
TEdit *EIntervals;
TEdit *EWmin;
TEdit *EEta;
TEdit *ECardinality;
TEdit *ESpecial;
TEdit *ESigma;
TBitBtn *BtLearn;
TBitBtn *BtTestData;
TGroupBox *GbTestData;
TProgressBar *PbTestData;
TBitBtn *BtTestDataContinue;
TBitBtn *BtTestDataAbort;
TBitBtn *BtTestDataPause;
TShape *ShTestDataStatus;
TLabel *LaTestFile;
TLabel *LaTestDataStatus;
TGroupBox *GbSimulation;
TProgressBar *PbTestModel;
TBitBtn *BtTest;
TGroupBox *GbTestPara1;
TGroupBox *GbTestPara2;
TEdit *ETestCardinality;
TLabel *LaTestCardinality;
TLabel *LaTestSigma;
TEdit *ETestSpecial;
TLabel *LaTestSpecial;
TCheckBox *CbTestWeights;
TCheckBox *CbTestEuclidean;
TCheckBox *CbTestPrune;
TShape *Shape1;
TBitBtn *BtTestOutput;
TCheckBox *CbWritePredictions;
TLabel *LaSimulationFile;
TLabel *LaTestTime;
TGroupBox *GbModelParameter;
TLabel *LaModelEta;
TLabel *LaModelWmin;
TLabel *LaModelIntervals;
TLabel *LaModelIntervalsValue;
TLabel *LaModelWminValue;
TLabel *LaModelEtaValue;
TLabel *LaModelWeights;
TLabel *LaModelEuclidean;
TBevel *Bevel8;
TBevel *Bevel9;
TBevel *Bevel10;
TLabel *Label4;
TLabel *Label5;
TLabel *Label6;
TLabel *LaModelWeightValue;
TLabel *LaModelEuclideanValue;
TGroupBox *GbModelStatus;
TShape *ShModelStatus;
TBitBtn *BtModelContinue;
TBitBtn *BtModelPause;
TBitBtn *BtModelAbort;
TProgressBar *PbLearning;
TGroupBox *GbModel;
TLabel *LaNCuboids1;
TLabel *LaNCuboids2;
TLabel *LaHitrate;
TLabel *LaNCuboids1Value;
TLabel *LaNCuboids2Value;
TLabel *LaHitrateValue;
TLabel *LaCuboidMass;
TLabel *LaCuboidMassValue;
TLabel *LaCuboidSize;
TLabel *LaCuboidSizeValue;
TTimer *LearningTimer;
TTimer *TestTimer;
TTimer *TuningTimer;
TListView *LvTuneResults;
TLabel *LaModelStatus;
TBitBtn *BtTestContinue;
TBitBtn *BtTestAbort;
TBitBtn *BtTestPause;
TLabel *Label2;
TBevel *Bevel21;
TCheckBox *CbModify1;
TCheckBox *CbModify2;
TGroupBox *GbTestResults;
TBevel *Bevel25;
TBevel *BeLossHorLine1;
TBevel *BeLossLine1;
TBevel *BeLossLine2;
TLabel *LaOverallLoss1;
TLabel *LaResultHeader1;
TLabel *LaLossName1;
TLabel *LaLossName2;
TBevel *BeLossHorLine3;
TLabel *LaOverallLoss2;
TLabel *LaInsideLoss1;
TLabel *LaInsideLoss2;
TLabel *LaOutsideLoss2;
TBevel *BeLossHorLine2;
TLabel *LaOutsideLoss1;
TLabel *LaResultHeader3;
TLabel *LaResultHeader2;
TLabel *LaInsideRatio;
TLabel *LaResultHeader4;
TLabel *LaModelTimeHeader;
TLabel *LaRuns;
TLabel *LaLearnFileHeader;
TLabel *LaLearnDataStatus;
TShape *ShLearnDataStatus;
TLabel *LaOutCol;
TEdit *EOutCol;
TCheckBox *CbClassification;
TBitBtn *BtEditTypes;
TMenuItem *MnSaveProject;
TMenuItem *MnSaveModel;
TBitBtn *BtOutColDown;
TBitBtn *BtOutColUp;
TBitBtn *BtTune;
TBitBtn *BtDefault;
TBevel *Bevel1;
TBevel *Bevel3;
TProgressBar *PbModelSize;
TLabel *LaModelSize;
TLabel *LaModelTime;
TCheckBox *CbPruneAnyWay;
TCheckBox *CbKillCuboids;
TBitBtn *BtMaxSizeDown;
TBitBtn *BtMaxSizeUp;
TEdit *EMaxSize;
TLabel *LaMaxSize;
TCheckBox *CbRandomize;
TCheckBox *CbSkipping;
TTrackBar *TbDataSplitting;
TLabel *LaSplitting;
TEdit *ERepetition;
TBitBtn *BtRepetitionDown;
TBitBtn *BtRepetitionUp;
TLabel *LaRepetition;
TRadioButton *RbRepetition;
TRadioButton *RbCrossValidation;
TRadioButton *RbLoocv;
TCheckBox *CbSkipTuning;
TChart *MceChart;
TPieSeries *Series2;
TChart *CubHistChart;
TBarSeries *Series1;
TLabel *LaModelStatusHeader;
TLabel *LaLearnFile;
TLabel *LaLearnDataStatusHeader;
TLabel *LaTestFileHeader;
TLabel *LaTestDataStatusHeader;
TLabel *LaSimulationFileHeader;
TLabel *LaTestTimeHeader;
TLabel *LaTestStatusHeader;
TLabel *LaTestStatus;
TLabel *LaResultHeader5;
TBevel *Bevel2;
TLabel *LaTestCuboids;
TApplicationEvents *ApplicationEvents;
TToolBar *ToolBar;
TToolButton *TbNew;
TImageList *ToolBarImageList;
TToolButton *TbOpenProject;
TToolButton *TbSaveProject;
TToolButton *TbLoadModel;
TToolButton *TbSaveModel;
TToolButton *TbHelp;
TToolButton *ToolButton2;
TToolButton *TbAbout;
TToolButton *ToolButton1;
TMenuItem *MnSaveProjectAs;
TMenuItem *MnOptions;
TLabel *LaMinCmpr;
TBitBtn *BtMinCmprDown;
TBitBtn *BtMinCmprUp;
TEdit *EMinCmpr;
TGroupBox *GbTuneStatus;
TProgressBar *PbTune;
TBitBtn *BtTuneContinue;
TBitBtn *BtTuneAbort;
TLabel *LaTuneTime;
TLabel *LaTuneTimeHeader;
TLabel *LaTuneStatusHeader;
TLabel *LaTuneStatus;
TShape *Shape3;
TBitBtn *BtTunePause;
TLabel *LaSelectText;
TEdit *ETestSigma;
TBitBtn *BtSelect;
TMenuItem *MnProjectOptions;
TMenuItem *MnGuiOptions;
TBevel *Bevel4;
TBevel *Bevel5;
TBevel *Bevel6;
TBevel *Bevel7;
TBevel *Bevel11;
TBevel *Bevel12;
TBevel *Bevel13;
TBevel *Bevel14;
TBevel *Bevel16;
TBevel *Bevel17;
void __fastcall AboutClick(TObject *Sender);
void __fastcall BtLearnDataClick(TObject *Sender);
void __fastcall BtLearnDataPauseClick(TObject *Sender);
void __fastcall BtLearnDataContinueClick(TObject *Sender);
void __fastcall BtLearnDataAbortClick(TObject *Sender);
void __fastcall MnExitClick(TObject *Sender);
void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
void __fastcall EOutColExit(TObject *Sender);
void __fastcall BtEditTypesClick(TObject *Sender);
void __fastcall RbRepetitionClick(TObject *Sender);
void __fastcall RbCrossValidationClick(TObject *Sender);
void __fastcall RbLoocvClick(TObject *Sender);
void __fastcall TbDataSplittingChange(TObject *Sender);
void __fastcall ERepetitionExit(TObject *Sender);
void __fastcall EMaxSizeExit(TObject *Sender);
void __fastcall BtEditSetsClick(TObject *Sender);
void __fastcall FormShow(TObject *Sender);
void __fastcall CbClassificationClick(TObject *Sender);
void __fastcall TsUseModelShow(TObject *Sender);
void __fastcall CbModify1Click(TObject *Sender);
void __fastcall CbModify2Click(TObject *Sender);
void __fastcall BtTestDataClick(TObject *Sender);
void __fastcall BtTestDataContinueClick(TObject *Sender);
void __fastcall BtTestDataAbortClick(TObject *Sender);
void __fastcall BtTestDataPauseClick(TObject *Sender);
void __fastcall PageControlChanging(TObject *Sender, bool &AllowChange);
void __fastcall MnLoadModelClick(TObject *Sender);
void __fastcall BtTestOutputClick(TObject *Sender);
void __fastcall BtTestClick(TObject *Sender);
void __fastcall BtTestPauseClick(TObject *Sender);
void __fastcall BtTestContinueClick(TObject *Sender);
void __fastcall BtTestAbortClick(TObject *Sender);
void __fastcall OnTestTimer(TObject *Sender);
void __fastcall BtLearnClick(TObject *Sender);
void __fastcall BtTuneClick(TObject *Sender);
void __fastcall EWminExit(TObject *Sender);
void __fastcall EIntervalsExit(TObject *Sender);
void __fastcall EEtaExit(TObject *Sender);
void __fastcall ECardinalityExit(TObject *Sender);
void __fastcall ESpecialExit(TObject *Sender);
void __fastcall ESigmaExit(TObject *Sender);
void __fastcall EOutColClick(TObject *Sender);
void __fastcall EIntervalsClick(TObject *Sender);
void __fastcall EWminClick(TObject *Sender);
void __fastcall EEtaClick(TObject *Sender);
void __fastcall ECardinalityClick(TObject *Sender);
void __fastcall ESpecialClick(TObject *Sender);
void __fastcall ESigmaClick(TObject *Sender);
void __fastcall EOutColKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall EIntervalsKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall EWminKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall EEtaKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall ECardinalityKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall ESpecialKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall ESigmaKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall BtOutColUpClick(TObject *Sender);
void __fastcall BtOutColDownClick(TObject *Sender);
void __fastcall ERepetitionKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall BtRepetitionUpClick(TObject *Sender);
void __fastcall BtRepetitionDownClick(TObject *Sender);
void __fastcall BtMaxSizeUpClick(TObject *Sender);
void __fastcall BtMaxSizeDownClick(TObject *Sender);
void __fastcall EMaxSizeKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall EMaxSizeClick(TObject *Sender);
void __fastcall ERepetitionClick(TObject *Sender);
void __fastcall BtDefaultClick(TObject *Sender);
void __fastcall OnLearningTimer(TObject *Sender);
void __fastcall BtModelPauseClick(TObject *Sender);
void __fastcall BtModelAbortClick(TObject *Sender);
void __fastcall BtModelContinueClick(TObject *Sender);
void __fastcall MnSaveProjectClick(TObject *Sender);
void __fastcall CbPruneClick(TObject *Sender);
void __fastcall CbEuclideanClick(TObject *Sender);
void __fastcall CbWeightsClick(TObject *Sender);
void __fastcall ETestCardinalityExit(TObject *Sender);
void __fastcall ETestCardinalityKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall ETestCardinalityClick(TObject *Sender);
void __fastcall ETestSpecialClick(TObject *Sender);
void __fastcall ETestSpecialKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall ETestSpecialExit(TObject *Sender);
void __fastcall ETestSigmaKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall ETestSigmaExit(TObject *Sender);
void __fastcall CbTestPruneClick(TObject *Sender);
void __fastcall CbTestWeightsClick(TObject *Sender);
void __fastcall CbTestEuclideanClick(TObject *Sender);
void __fastcall CbSkipTuningClick(TObject *Sender);
void __fastcall CbKillCuboidsClick(TObject *Sender);
void __fastcall CbPruneAnyWayClick(TObject *Sender);
void __fastcall CbRandomizeClick(TObject *Sender);
void __fastcall CbSkippingClick(TObject *Sender);
void __fastcall ETestSigmaClick(TObject *Sender);
void __fastcall MnNewClick(TObject *Sender);
void __fastcall MnOpenProjectClick(TObject *Sender);
void __fastcall MnSaveModelClick(TObject *Sender);
void __fastcall MnHelpGuiClick(TObject *Sender);
void __fastcall ApplicationEventsShortCut(TWMKey &Msg, bool &Handled);
void __fastcall ApplicationEventsException(TObject *Sender, Exception *E);
void __fastcall TsBasicResize(TObject *Sender);
void __fastcall TsUseModelResize(TObject *Sender);
void __fastcall TsModelResize(TObject *Sender);
void __fastcall TsBasicShow(TObject *Sender);
void __fastcall MnSaveProjectAsClick(TObject *Sender);
void __fastcall CbWritePredictionsClick(TObject *Sender);
void __fastcall MnProjectOptionsClick(TObject *Sender);
void __fastcall EMinCmprExit(TObject *Sender);
void __fastcall EMinCmprKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall EMinCmprClick(TObject *Sender);
void __fastcall BtMinCmprUpClick(TObject *Sender);
void __fastcall BtMinCmprDownClick(TObject *Sender);
void __fastcall BtTuneContinueClick(TObject *Sender);
void __fastcall BtTunePauseClick(TObject *Sender);
void __fastcall BtTuneAbortClick(TObject *Sender);
void __fastcall TuningTimerTimer(TObject *Sender);
void __fastcall LvTuneResultsColumnClick(TObject *Sender, TListColumn *Column);
void __fastcall LvTuneResultsCompare(TObject* Sender, TListItem* Item1, TListItem* Item2, int Data, int& Compare);
void __fastcall BtSelectClick(TObject *Sender);
void __fastcall LvTuneResultsSelectItem(TObject *Sender, TListItem *Item, bool Selected);
void __fastcall LvTuneResultsDblClick(TObject *Sender);
void __fastcall PageControlResize(TObject *Sender);
void __fastcall LvTuneResultsCustomDrawSubItem(TCustomListView *Sender,
TListItem *Item, int SubItem, TCustomDrawState State,
bool &DefaultDraw);
void __fastcall MnGuiOptionsClick(TObject *Sender);
private:
TRegistry* registry;
DWORD HtmlHelpCookie;
friend void CallLoadLearnDataFinish(const bool&);
friend void CallLoadTestDataFinish(const bool&);
char cmplPrgName[256]; // program's name
AnsiString szExeDir; // executable's directory
AnsiString szHtmlHelpFile; // help file name
AnsiString szProjectFile; // project filename
AnsiString szModelFile; // model filename
AnsiString szTuningFile; // tuning results filename
AnsiString szSimOutputFile; // simulation output filename // move to TProjectG (?)
TProjectG prj; // project
TData *data_L, *data_T; // learn and test data
TCluster* model; // model
TPnc* pnc; // pnc object (used to learn model)
TTune* tuneResults; // tuning results
TParameter para; // parameter used to learn and test model
TLossFunction* loss; // loss object (stores loss function results)
TParaSet stdPara, learnPara; // standard (default) parameters and parameters used to learn new model
ThrLoadData* LoadDataThread; // thread objects
ThrUseModel* UseModelThread;
ThrLearnModel* LearnModelThread;
ThrTune* TuneThread;
bool f_Stop;
bool f_Loading, f_Tuning; // flags that indicate, that some work is done by one of the thread objects ...
bool f_Learning, f_Testing; // ... This cane be: loading of data files, parameter tuning, learning or testing.
bool f_LearnParaInitialized; // flag: learn parameters on tab sheet 'Basic' are initialized
bool f_Saved; // flag: project not saved note: only model and tuning results are tracked
bool f_IsWithOutput; // test data is with output
//-------------------------------------------------------------------------------------------------------------------
// tab sheet independant functions
// the action list is used to summarize some commonly used actions/tasks
// note: One could use separate functions instead but i liked this solution
enum TActionList{LearnDataLoaded, EmptyProject, ModelLoaded, ClearTestData, ClearResults, ProjectToGUI
, TuneResultsLoaded, DeleteModel, DeleteTuningResults, DeleteTuningTasks};
void ActionList(const TActionList& action);
void SaveProject(AnsiString szFileName); // save project to file
void UpdatePara(); // initialize (learn and) test parameters
void DoIt(); // write through output column and set data and project in TVarTypes object
void DoItExt(); // call DoIt() to calculate feature weights and ini. standard parameters
void EnableMenus(const bool& enable); // enable/disable menus while busy (loading, learning, tuning, testing)
void OpenHelp(); // open help
//-------------------------------------------------------------------------------------------------------------------
// tab sheet 'Basic'
void ChangeOutCol(int outcol);
void __fastcall OnLoadLearnDataTimer(TObject*);
void OnLoadLearnDataFinish(const bool& error); // learn data has been loaded
void EnableLearnDataCtrls(const bool& enable); // group box 'Learn Data' (and 'Tuning'/'Parameter') controls
void EnableTuneCtrls (const bool& enable); // group box 'Tune parameters' controls
void EnableParameterCtrls(const bool& enable); // group box 'Parameter' controls
void SetTsLearnFocus(); // set focus to appropriate control
void EvOutputType(); // evaluate output variable type
void EvTuneType(); // evaluate tuning type, hide inappropriate controls
void Set_N_R_Tune(const int N_R_Tune); // set repetition count
void SetMaxSize(const int maxSize);
void SetMinCmpr(const int minCmpr);
void SetNParameterSets(); // display actual number of parameter sets or hint how to define tasks
void SetParameters(const TParaSet& para); // initialize strings in group box 'Parameters' with given values
void ActLearnDataStatus(const bool& f_ActFilename=false);
//-------------------------------------------------------------------------------------------------------------------
// tab sheet 'Tuning Results'
clock_t tuneTime, tuneStartTime;
void AddTuningResult(const int& id); // add one new tuning result
void AddTuningResults(); // add new tuning results as necessary
int ColumnToSort; // kind of global, used in LvTuningResultsColumnClick()
void ActTuningResultsStatus();
//-------------------------------------------------------------------------------------------------------------------
// tab sheet 'Model'
clock_t learnTime, learnStartTime, testTime, testStartTime;
void ActModelParameters(); // set values of group box 'Model Parameters'
//-------------------------------------------------------------------------------------------------------------------
// tab sheet 'Use Model'
void __fastcall OnLoadTestDataTimer(TObject*);
void OnLoadTestDataFinish(const bool& error); // test data has been loaded
void EnableTestDataCtrls(const bool& enable);
void EnableTestTestParameterCtrls(const bool& enable); // group box 'Learn Parameters'
void EnableTestLearnAndTestParameterCtrls(const bool& enable); // group box 'Learn and Test Parameters'
void SetTestParameter1(); // set values in group box 'Learn Parameters'
void SetTestParameter2(); // set values in group box 'Learn and Test Parameters'
void ActTestDataStatus(const bool& f_ActFilename=true);
void ActTestStatus();
void ActLossFunctionResults(); // display actual loss fucntion results
void ActModelStatus();
public:
// constructor/destructor
__fastcall TFMain(TComponent* Owner);
__fastcall ~TFMain();
bool AllowChangeOfInputType(); // ask user if a model is present cause this will be deleted
void SetSavedFlag(const bool& f_Set); // access 'project is saved' flag
void OnDeployFinish(); // simulation is finished, results can be displayed
void OnLearnModelFinished(TCluster* _model); // called if learning of model is finished
void OnTuningFinished(); // called if tuning is finished
const bool& GetStopFlag() const { return f_Stop; }; // return reference to stop flag, used by thread objects to
// terminate upon request
};
extern PACKAGE TFMain *FMain;
#endif