【发布时间】:2017-05-08 19:16:02
【问题描述】:
总结: 一个表单(贷款表单)动态创建一个名为 DatePickerForm 的模态表单(当用户单击特定按钮时)。 在 DatePickerForm 中选择日期后,用户单击该表单的“关闭”按钮:(BitBtn) - 这就是导致访问冲突错误的原因。
详情:
可重用模式 DatePickerForm 的目的是为用户提供在特殊情况下输入日期的一致方式。它将用于多种其他情况 - 也就是说,如果我让它按计划工作。
确切的错误文本是:“项目 ABCD.exe 引发异常类 $C0000005 并带有消息‘访问冲突在 0x0060d0b1:读取地址 0x00000000’。”
代码编译,程序运行良好,直到下面的第 4 步:
运行时进程:
- 用户点击贷款表单上的按钮(works)
- 创建模态表单 DatePickerForm(所有者:Application),然后显示。 (有效)
- 用户从 DatePicker 控件中选择一个日期。 (有效)
- 用户点击确定按钮(失败)
- DatePickerForm 应该关闭,我们应该返回 Loan 表单 - 但发生了错误。
- 下一步将读取仍在 DatePicker 的表单 DatePicker 控件上的日期(该表单仍然存在,此时它只是不可见)
我的问题:
A) 这应该有效还是我错误地使用了动态表单创建?
B) 有没有更好的方法来实现这一点?
我们将不胜感激。
约翰
DatePickerForm 代码(完整):
unit DatePicker_PopupForm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.ComCtrls;
type
TfmDatePicker_Popup = class(TForm)
DTDatePicker: TDateTimePicker;
lblDatePrompt: TLabel;
btnOK: TBitBtn;
procedure btnOKClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmDatePicker_Popup: TfmDatePicker_Popup;
implementation
{$R *.dfm}
procedure TfmDatePicker_Popup.btnOKClick(Sender: TObject);
begin
fmDatePicker_Popup.CloseModal;
end;
end.
贷款表格 - 部分代码(完整代码大约 9700 行)
unit LoanForm;
interface
uses
Winapi.Windows, ......, DatePicker_PopupForm;
...
implementation
...
procedure TfmLoan.btnSetDefaultClick(Sender: TObject);
begin
DatePickerForm := TfmDatePicker_Popup.Create(Application);
DatePickerForm.DTDatePicker.Date := GD_ProcessDate;
DatePickerForm.ShowModal;
dDefaultDate := DatePickerForm.DTDatePicker.Date;
end;
...
end.
【问题讨论】:
标签: forms delphi access-violation