时间: 2021-07-31 作者:daque
---- 咱们平常用的很多软硬件都具备少许回顾功效,如foxmail和thebat之类。那些软硬件能在启用时机动的维持上一次封闭软硬件时的少许状况,如窗口的初始场所,用户在软硬件中树立的少许个性(如窗口作风,横相陈设仍旧竖相陈设之类),即使能让咱们的步调也具备如许的少许功效不妨使咱们步调看上去更专科性少许:) 这边我就来讲一下还好吗使运用步调能记取上一次封闭时的窗口场所,并鄙人一次启用时和上一次的场所一律。 ---- 既是要保持消息,就确定要波及到存贮的题目。数据的存贮有好几种方法,不妨写.ini或.inf文献,还不妨用delphi供给的文献类来自设置一个文献,还不妨用数据库接口(如odbc)引入一种数据库文献,foxpro 的.dbf和access的.mdb比拟常用,还不妨径直往windows的备案内外写。写.ini和.inf文献没有任何的安定性,且不符合win95,还牢记在94,95年时用华文的windows3.第22中学洪量的用到了.ini文献,但windows95展示后,微软倡导尽大概的把消息写到备案表中。用odbc的话会给步调带来很多不需要的烦恼,如会使步调越发搀杂,须要相映的dbms的启动步调的扶助,即使没有相映数据源的启动步调,则该数据源就不许运用,再有安定性题目也不许很好的处置。 ---- 在这边引荐运用写备案表的本领。由于这种本领很简单,不需太多特殊的开支,步调比拟大略,对普遍的用户来说在备案内外找到有效的消息比翻开.ini文献要烦恼的多。以是备案表的安定性比.ini文献要略强少许。 ---- 使运用步调能记取上一次封闭时的窗口场所,并在这一次启用时和上一次的场所一律。总体思绪是如许的:在封闭步调时要记载下此次步调中断时的消息,写入备案表中,鄙人次步调启用时读备案表中相映消息,并赋给步调。 ---- 对于咱们这个步调来说重要须要记载的消息是窗口封闭时的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一览无佘的看到,以是万万不许将少许要害的消息(如暗号)不经加密而径直写入备案表,如许做利害常伤害的!!