我在Frm1中cxGrid的其中两列分别设置properties为ButtonEdit,然后通过OnButtonClick事件调用另一个窗口(设为Frm2),并在Frm2中的数据修改提交后,在cxGrid中即时更新数据。这是通过ButtonEdit的OnButtonClick事件引发:
procedure TFrmProjApplyMng.gdTVSignPropertiesButtonClick(Sender: TObject;
AButtonIndex: Integer);
var
i: Integer;
begin
inherited;
if not Assigned(FProjApply) then
FProjApply := TFrmProjApplyEx.Create(Self);
with cdsProjApply, FProjApply do
begin
CompressSelect('SELECT * FROM wp_ProjApply WHERE (RecordID = ''' + FieldByName('RecordID').AsString + ''')'
, cdsApply);
SetPageReadOnly(pnlMain, False);
SetPageReadOnly(gbInf, not btnOk.Visible);
SetPageReadOnly(mmProjContent, False);
btnOk.Visible := True;
FProjApply.ShowModal;
if CheckBack(FieldByName('RecordID').AsString) then
begin
Edit;
for i := 0 to FieldCount - 1 do
Fields[i].Value := cdsApply.FieldByName(Fields[i].FieldName).Value;
// edCorpName.Text := cdsApply.FieldByName('TypeID').AsString;
Post; end;
end;
end;
这里通过Button的OnClick事件引发:
procedure TFrmProjApplyMng.btnViewClick(Sender: TObject);
var
i: Integer;
begin
inherited;
if not Assigned(FProjApply) then
FProjApply := TFrmProjApplyEx.Create(Self);
with cdsProjApply, FProjApply do
begin
CompressSelect('SELECT * FROM wp_ProjApply WHERE (RecordID = ''' + FieldByName('RecordID').AsString + ''')'
, cdsApply);
SetPageReadOnly(pnlMain, False);
SetPageReadOnly(gbInf, not btnOk.Visible);
SetPageReadOnly(mmProjContent, False);
btnOk.Visible := True;
FProjApply.ShowModal;
if CheckBack(FieldByName('RecordID').AsString) then
begin
Edit;
for i := 0 to FieldCount - 1 do
Fields[i].Value := cdsApply.FieldByName(Fields[i].FieldName).Value;
// edCorpName.Text := cdsApply.FieldByName('TypeID').AsString;
Post;
end;
end;
end;
两个事件中的代码是一样的,问题出在红色代码部分。
ButtonEdit的OnButtonClick事件可以实现数据的即时更新,但是会提示'control'' has no parent window',而Button的OnClick事件不会出现这种情况。
或者屏蔽红色块代码,也不会报错。
不知道有没有什么解决办法呢?这里我不想用Button。
CheckBack函数来自于Frm2
function TFrmProjApplyEx.CheckBack(AID: string): Boolean;
var
Str: string;
begin
Str := 'SELECT * FROM wp_ProjApply WHERE (RecordID = ''' + AID + ''')';
FCDSArr[0].SQL := Str;
GetCDS(FCDSArr, []);
Result := (ModalResult = mrOk); //数据成功提交后,Result为True.
end;
procedure TFrmProjApplyMng.gdTVSignPropertiesButtonClick(Sender: TObject;
AButtonIndex: Integer);
var
i: Integer;
begin
inherited;
if not Assigned(FProjApply) then
FProjApply := TFrmProjApplyEx.Create(Self);
with cdsProjApply, FProjApply do
begin
CompressSelect('SELECT * FROM wp_ProjApply WHERE (RecordID = ''' + FieldByName('RecordID').AsString + ''')'
, cdsApply);
SetPageReadOnly(pnlMain, False);
SetPageReadOnly(gbInf, not btnOk.Visible);
SetPageReadOnly(mmProjContent, False);
btnOk.Visible := True;
FProjApply.ShowModal;
if CheckBack(FieldByName('RecordID').AsString) then
begin
Edit;
for i := 0 to FieldCount - 1 do
Fields[i].Value := cdsApply.FieldByName(Fields[i].FieldName).Value;
// edCorpName.Text := cdsApply.FieldByName('TypeID').AsString;
Post; end;
end;
end;
这里通过Button的OnClick事件引发:
procedure TFrmProjApplyMng.btnViewClick(Sender: TObject);
var
i: Integer;
begin
inherited;
if not Assigned(FProjApply) then
FProjApply := TFrmProjApplyEx.Create(Self);
with cdsProjApply, FProjApply do
begin
CompressSelect('SELECT * FROM wp_ProjApply WHERE (RecordID = ''' + FieldByName('RecordID').AsString + ''')'
, cdsApply);
SetPageReadOnly(pnlMain, False);
SetPageReadOnly(gbInf, not btnOk.Visible);
SetPageReadOnly(mmProjContent, False);
btnOk.Visible := True;
FProjApply.ShowModal;
if CheckBack(FieldByName('RecordID').AsString) then
begin
Edit;
for i := 0 to FieldCount - 1 do
Fields[i].Value := cdsApply.FieldByName(Fields[i].FieldName).Value;
// edCorpName.Text := cdsApply.FieldByName('TypeID').AsString;
Post;
end;
end;
end;
两个事件中的代码是一样的,问题出在红色代码部分。
ButtonEdit的OnButtonClick事件可以实现数据的即时更新,但是会提示'control'' has no parent window',而Button的OnClick事件不会出现这种情况。
或者屏蔽红色块代码,也不会报错。
不知道有没有什么解决办法呢?这里我不想用Button。
CheckBack函数来自于Frm2
function TFrmProjApplyEx.CheckBack(AID: string): Boolean;
var
Str: string;
begin
Str := 'SELECT * FROM wp_ProjApply WHERE (RecordID = ''' + AID + ''')';
FCDSArr[0].SQL := Str;
GetCDS(FCDSArr, []);
Result := (ModalResult = mrOk); //数据成功提交后,Result为True.
end;
编辑出错,上面提到的红色代码块为下面这段:
Edit;
for i := 0 to FieldCount - 1 do
Fields[i].Value := cdsApply.FieldByName(Fields[i].FieldName).Value;
// edCorpName.Text := cdsApply.FieldByName('TypeID').AsString;
Post;
一般地可以安排在两个地方:一是FORM2中,即在完成操作并写数据成功后,刷新FORM1中的信息,
另一种是根据FORM2的表单返回结果,即Form2.ModalResult的结果,在FORM1的调用FORM2代码中操作,
例:if Form2.ModalResult then
begin
adoquery1.close;adoquery1.open;
end;供楼主参考。
我现在的问题是:我在cxGrid里的其中一列添加了ButtonEdit,通过他来调用Frm2,在进行数据刷新的时候会报错"control '' has no parent window",如果不进行刷新,或者通过外面的Button调用Frm2进行刷新就不会报错。不知道该怎么解决?
在FORM1的CXGRID1的某列中,点击BUTTONEDIT事件中安排如下:
form2:=Tform2.create(self);
if form2.ShowModal=mrOK then
begin
adoquery1.close;adoquery1.open;
end;没有报错的现象啊。