2012-08-01 232 views
0

我首先创建了一个将显示设置的表单。然后我创建了一个登录框,它将从一个ini文件中加载一个密码。我原本以为加载ini文件时出错。虽然我已经隔离它,当我加载设置表单。这是所有这些代码。尝试更改表单时出现程序错误

的设置屏幕的代码:

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
    StdCtrls, inifiles; 

type 

    TForm1 = class(TForm) 
    SaveButton: TButton; 
    AEditA: TEdit; 
    AEditB: TEdit; 
    SEditB: TEdit; 
    PEditB: TEdit; 
    PLabelA: TLabel; 
    SLabelA: TLabel; 
    ALabelA: TLabel; 
    PEditA: TEdit; 
    SEditA: TEdit; 
    ExitButton: TButton; 
    Settings: TLabel; 
    ALabelB: TLabel; 
    SLabelB: TLabel; 
    PLabelB: TLabel; 
    AReserveLabel: TLabel; 
    BReserveLabel: TLabel; 
    Label1: TLabel; 
    Label2: TLabel; 
    Label3: TLabel; 
    Label4: TLabel; 
    Label5: TLabel; 
    Label6: TLabel; 
    Label8: TLabel; 
    Label7: TLabel; 
    procedure SaveButtonClick(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    procedure ExitButtonClick(Sender: TObject); 
    procedure AEditAKeyPress(Sender: TObject; var Key: Char); 
    procedure AEditBKeyPress(Sender: TObject; var Key: Char); 
    procedure SEditAKeyPress(Sender: TObject; var Key: Char); 
    procedure SEditBKeyPress(Sender: TObject; var Key: Char); 
    procedure PEditAKeyPress(Sender: TObject; var Key: Char); 
    procedure PEditBKeyPress(Sender: TObject; var Key: Char); 

    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 
    IniFile : TIniFile; 
    appINI : TIniFile; 
    APriceA : String; 
    SPriceA : String; 
    PPriceA : String; 
    APriceB : String; 
    SPriceB : String; 
    PPriceB : String; 

implementation 


{$R *.DFM} 

procedure TForm1.SaveButtonClick(Sender: TObject); 
//Save Button 
begin 
    appINI := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini')); 
    APriceA := (AEditA.Text); 
    SPriceA := (SEditA.Text); 
    PPriceA := (PEditA.Text); 
    APriceB := (AEditB.Text); 
    SPriceB := (SEditB.Text); 
    PPriceB := (PEditB.Text); 
    appINI.WriteString('PricesA','Adult',APriceA); 
    appINI.WriteString('PricesA','Student',SPriceA); 
    appINI.WriteString('PricesA','Pensioner',PPriceA); 
    appINI.WriteString('PricesB','Adult',APriceB); 
    appINI.WriteString('PricesB','Student',SPriceB); 
    appINI.WriteString('PricesB','Pensioner',PPriceB); 
    appINI.Free; 
    ShowMessage('Settings Saved Successfully!'); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
//Displays values as the form is created 
begin 
{ appINI := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini')); 
APriceA := appINI.ReadString('PricesA','Adult',''); 
SPriceA := appINI.ReadString('PricesA','Student',''); 
PPriceA := appINI.ReadString('PricesA','Pensioner',''); 
APriceB := appINI.ReadString('PricesB','Adult',''); 
SPriceB := appINI.ReadString('PricesB','Student',''); 
PPriceB := appINI.ReadString('PricesB','Pensioner',''); 
appINI.Free; 
AEditA.Text := (APriceA); 
SEditA.Text := (SPriceA); 
PEditA.Text := (PPriceA); 
AEditB.Text := (APriceB); 
SEditB.Text := (SPriceB); 
PEditB.Text := (PPriceB);} 
end; 

procedure TForm1.ExitButtonClick(Sender: TObject); 
//Exit Button 
begin 
Close; 
end; 

procedure TForm1.AEditAKeyPress(Sender: TObject; var Key: Char); 
var s:string; 
begin 
    s := ('1234567890.'#8); //Add chars you want to allow 
    if pos(key,s) =0 then begin 
    Key:=#0; 
    showmessage('Only Numbers are allowed. Include cents!'); 
    end; 
end; 

procedure TForm1.AEditBKeyPress(Sender: TObject; var Key: Char); 
var s:string; 
begin 
    s := ('1234567890.'#8); //Add chars you want to allow 
    if pos(key,s) =0 then begin 
    Key:=#0; 
    showmessage('Only Numbers are allowed. Include cents!'); 
    end; 
end; 

procedure TForm1.SEditAKeyPress(Sender: TObject; var Key: Char); 
var s:string; 
begin 
    s := ('1234567890.'#8); //Add chars you want to allow 
    if pos(key,s) =0 then begin 
    Key:=#0; 
    showmessage('Only Numbers are allowed. Include cents!'); 
    end; 
end; 

procedure TForm1.SEditBKeyPress(Sender: TObject; var Key: Char); 
var s:string; 
begin 
    s := ('1234567890.'#8); //Add chars you want to allow 
    if pos(key,s) =0 then begin 
    Key:=#0; 
    showmessage('Only Numbers are allowed. Include cents!'); 
    end; 
end; 

procedure TForm1.PEditAKeyPress(Sender: TObject; var Key: Char); 
var s:string; 
begin 
    s := ('1234567890.'#8); //Add chars you want to allow 
    if pos(key,s) =0 then begin 
    Key:=#0; 
    showmessage('Only Numbers are allowed. Include cents!'); 
    end; 
end; 

procedure TForm1.PEditBKeyPress(Sender: TObject; var Key: Char); 
var s:string; 
begin 
    s := ('1234567890.'#8); //Add chars you want to allow 
    if pos(key,s) =0 then begin 
    Key:=#0; 
    showmessage('Only Numbers are allowed. Include cents!'); 
    end; 
end; 
//End of Settings 
end. 

登录表单代码:

unit Unit2; 

interface 

uses 
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
    StdCtrls, Mask, inifiles, Unit1; 

type 
    TForm2 = class(TForm) 
    PassEdit: TMaskEdit; 
    LoginButton: TButton; 
    PassLabel: TLabel; 
    InvisiButton: TButton; 
    procedure PassEditClick(Sender: TObject); 
    procedure LoginButtonClick(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form2: TForm2; 
    IniFile : TIniFile; 
    appINI : TIniFile; 
    Password : string; 

implementation 



{$R *.DFM} 

procedure TForm2.PassEditClick(Sender: TObject); 
begin 
PassEdit.Text := ''; 
end; 

procedure TForm2.LoginButtonClick(Sender: TObject); 
begin 
//if Password = PassEdit.Text then begin 
Form2.Hide; 
showmessage('test'); 
Form1.Show; 
end; 
//end; 
procedure TForm2.FormCreate(Sender: TObject); 
begin 
appINI := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini')); 
Password := appINI.ReadString('Login','Password',''); 
ShowMessage(Password); 
appINI.Free; 
end; 

end. 

这是项目:

program Project1; 

uses 
    Forms, 
    Unit1 in 'Unit1.pas' {Form1}, 
    Unit2 in 'Unit2.pas' {Form2}; 


{$R *.RES} 

begin 
    Application.Initialize; 
    //Application.CreateForm(TForm1, Form1); 
    Application.CreateForm(TForm2, Form2); 
    Application.Run; 
end. 
+0

你在哪里创建Form1中? (顺便说一下,您可以将相同的事件处理程序分配给多个组件。) – 2012-08-01 00:44:13

+0

实际问题是什么? – 2012-08-01 00:44:43

+0

当我点击登录按钮时,它会抛出错误,有关CPU错误或某事和程序崩溃的东西。然后卡在degug模式下,我不得不重置程序。 – 2012-08-01 00:56:10

回答

4

你注释掉代码行.dpr file that creates Form1`:

//Application.CreateForm(TForm1, Form1); 

但你在访问该Unit1形式自存:

procedure TForm2.LoginButtonClick(Sender: TObject); 
begin 
//if Password = PassEdit.Text then begin 
Form2.Hide; 
showmessage('test'); 
Form1.Show;  // <-- Accessing uncreated form here 
end; 

取消注释所以它被创建在项目文件中的行。请注意,与Application.CreateForm创建第一形式成为应用程序的主要形式,而当窗体关闭应用程序终止。

您还可以在你的代码中的另一个重大缺陷。你不应该从它自己的方法之一中引用的形式本身的名字,就像你从TForm2.LoginButtonClick内要做的:

Form2.Hide; 

这意味着,如果你重新命名形式,它不会编译,如果你创建了多个TForm2,你的代码将访问错误的代码或者访问非创建的表单(比如你现在遇到的问题)时会导致访问冲突。您应该直接使用表单的方法,如Hide;' from the method, or use Self.Hide;`来引用当前正在运行该方法的实例。 (以备参考:当你遇到问题时,如果你在解决问题的时候解释了什么是问题,那么它会有所帮助,“程序错误”没有关于错误的其他信息本身是毫无意义的。键入“错误”,你应该添加非常接下来的事情就是你有,包括包括任何地址信息的确切错误消息确切错误。我们不能看到你的屏幕来自我们坐在哪里,所以只有我们有你提供我们的帮助你去的信息。)

相关问题