我刚刚编写了一个注册器 ,在工程文件里编写如下代码:
program Project1;uses
  Forms,Controls, Registry,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Unit3 in 'Unit3.pas' {Form3},
  Unit4 in 'Unit4.pas' {Form4},
  Unit5 in 'Unit5.pas' {Form5},
  Unit6 in 'Unit6.pas' {Form6},
    Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Dialogs, StdCtrls, jpeg, ExtCtrls;
{$R *.res}
var
  Myreg : TRegistry ;
  times : integer ;
begin
  Application.Initialize;
  
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);
  Application.CreateForm(TForm4, Form4);
  Application.CreateForm(TForm5, Form5);
  Application.CreateForm(TForm6, Form6);  Myreg := TRegistry.Create ;
  Myreg.RootKey := HKEY_CURRENT_USER ;
  Myreg.OpenKey('software\jysoft\',true ) ;
  times := Myreg.ReadInteger('times');
  if times > 3 then
  begin
    ShowMessage('Too Times!' );
  end
  else if times <> 999 then
  begin
    Form6.ShowModal ;
  end
  else
  begin
    Application.Run;
  end;
  Myreg.Free ;end.
为什么会抛出堆栈溢出

解决方案 »

  1.   

    读取键值时,先用String型,然后再转换成数值型:
      times := StrToIntDef(Myreg.ReadString('times'),0);
      

  2.   

    if times <> 999 then
      begin
        Form6.ShowModal ;
      end
      else
      begin
        Application.Run;
      end;
    这可能有问题哈
      

  3.   

    if 
    else if 的条件有问题啊?
      

  4.   

    Application位置不对。
    把它放到Myreg.Free ;之后。
    另外如果你要中途退出程序(times > 3)可以Application.Terminated.
      

  5.   

    "Application.Run"位置不对。
    把它放到Myreg.Free ;之后。
    另外如果你要中途退出程序(times > 3)可以Application.Terminated.
      

  6.   

    Application.CreateForm(TForm1, Form1)与Form1:=TForm1.Create(Application)有区别,
    第二种可以用ShowModal,而第一种好像不能用Showmodal,
    还有既然用了Application.CreateForm(TForm1,Form1)那么Application.Run好像是肯定需要的了!
    不如这样
    begin
      if 到期 then
         Exit;
      
      Application.Initialize;
      
      Application.CreateForm(TForm1, Form1); //好像是默认显示第一个,
      Application.CreateForm(TForm2, Form2);
      ...end.就可以了,用不着那样复杂吧