调用自编Procedure 时EAccessViolation的错误(100分)

  • 主题发起人 主题发起人 litte wing
  • 开始时间 开始时间
L

litte wing

Unregistered / Unconfirmed
GUEST, unregistred user!
程序在编译时没有问题,只要一运行,就出现

Project main.exe raised exception class EAccessViolation with
message'Acces violation at address 00495358 in module
'main.exe'.read of address ffffffff',Process Stopped .Use
step or RIn cointinue.

但OK后,程序可以正常运行,请各位大虾赐教,最好详细些,我对此错误一无所知。
Procedure Init_input_Enabled(Y_N,N_N:Boolean);
Begin
With Form_Input_SCB do
Begin
DBLookupComboBox3.Enabled:=Y_N;//出现错误,删除该语句,下一语句出错
DBEdit1.Enabled:=Y_N;
DBEdit2.Enabled:=Y_N;
DbGrid2.ReadOnly:=Y_N;

DBGrid1.Enabled:=N_N;
End;
End;
 
冲程序来看,是你的Form_Input_SCB 还没建立。
 
我已经用

Try
Form_Input_SCB:=TForm_Input_SCB.Create(self);
Form_Input_SCB.ShowModal;
Finally
Form_Input_SCB.Free;
End;

建立了Form_Input_SCB.
 
Form_Input_SCB:=TForm_Input_SCB.Create(Application); // 或 ....Create(nil);

Try
Form_Input_SCB.ShowModal;
Finally
Form_Input_SCB.Free;
End;
 
我按Croco的方法试过了还是不行, Form_Input_SCB是被 Form_Menu调用的,
procedure TForm_MENU.N1Click(Sender: TObject);
begin
Form_Input_SCB:=TForm_Input_SCB.Create(Application); // 或 ....Create(nil);

Try
Form_Input_SCB.ShowModal;
Finally
Form_Input_SCB.Free;
End;
end;
 
把 Form_Input_SCB 从 Auto-Create Forms 中去掉。
 
Init_input_Enabled是在那调用的.
 
Init_input_Enabled是在Form_Input_SCB中调用的
 
Croco 的最后一点是对的。
 
能不能贴一点代码。关于Form_Input_SCB
 
把 Form_Input_SCB 从 Auto-Create Forms 中去掉是指把

Application.CreateForm(TForm_Input_SCB, Form_Input_SCB);

去掉吗?我试了将其去掉,在 Form_Input_SCB被创建时错误依然。

 
unit Input_SCB;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, StdCtrls, Mask, DBCtrls, ExtCtrls,Dm1, Buttons;

