请参阅1 cpp文件到另一个C ++

时间:2015-08-28 11:14:17

标签: c++

我从1个文件引用到另一个文件时遇到了一些问题。

我有2张VCL表格:
- OpenPlotFile - SelectElement

在我的Plotfile中,我有一个openDialog:

void __fastcall TPlotFileForm::btn_fileselectClick(TObject *Sender)
{

AnsiString message;

//Dialog opties instellen

OpenDialog->Options << ofFileMustExist;
OpenDialog->Filter ="PPD files (*.PPD) |*.ppd |PLOT files (PLOT.*) | plot.*";
OpenDialog->FilterIndex = 2;

if (OpenDialog->Execute())
{
    plotFile = OpenDialog->FileName;
    Itxt_plotfile->Text=plotFile;

    try  
    {
        TFileStream *plotStream = new TFileStream(plotFile, fmOpenRead);
        TStringStream *plotString = new TStringStream();

        plotString->CopyFrom(plotStream, plotStream->Size);
        FileBuffer = plotString->DataString;
        delete plotStream;
        delete plotString;

        message = "Make your choice what to plot";
        ListBox1->Items->Add(message);
        message = "Default is everything, on insulation and with automatic weepholes at 1000 mm...";
        ListBox1->Items->Add(message);
        message = "Accept with the OK button...";
        ListBox1->Items->Add(message);

        btn_OK->Enabled=true;//Knop activeren nadat file is gekozen
    }
    catch(EStreamError &e)
    {
        ShowMessage(e.Message);
    }
}

}

在这个文件中我有一个plotFile,这是文件目录。我希望将该值转换为另一种形式:SelectElement

我现在的工作方式很简单:我将AnsiString plotFile;添加到OpenPlotFile.h

我在SelectElement文件中包含OpenPlotFile.h。

#include "PlotFileScreen.h"
void __fastcall TSelectElementForm::FormShow(TObject *Sender)
{
   element *ElementArray = new element[100];
   ElementArray = GetElementInfo();
   Itxt_plot_file->Text = plotFile;
   Itxt_ordernumber->Text = ElementArray[0].ON;
   Itxt_element_id->Text = ElementArray[0].MO;
   Itxt_type->Text = ElementArray[0].SN;
   Itxt_concrete->Text = ElementArray[0].el_concrete_height;
   Itxt_Insulation->Text = ElementArray[0].el_iso_height;
   Itxt_Length->Text = ElementArray[0].el_length;
   Itxt_Width->Text = ElementArray[0].el_width;
   Itxt_Weight->Text = ElementArray[0].el_weight;
   Itxt_slabmark->Text = "";
   Itxt_reinforce->Text = ElementArray[0].OW;
}

我的程序编译并且工作正常,但奇怪的是,当我调试时,在两个文件中都显示:plotFile = NULL

我该如何解决这个问题?或者如何在不plotFile的情况下将NULL传递给其他文件?

2 个答案:

答案 0 :(得分:3)

仅供参考:全局变量很难看,应尽可能避免。封装和抽象是你的朋友。但要回答你的问题:

如果plotFile属于您的头文件,则通过AnsiString plotFile;声明它,每个翻译单元都会获得自己的副本。您需要在一个* .cpp文件中定义变量,并在标题中将其声明为extern。

来自C ++标准:

  

3.5计划与联系

     

当名称具有外部链接时,它表示的实体可以是   来自其他翻译单位范围的名称或来自   同一翻译单位的其他范围。

所以在你的头文件中你必须放置它:

extern AnsiString plotFile;

在一个cpp文件中定义变量:

AnsiString plotFile;

答案 1 :(得分:0)

不要为此使用全局变量,如果你总是使用它,迟早会遇到麻烦。它导致的一个问题是,您只能使用一次表单实例,因为它占用了您的全局变量。

你的问题有一个共同的解决方案,我认为在所有平台/系统/等上都是相同的。你必须以某种方式将你的变量传递给表单/ dialog / etc 类实例 你要表现出来。

看起来您正在使用Borland Builder C ++或Embarcadero。解决问题的正确方法是将AnsiString plotFile添加为SelectElement表单的成员变量,并使用访问器方法进行设置。它的示例代码可以在这里找到:

http://bcbjournal.org/articles/vol2/9810/Sharing_data_and_methods_between_forms.htm