delphi - 从另一个窗体访问 DBGrid1.Columns[1].Title.Caption
问题描述
我正在尝试Caption
从另一个表单访问 dbgrid.field 的。
我在这里使用 MDI,两种形式都是 MDIChildren。
我试图ShowMessage
从另一个表单执行以下操作,但它导致了访问冲突:
ShowMessage(Form1.DBGrid1.Columns[1].Title.Caption); // 1st try
ShowMessage(Unit1.Form1.DBGrid1.Columns[1].Title.Caption); // 2nd try
使用已设置在 2 种形式之间。
错误信息是
模块中地址 000010363F9 的访问冲突。读取地址 000000006F0。
我在这里想念什么?
更新:这是这种情况的精确复制(RME)。
MDI 父级
unit MainUnit;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus;
type
TParentForm = class(TForm)
mmMenu: TMainMenu;
miForm1: TMenuItem;
miForm2: TMenuItem;
procedure miForm1Click(Sender: TObject);
procedure miForm2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
ParentForm: TParentForm;
implementation
uses
Form1Unit, Form2Unit;
{$R *.dfm}
procedure TParentForm.miForm1Click(Sender: TObject);
begin
TChildForm1.Create(self).Show;
end;
procedure TParentForm.miForm2Click(Sender: TObject);
begin
TChildForm2.Create(self).Show;
end;
end.
MDI ChildForm1
unit Form1Unit;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Datasnap.DBClient,
Datasnap.Provider, MemDS, DBAccess, Uni, UniProvider, MySQLUniProvider,
Vcl.Grids, Vcl.DBGrids;
type
TChildForm1 = class(TForm)
dbgrd1: TDBGrid;
ucn1: TUniConnection;
mup1: TMySQLUniProvider;
uq1: TUniQuery;
dsp1: TDataSetProvider;
cds1: TClientDataSet;
ds1: TDataSource;
smlntfldcds1actor_id: TSmallintField;
strngfldcds1first_name: TStringField;
strngfldcds1last_name: TStringField;
dtmfldcds1last_update: TDateTimeField;
private
{ Private declarations }
public
{ Public declarations }
end;
var
ChildForm1: TChildForm1;
implementation
uses
MainUnit, Form2Unit;
{$R *.dfm}
end.
MDI ChildForm2
unit Form2Unit;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TChildForm2 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
ChildForm2: TChildForm2;
implementation
uses
MainUnit, Form1Unit;
{$R *.dfm}
procedure TChildForm2.btn1Click(Sender: TObject);
begin
ShowMessage(Form1Unit.ChildForm1.dbgrd1.Columns[2].Title.Caption);
end;
end.
错误信息
模块“Project7.exe”中地址 0081B314 的访问冲突。读取地址 000003D0。
解决方案
可能,其中一个对象没有被分配,我怀疑它可能是Columns[1]
(注意Columns
集合是从零开始的索引,所以第一列是Columns[0]
)
尝试这个:
if(not Assigned(Form1)) then
raise Exception.Create('Form1 not assigned');
if(not Assigned(Form1.DBGrid1)) then
raise Exception.Create('Form1.DBGrid1 not assigned');
if(Form1.DBGrid1.Columns.Count < 2) then
raise Exception.Create('Form1.DBGrid1 has not the Columns[1] item');
推荐阅读
- regex - 正则表达式仅允许且仅允许数字
- java - 从文件中读取交替数据类型
- javascript - 添加到当前函数“总计”忽略某些值的逻辑
- javascript - GoogleJsonResponseException:对 drive.files.update 的 API 调用失败并出现错误:用户对此文件没有足够的权限
- javascript - p:calendar 在呈现第一个视图后触发 javascript 方法
- php - 批量更新不向数据库发送任何数组数据
- jquery - 在轮播 jQuery 中跟随按钮添加、删除类
- android - 错误:无法从“12”确定 java 版本
- excel - 如何在 SAP 中使用和循环 Excel 变量
- c++ - 想简化我的 std::vector push_back 使用