小弟现在有一个子窗体,子窗体上放了一些edit框和dbgrid以及按钮,现在想把这个子窗体创建在主窗体的一个tabsheet上,但是创建后发现了一个很奇怪的问题,当点击菜单,点开那个子窗体后,想给子窗体上得某个edit框赋值,就报内存错,很神奇,请教高手错在哪里创建子窗体的程序如下:
procedure TFrmMain.donodeselect(nodestr: string);
var newform:tform;
str1,str2: string;
begin
if nodestr='东区铁前生产实绩录入' then
begin
OpenFormPage('东区铁前生产实绩录入', TFrm_Result_Plan_LT,newform,Frm_Result_Plan_LT);
end;
end;procedure TFrmMain.OpenFormPage(TabCaption: string;
Formclass: TFormClass; var Myform; AOwner: Tcomponent);
var
i:Integer;
Found:Boolean;
ATab:TRzTabSheet;
AForm:TForm;
begin
Found:=False;
for i:=0 to FormPage.PageCount-1 do
if FormPage.Pages[i].ControlCount>0 then
begin
if FormPage.Pages[i].Controls[0].ClassName=Formclass.ClassName then
begin
FormPage.ActivePageIndex:=i;
Found:=True;
end;
end;
if not Found then
begin
ATab:=TRzTabSheet.Create(FormPage);
ATab.PageControl:=FormPage;
AForm:=TForm(Formclass.Create(self));
ATab.Caption:=TabCaption;
AForm.Parent:=ATab;
AForm.Align:=alclient;
AForm.BorderStyle:=bsNone;
AForm.Visible:=True;
FormPage.ActivePage:=ATab;
AForm.Show;
end;
end;以下是子窗体定义的内容
unit ResultOfPlan_LT;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, RzDBGrid, RzTabs, ImgList, StdCtrls, RzLabel,
RzPanel, RzDBNav, Mask, RzEdit, RzButton, ExtCtrls, DB, DBClient, ADODB,
RzCmboBx, RzRadChk, Buttons, ComCtrls;type
TFrm_Result_Plan_LT = class(TForm)
ImageList1: TImageList;
Panel2: TPanel;
DS1: TDataSource;
ADOQuery1: TADOQuery;
RzPanel1: TRzPanel;
RzPanel2: TRzPanel;
RzPanel3: TRzPanel;
RzPanel4: TRzPanel;
RzPanel5: TRzPanel;
RzBitBtn1: TRzBitBtn;
RzGroupBox1: TRzGroupBox;
RzDBGrid1: TRzDBGrid;
Timer1: TTimer;
DateTimePicker2: TDateTimePicker;
RzLabel8: TRzLabel;
RzLabel9: TRzLabel;
DateTimePicker3: TDateTimePicker;
RzCheckBox1: TRzCheckBox;
RzCheckBox2: TRzCheckBox;
RzLabel5: TRzLabel;
Cod_LineName: TRzComboBox;
RzLabel13: TRzLabel;
material2: TRzEdit;
RzBitBtn6: TRzBitBtn;
RzGroupBox3: TRzGroupBox;
RzPanel6: TRzPanel;
RzGroupBox2: TRzGroupBox;
RzDBGrid2: TRzDBGrid;
RzBitBtn3: TRzBitBtn;
RzLabel15: TRzLabel;
DateTimePicker4: TDateTimePicker;
RzLabel16: TRzLabel;
RzLabel17: TRzLabel;
shift2: TRzComboBox;
RzLabel18: TRzLabel;
material3: TRzEdit;
RzBitBtn4: TRzBitBtn;
DataSource2: TDataSource;
steelgrade2: TRzComboBox;
RzCheckBox3: TRzCheckBox;
RzPanel7: TRzPanel;
RzLabel7: TRzLabel;
wll: TRzEdit;
RzLabel6: TRzLabel;
RzLabel4: TRzLabel;
RzLabel10: TRzLabel;
DateTimePicker1: TDateTimePicker;
RzLabel12: TRzLabel;
SHIFTID: TRzComboBox;
RzLabel1: TRzLabel;
plantno: TRzEdit;
RzBitBtn20: TRzBitBtn;
LINENAME2: TRzEdit;
RzLabel2: TRzLabel;
tcbz: TRzComboBox;
RzBitBtn2: TRzBitBtn;
RzBitBtn5: TRzBitBtn;
RzLabel3: TRzLabel;
LineCode: TRzEdit;
RzLabel11: TRzLabel;
unitno: TRzEdit;
unitname: TRzEdit;
RzLabel14: TRzLabel;
CDS2: TClientDataSet;
matno: TComboBox;
RzLabel19: TRzLabel;
procedure FormShow(Sender: TObject);
procedure RzBitBtn20Click(Sender: TObject);
procedure comb3KeyPress(Sender: TObject; var Key: Char);
procedure RzBitBtn22Click(Sender: TObject);
procedure RzBitBtn6Click(Sender: TObject);
procedure RzBitBtn21Click(Sender: TObject);
procedure RzCheckBox1Click(Sender: TObject);
procedure RzCheckBox2Click(Sender: TObject);
procedure RzBitBtn1Click(Sender: TObject);
procedure plantnoChange(Sender: TObject);
procedure NOKeyPress(Sender: TObject; var Key: Char);
procedure RzDBGrid1CellClick(Column: TColumn);
procedure RzEdit2KeyPress(Sender: TObject; var Key: Char);
procedure RzBitBtn4Click(Sender: TObject);
procedure RzCheckBox3Click(Sender: TObject);
procedure wllKeyPress(Sender: TObject; var Key: Char);
procedure tcbzChange(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Frm_Result_Plan_LT: TFrm_Result_Plan_LT;
sqlstr : string;
v_material,v_steelgrade,v_spec,v_material_type,v_material_txt,v_length,v_FormName : string;
v_plantno:string;
implementation
uses udm, ULogin,Unit_Find_Mat,Umain;
{$R *.dfm}
procedure TFrmMain.donodeselect(nodestr: string);
var newform:tform;
str1,str2: string;
begin
if nodestr='东区铁前生产实绩录入' then
begin
OpenFormPage('东区铁前生产实绩录入', TFrm_Result_Plan_LT,newform,Frm_Result_Plan_LT);
end;
end;procedure TFrmMain.OpenFormPage(TabCaption: string;
Formclass: TFormClass; var Myform; AOwner: Tcomponent);
var
i:Integer;
Found:Boolean;
ATab:TRzTabSheet;
AForm:TForm;
begin
Found:=False;
for i:=0 to FormPage.PageCount-1 do
if FormPage.Pages[i].ControlCount>0 then
begin
if FormPage.Pages[i].Controls[0].ClassName=Formclass.ClassName then
begin
FormPage.ActivePageIndex:=i;
Found:=True;
end;
end;
if not Found then
begin
ATab:=TRzTabSheet.Create(FormPage);
ATab.PageControl:=FormPage;
AForm:=TForm(Formclass.Create(self));
ATab.Caption:=TabCaption;
AForm.Parent:=ATab;
AForm.Align:=alclient;
AForm.BorderStyle:=bsNone;
AForm.Visible:=True;
FormPage.ActivePage:=ATab;
AForm.Show;
end;
end;以下是子窗体定义的内容
unit ResultOfPlan_LT;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, RzDBGrid, RzTabs, ImgList, StdCtrls, RzLabel,
RzPanel, RzDBNav, Mask, RzEdit, RzButton, ExtCtrls, DB, DBClient, ADODB,
RzCmboBx, RzRadChk, Buttons, ComCtrls;type
TFrm_Result_Plan_LT = class(TForm)
ImageList1: TImageList;
Panel2: TPanel;
DS1: TDataSource;
ADOQuery1: TADOQuery;
RzPanel1: TRzPanel;
RzPanel2: TRzPanel;
RzPanel3: TRzPanel;
RzPanel4: TRzPanel;
RzPanel5: TRzPanel;
RzBitBtn1: TRzBitBtn;
RzGroupBox1: TRzGroupBox;
RzDBGrid1: TRzDBGrid;
Timer1: TTimer;
DateTimePicker2: TDateTimePicker;
RzLabel8: TRzLabel;
RzLabel9: TRzLabel;
DateTimePicker3: TDateTimePicker;
RzCheckBox1: TRzCheckBox;
RzCheckBox2: TRzCheckBox;
RzLabel5: TRzLabel;
Cod_LineName: TRzComboBox;
RzLabel13: TRzLabel;
material2: TRzEdit;
RzBitBtn6: TRzBitBtn;
RzGroupBox3: TRzGroupBox;
RzPanel6: TRzPanel;
RzGroupBox2: TRzGroupBox;
RzDBGrid2: TRzDBGrid;
RzBitBtn3: TRzBitBtn;
RzLabel15: TRzLabel;
DateTimePicker4: TDateTimePicker;
RzLabel16: TRzLabel;
RzLabel17: TRzLabel;
shift2: TRzComboBox;
RzLabel18: TRzLabel;
material3: TRzEdit;
RzBitBtn4: TRzBitBtn;
DataSource2: TDataSource;
steelgrade2: TRzComboBox;
RzCheckBox3: TRzCheckBox;
RzPanel7: TRzPanel;
RzLabel7: TRzLabel;
wll: TRzEdit;
RzLabel6: TRzLabel;
RzLabel4: TRzLabel;
RzLabel10: TRzLabel;
DateTimePicker1: TDateTimePicker;
RzLabel12: TRzLabel;
SHIFTID: TRzComboBox;
RzLabel1: TRzLabel;
plantno: TRzEdit;
RzBitBtn20: TRzBitBtn;
LINENAME2: TRzEdit;
RzLabel2: TRzLabel;
tcbz: TRzComboBox;
RzBitBtn2: TRzBitBtn;
RzBitBtn5: TRzBitBtn;
RzLabel3: TRzLabel;
LineCode: TRzEdit;
RzLabel11: TRzLabel;
unitno: TRzEdit;
unitname: TRzEdit;
RzLabel14: TRzLabel;
CDS2: TClientDataSet;
matno: TComboBox;
RzLabel19: TRzLabel;
procedure FormShow(Sender: TObject);
procedure RzBitBtn20Click(Sender: TObject);
procedure comb3KeyPress(Sender: TObject; var Key: Char);
procedure RzBitBtn22Click(Sender: TObject);
procedure RzBitBtn6Click(Sender: TObject);
procedure RzBitBtn21Click(Sender: TObject);
procedure RzCheckBox1Click(Sender: TObject);
procedure RzCheckBox2Click(Sender: TObject);
procedure RzBitBtn1Click(Sender: TObject);
procedure plantnoChange(Sender: TObject);
procedure NOKeyPress(Sender: TObject; var Key: Char);
procedure RzDBGrid1CellClick(Column: TColumn);
procedure RzEdit2KeyPress(Sender: TObject; var Key: Char);
procedure RzBitBtn4Click(Sender: TObject);
procedure RzCheckBox3Click(Sender: TObject);
procedure wllKeyPress(Sender: TObject; var Key: Char);
procedure tcbzChange(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Frm_Result_Plan_LT: TFrm_Result_Plan_LT;
sqlstr : string;
v_material,v_steelgrade,v_spec,v_material_type,v_material_txt,v_length,v_FormName : string;
v_plantno:string;
implementation
uses udm, ULogin,Unit_Find_Mat,Umain;
{$R *.dfm}
var
sql:string;
begin
if (RzDBGrid1.SelectedRows.Count>0) and (matno.Text='') then
begin
plantno.Text:=ADOQuery1.Fieldbyname('planno').AsString;
LINENAME2.Text:=ADOQuery1.Fieldbyname('LINENAME').AsString;
LINECODE.Text:=ADOQuery1.Fieldbyname('LINECODE').AsString;
unitname.Text:=copy(LINENAME2.Text,1,8);
end;
end;
一执行到这句就报内存错,但是忽略在继续执行,其实值已经赋给了这些edit
unitname.Text:=copy(LINENAME2.Text,1,8);
确定字符串够长么?
错误信息如下:
Project Pjgdd.exe raised exception class EAccessViolation with message 'Access violation at address 0060E94E in module 'Pjgdd.exe'.Read of address 00000304'.Process stopped.Use Step or Run to continue.
var
str:string;str:=ADOQuery1.Fieldbyname('planno').AsString;
plantno.Text:= str;
你看看报错是在第一句还是在第二句,反正先排除是不是数据库的问题
我看你用了一个第三方控件
plantno: TRzEdit;这个我没用过,不知道特点是什么
你尝试把他换成一个tedit看看会赋值还会报错么?