窗口每次启动是在不同的位置?

解决方案 »

  1.   

    1.窗体有一个属性 Position可以设置启动位置
    2.窗体Create或Show时设置Left, Top, Width , Height
    3.调用 SetWindowPos
      

  2.   

    1、把你的设置放到文件里或放到注册表里。改变Left, Top值。
    2、Left, Top随机取值
      

  3.   

    1.position属性
    2.在注册表中记载窗体最后的位置 create事件中进行 设置
      

  4.   

    启动的时候,调用以下CenterWindow就可以把窗体防治在桌面中间
      

  5.   

    设置form的position属性呀,比如在桌面的中心,就设成:poDesktopCenter;等等
      

  6.   

    1.position属性
    2.在注册表中记载窗体最后的位置 create事件中进行 设置
      

  7.   

    我们平时用到的很多软件都具有一定的记忆功能,如foxmail和The Bat!等等。这些软件在启动时能自动保持上一次关闭前的状态,如窗口的初始位置、用户的设置(如窗口风格,横竖排列)等等。能否使我们自己的程序也具有类似的功能呢?在本篇中我就要介绍一种方法,使应用程序能够记住上一次关闭时的窗口状态。   实现这种方法的关键是数据的存贮,目前有这几种办法:可以写*.ini或*.inf文件;可以用Delphi提供的文件类来自定义一个文件;可以用数据库接口(如ODBC)引入一种数据库文件,如Foxpro的*.dbf和Access的*.mdb;还可以直接写Windows的注册表。   我们推荐使用写注册表的办法,因为这种办法很方便,不需太多额外的开销,程序比较简单,也不易被别人更改。   要让应用程序记住上一次关闭时的窗口状态,其总体思路是:在关闭程序时记录下本次程序结束时的信息,写入注册表中,在下次程序启动时读注册表中相应信息,并赋给程序。在这个程序中需要记录的信息是窗口关闭时的Top、Left、Height、Width。(注意:要想使Delphi可以操作注册表,必须包括registry单元。)   以下是源程序和相关注释: unit Unit1; interface uses Windows, Messages,……,registry; //包括registry单元 type TForm1 = class(TForm) public ww:TRegistry; //声明一个TRegistry对象,我们就通过ww来实现对注册表的操作 //启动窗口时要做的一些工作 procedure TForm1.FormCreate(Sender: TObject); begin ww:=TRegistry.Create; //创建ww对象 ww.RootKey :=HKEY_CURRENT_USER; //注意:通过修改RootKey可以把信息写到注册表的每一个角落 ww.OpenKey('software',FALSE); //打开键software,可以看到Borland,Netscape还有Microsoft也在这个software键中 ww.CreateKey( '王伟'); //在software键中创建一个名为“王伟”的键值,使自己的名字和Borland,Netscape, //Microsoft并排在一起,是不是很Cool啊:) ww.OpenKey( '王伟',FALSE); //打开键"王伟" ww.CreateKey('XX单位XX管理系统'); //创建应用程序的名称 ww.OpenKey('XX单位XX管理系统',TRUE); ww.CreateKey('位置'); //创建应用程序中某一个要存贮的项目的名称,便于管理 ww.OpenKey('位置',TRUE); if (ww.ReadString('first')<>'1')then //这是值得注意的一个地方,通过“first”来判断程序是否 begin //是第一次写注册表,如果是第一次写则用程序给的默认值来 ww.WriteString('first','1'); //设置窗口的位置和大小。如果不是第一次启动应用程序则说明 Form1.WindowState:=(wsNormal); //注册表中已经写了位置信息,就读这些信息并赋给Form。 Form1.Top:=10; form1.Left:=10; form1.Height:=100; form1.Width:=100; end else begin if(ww.ReadString('max')='y') then //判断上次关闭程序时,窗口是否是最大化的。如果是的话,则 Form1.WindowState:=(wsMaximized) //继续使窗口拥有这一特征。 else begin Form1.top:=StrToInt(ww.ReadString('top')); //如果不是最大化,则取位置和大小数据赋给From Form1.left:=StrToInt(ww.ReadString('left')); Form1.height:=StrToInt(ww.ReadString('height')); Form1.width:=StrToInt(ww.ReadString('width')); end; end; end; //关闭窗口时要做的一些工作 procedure TForm1.FormDestroy(Sender: TObject); begin ww.OpenKey('位置',FALSE); //打开“位置”键 if Form1.WindowState=(wsMaximized) then //如果当前程序是最大化,则把这一信息写入注册表, ww.WriteString('max','y') //便于下一次时使用。 else begin ww.WriteString('max','n'); //如果不是最大化,则把窗口的位置和大小数据写入注册表中。 ww.WriteString('top',IntToStr(Form1.top)); ww.WriteString('left',IntToStr(Form1.left)); ww.WriteString('height',IntToStr(Form1.Height)); ww.writeString('width',IntToStr(Form1.Width)); end; end;   需要注意的几点:   1.因为程序不可能在第一次使用时就从注册表里读数据,所以第一次必须由程序赋一个初值,然后做上标记,以后只要判断出不是第一次了,就可以读数据了。(这点最重要,由此还可以引出一个话题,那就是可以做一个Demo版的软件,每次启动时往注册表里加个1,当它的值大于10时,就不许用该软件了,Cool吧!)   2.理论上往注册表里可以写string型数据和Integer型数据,但注册表中的Integer型数据是以16进制的形式存在的,而我们在程序中用的都是10进制数,所以就用string型,然后用StrToInt或IntToStr转换。   3.写注册表并不是绝对安全,因为它的内容可以用RegEdit一览无余地看到,所以千万不能将一些重要的信息(如密码)不经加密而直接写入注册表,这样做是非常危险的!!   另外,有兴趣的朋友还可以把这段程序做在一个DLL文件中,这样以后再做一个Project的时候就可以直接用这两个函数了,非常方便。