type
TForm_Input_SCB = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Panel4: TPanel;
Panel5: TPanel;
Label1: TLabel;
DBLookupComboBox1: TDBLookupComboBox;
Label2: TLabel;
DBLookupComboBox2: TDBLookupComboBox;
Label3: TLabel;
Label4: TLabel;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
Label5: TLabel;
DBEdit3: TDBEdit;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
BB_Close: TBitBtn;
Label6: TLabel;
DBEdit4: TDBEdit;
Label7: TLabel;
DBEdit5: TDBEdit;
Label8: TLabel;
DBEdit6: TDBEdit;
Label9: TLabel;
DBEdit7: TDBEdit;
Label10: TLabel;
DBEdit8: TDBEdit;
DBEdit9: TDBEdit;
BB_UP: TBitBtn;
BB_down: TBitBtn;
BB_Append: TBitBtn;
BB_repair: TBitBtn;
BB_abort: TBitBtn;
BB_del: TBitBtn;
BB_save: TBitBtn;
Edit1: TEdit;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Edit_Name: TEdit;
Edit2: TEdit;
Edit3: TEdit;
BitBtn1: TBitBtn;
Edit4: TEdit;
procedure FormActivate(Sender: TObject);
procedure BB_CloseClick(Sender: TObject);
procedure BB_AppendClick(Sender: TObject);
procedure BB_repairClick(Sender: TObject);
procedure BB_abortClick(Sender: TObject);
procedure BB_saveClick(Sender: TObject);
procedure DBGrid1CellClick(Column: TColumn);
procedure Edit1Exit(Sender: TObject);
procedure BB_AppendKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DBLookupComboBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DBEdit2KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DBLookupComboBox1Exit(Sender: TObject);
procedure BB_UPClick(Sender: TObject);
procedure BB_downClick(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
BB_Append_Sattus:Boolean; //显示BB_APPEND按钮状态
public
{ Public declarations }
end;

var
Form_Input_SCB: TForm_Input_SCB;

implementation

uses plastic;

{$R *.DFM}


//对各个字段的Enabled进行赋值
Procedure Init_input_Enabled(Y_N,N_N:Boolean);
Begin
With Form_Input_Scb do
Begin
DBLookupComboBox1.Enabled:=Y_N;
DBEdit1.Enabled:=Y_N;
DBEdit2.Enabled:=Y_N;
DbGrid2.ReadOnly:=Y_N;

DBGrid1.Enabled:=N_N;//增加时为True,修改时为False
End;
End;

//对各个按钮进行使能控制
Procedure Init_BB_Enabled(A_YN,R_YN,B_YN,D_YN,S_YN,V_DB_YN,V_E_YN:Boolean);

Begin
With Form_input_SCB Do
Begin
BB_Append.Enabled:=A_YN;
BB_Repair.Enabled:=R_YN;
BB_Abort.Enabled:=B_YN;
BB_Del.Enabled:=D_YN;
BB_Save.Enabled:=S_YN;

Dbedit1.visible:=V_DB_YN;
Edit1.Visible :=V_E_YN;
End;
End;

Procedure Check_Null(Var Pass:Boolean);
Label Last;
Var
Mes:String;


Begin
Pass:=True;
If (Dm_1.T_SCB.FieldByName('CPDm').Asstring = Null) Or
(Dm_1.T_SCB.FieldByName('CPDm').Asstring = '') Then
Begin
Mes:='请输入产品代码!';
Pass:=False;
Form_Input_SCB.DBLookupComboBox1.SetFocus;
Goto Last
End;

If (Form_Input_SCB.DBEdit1.Text = Null) Or (Form_Input_SCB.DBEdit1.Text = '') Then
Begin
Mes:='请输入生产日期!';
Pass:=False;
If Form_Input_SCB.Edit1.Enabled=True Then
Form_Input_SCB.Edit1.SetFocus;
Goto Last
End;

If (Dm_1.T_SCB.FieldByName('SCSL').Asstring = Null) Or
(Dm_1.T_SCB.FieldByName('SCSL').Asstring = '') Or
(Dm_1.T_SCB.FieldByName('SCSL').Asstring = '0') Then
Begin
Mes:='生产数量不能为空或是‘0’!';
Pass:=False;
Form_Input_SCB.DBEdit2.SetFocus;
Goto Last
End;


Last:
If (Mes='') or (Mes=Null) Then
Else
ShowMessage(Mes);


end;


procedure TForm_Input_SCB.FormActivate(Sender: TObject);
begin
Dm_1.T_SCB.Active:=True;
Dm_1.T_CPB.Active:=True;

Edit_Name.Text:=Form_plastic.S_XM;
Edit2.Text:=IntToStr(DM_1.T_SCB.RecNo);
Edit3.Text:=IntToStr(DM_1.T_SCB.RecordCount);


Init_input_Enabled(False,False);
Init_BB_Enabled(True,True,False,False,False,True,False);
BB_Append_Sattus:=False;

end;

procedure TForm_Input_SCB.BB_CloseClick(Sender: TObject);
begin
Dm_1.T_SCB.Active:=False;
Dm_1.T_CPB.Active:=False;
Close;

end;

procedure TForm_Input_SCB.BB_AppendClick(Sender: TObject);
begin
Init_input_Enabled(True,True);
Init_BB_Enabled(False,False,True,False,True,False,True);
Dm_1.T_SCB.Append;
BB_Append_Sattus:=True;
Edit2.Text:=IntToStr(DM_1.T_SCB.RecNo);
Edit3.Text:=IntToStr(DM_1.T_SCB.RecordCount + 1);

end;

procedure TForm_Input_SCB.BB_repairClick(Sender: TObject);
var
D_Date:TDateTime;
begin
Init_input_Enabled(True,False);
Init_BB_Enabled(False,True,True,False,True,False,True);
D_Date:=Dm_1.T_scb.FieldByName('SCRQ').Value;
Edit1.Text:=DateToStr(D_date);
Dm_1.T_SCB.Edit;
end;

procedure TForm_Input_SCB.BB_abortClick(Sender: TObject);
begin
Edit3.Text:=IntToStr(DM_1.T_SCB.RecordCount );

BB_Append_Sattus:=False;
Init_BB_Enabled(True,True,False,False,False,True,False);
Init_input_Enabled(False,False);
Dm_1.T_SCB.Cancel;
BB_Append.SetFocus;


end;
 
这部分代码没问题。 我猜你可能是这样的。

Form_Input_SCB在TForm_MENU声明了一个,创建的是这个。 但你在Init_input_Enabled
使用的是Input_SCB单元的Form_Input_SCB.所以出错。将TForm_MENU中的哪个
Form_Input_SCB删除就决绝问题。
 


在TForm_MENU创建语句如下:
procedure TForm_MENU.N1Click(Sender: TObject);
begin

Form_Input_SCB:=TForm_Input_SCB.Create(Application); // 或 ....Create(nil);

Try
Form_Input_SCB.ShowModal;
Finally
Form_Input_SCB.Free;
End;

end;
如果将创建的Form_Input_SCB删除,那就不能调用。

 
这个问题也该结束了,见我对同一问题另一个帖子的解答!
 
该问题已经接受答案,请见我的另一张帖子,请坛主结束该问题。
 
如果结束是指给分的话,直接把分给我就可以了,
不必麻烦斑竹大人了 :-)
 
问题已经解决,将Form 的Active Event的proceduref放到Onshow Envent 中
问题解决。
 
天哪,明明是我解决的,怎么平分了分数?
 
后退
顶部