我从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
传递给其他文件?
答案 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