FW : 删除DameWare Mini Remote Control

关闭6129端口:
选择开始-->设置-->控制面板-->管理工具-->服务找到DameWare Mini Remote Control项点击右键选择属性选项,将启动类型改成禁用后停止该服务。
到c:\winnt\system32(系统目录)下将DWRCS.EXE程序删除。
进入DOS状态,删除C:\WINNT\system32\下的DWRCS.EXE就行了。
以下是关于它的相关资料:
dwrcs-(全名:DameWare Mini Remote Control)
启动:系统服务(显示名称:DameWare Mini Remote Control)
默认端口:6129
文件:c:\winnt\system32\dwrcs.exe dwrcs.dll dwrcs.ini 
到注册表内将HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\DWMRCS表项删除这样就行了!
DWRCShell.dll在我的印象中不用删的!
关于DameWare远程监控客户端提示隐藏方法
修改dwrcs.ini
[Settings] 加入
Notify On New Connection=No
Show SysTray Icon=No
这个木马我也碰到过,怀疑是下载网络游戏外挂惹得活

posted @ 2006-01-04 11:14 青蛙學堂 阅读(1887) | 评论 (0)编辑 收藏

Access Violation at address 004CD87E in module 'MyTest.exe',Read of Address 00000008.

TCRemoteDataModule的创建是由“客户端”驱动的,“客户端”访问“服务器”才会使此模块产生实例。你可以看看project->options,数据库模块是在available forms栏。
1 将Remomd拖入auto-create forms

2 在客户端访问服务器之后,进行你的操作

注: 嘗試找到問題Form 將其設為自動創建 .

posted @ 2006-01-03 12:01 青蛙學堂 阅读(3163) | 评论 (1)编辑 收藏

FW: ghost使用方法

Ghost用法
.制作主分区镜像(备份C)
1.
启动机器后,F8,5,Ghost文件所在的磁盘,进文件夹,Ghost文件,执行Ghost.
2.
选择:选择Partition(分区操作选项),然后选择TO Image(分区内容备份成镜像),选择源分区所在的硬盘(一般为“1”),选择要制作镜像文件的分区(即源分区),这里选择分区“1”(C分区),选择镜像文件保存的位置(要特别注意的是不能选择需要备份的分区C).
3.再在“Filename”文本框键入镜像文件名称,如“C_BAK”或“C_BAK.GHO”.
4.选择文件压缩比:选"No"(“No”表示不做任何压缩;“Fast”的意思是进行小比例压缩但是备份工作的执行速度较快;“High”是采用较高的压缩比但是备份速度相对较慢)
5.完成
6.示例:   (以我的电脑为例) 启动→F8→选5→I:→CD BAK→CD Ghost→Ghost→选Local→选Partition→选TO Image→选1→选1→选最后区(I:)→输入备份文件名,如Windows98-2.GHO→选"NO"→完成
二.恢复主分区镜像(恢复C盘)
    运行Norton Ghost,在主菜单中选择“Local→Partition→From Image”项.从备份的存储盘(如I:盘)中选择刚才的主分区镜像文件C_BAK.GHO。
确定源分区(1,一般都只备一个区),选择要恢复镜像的目标硬盘,一般来说是主硬盘。选择要恢复镜像的目标硬盘中的目标分区C,注意目标分区千万不能选错.确定后有问话时,点击“Y”后就开始恢复操作。

如果想更省事,安一个冰点还原。这个软件呀,可以有选择的还原分区,所以比较体贴,只需要把系统盘(C:)设为还原模式就可以高枕无忧了,系统一重启系统盘都是你新做好的系统,也不用怕什么病毒了。哈哈,赶快装一个吧。

 

posted @ 2005-12-29 14:43 青蛙學堂 阅读(440) | 评论 (0)编辑 收藏

FW : 家庭主妇对ERP的理解

不知各位听过这么一句话没有,“把简单的事情搞复杂了,太累;把复杂的事简单化了,贡献。”在许多企业者看来,ERP(Enterprise Resource Planning)是一个很复杂的庞大的系统,要想当一次吃螃蟹的人还真不容易,这也在一定程度上阻碍了中国企业的信息化进程。在当今国际市场变化周期越来越短的情况下,中国企业信息化改革势在必行,因为企业的市场反应速度决定了企业的生存发展。企业的反应速度不是空穴来风,而是必须有科学依据的,ERP正是为我们提供这样服务的一个信息化管理系统。那么,ERP是什么东西,很复杂吗??我想在我们看完下面这个小故事后,应该就明白什么是ERP,ERP能给我们带来什么了。
家中请客
一天中午,丈夫在外给家里打电话:“亲爱的老婆,晚上我想带几个同事回家吃饭可以吗?”(订货意向)
妻子:“当然可以,来几个人,几点来,想吃什么菜?”
丈夫:“6个人,我们7点左右回来,准备些酒 烤鸭 番茄炒蛋 凉菜 蛋花汤。。。。。。,你看可以吗?”(商务沟通)
妻子:“没问题,我会准备好的,”(订单确认)
妻子记录下需要做的菜单(MPS计划),具体要准备的菜:鸭 酒 番茄 鸡蛋 作 油。。。。。。(BOM物料清单),发现需要:1只鸭,5瓶酒,4个番茄,。。。。。。(BOM展开),炒蛋需要6个鸡蛋,蛋花汤需要4个鸡蛋(共用物料)。
打开冰箱一看(库房),只剩下2个鸡蛋(缺料)。
来到自由市场,妻子:“请问鸡蛋怎么卖?”(采购询价)
小贩:“1个1元,半打5元,1打9.5元。”
妻子:“我只需要8个,但这次买1打。”(经济批量采购)
妻子:“这有一个坏的,换一个。”(验收,退料,换料)
回到家中,准备洗菜 切菜 炒菜。。。。。。(工艺路线),厨房中有燃气灶 微波炉 电饭堡。。。。。。(工作中心)。妻子发现拔鸭毛最费时间(瓶颈工序,关键工艺路线),用微波炉自己做烤鸭可能就来不及(产能不足),于是决定在楼下的餐厅里买现成的(产品委外)。
下午4点,电话铃又响:“妈妈,晚上几个同学想来家里吃饭,你帮准备一下。”(紧急订单)
“好的,儿子,你们想吃什么,爸爸晚上也有客人,你愿意和他们一起吃吗?”
“菜你看着办吧,但一定要有番茄炒鸡蛋。我们不和大人一起吃,6:30左右回来。”(呵呵,不能并单处理)
“好的,肯定让你们满意。”(订单确认)
鸡蛋又不够了,打电话叫小贩送来。(紧急采购)
6:30,一切准备就绪,可烤鸭还没送来,急忙打电话询问:“我是李太,怎么订的烤鸭还没送来。”(采购 委外单跟催)
“不好意思,送货的人已经走了,可能是堵车吧,马上就会到的。”
门铃响了,“李太,这是您要的烤鸭。请在单上签一个字。”(验收 入库 转应付帐款)
6:45,女儿的电话:“妈妈,我想现在带几个朋友回家吃饭可以吗?”(呵呵,又是紧急订购意向,要求现货)
“不行呀,女儿,今天妈妈已经需要准备两桌饭了,时间实在是来不及,真的非常抱歉,下次早点说,一定给你们准备好。”(哈哈,这就是ERP的使用局限,要有稳定的外部环境,要有一个起码的提前期)
送走了所有客人,疲惫的妻子坐在沙发上对丈夫说:“亲爱的,现在咱们家请客的频率非常高,应该要买些厨房用品了(设备采购),最好能再雇个小保姆(连人力资源系统也有接口了)。”
丈夫:“家里你做主,需要什么你就去办吧。”(通过审核)
妻子:“还有,最近家里花销太大,用你的私房钱来补贴一下,好吗?”(哈哈哈哈,最后就是应收货款的催要)

posted @ 2005-12-29 12:59 青蛙學堂 阅读(469) | 评论 (0)编辑 收藏

TTimer : Delphi编写获取和设置系统时间程序

本实例介绍如何在程序中动态地显示当前系统时间,并且可以设置系统时间。

  向窗体上添加一个TTimer组件和两个TDateTimePicker组件,其中TDateTimePicker组件用于显示和设置系统的日期和时间,它们的Kind属性分别设置为dtkDate和dtkTime,这样它们分别显示日期和时间。而TTimer组件则执行定时操作。设计完成的主界面如图1所示。


图1 主界面

  TTimer组件的Interval属性设置为1000,这样,每隔1000毫秒就会执行下面的响应代码:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 self.DateTimePicker1.Date:=Now;
 self.DateTimePicker2.Time:=Now;
end;

  Now函数的返回值中既有当前的日期,也有当前的时间。这样,通过TTimer组件的OnTimer过程中的self.DateTimePicker1.Date:=Now语句在DateTimePicker1组件中动态显示当前日期,通过self.DateTimePicker2.Time:=Now语句在DateTimePicker2组件中动态显示当前时间。

  下面说明如何在程序运行过程中修改系统时间。

  在程序运行过程中,如果用户手动修改了DateTimePicker2组件中的时间,那么就会激活以下代码:

procedure TForm1.DateTimePicker2Change(Sender: TObject);
 var
  MyTime:TSystemTime;
 begin
  DateTimeToSystemTime(self.DateTimePicker2.Time,MyTime);
  Timer1.Enabled:=false;
  SetLocalTime(MyTime);
  Timer1.Enabled:=true;
 end;

  程序首先把DateTimePicker2组件中的时间格式转化为系统时间格式。然后设置TTimer组件为无效状态,同时通过SetLocalTime函数把在DateTimePicker2组件中修改后的时间设置为系统时间。最后设置TTimer组件为有效状态。

  在程序运行过程中修改系统日期的方法,与修改系统时间的方法大体相同。

  程序代码如下:

unit Unit1;

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, Calendar, ExtCtrls, ComCtrls;

type
 TForm1 = class(TForm)
 DateTimePicker2: TDateTimePicker;
 DateTimePicker1: TDateTimePicker;
 Timer1: TTimer;
 procedure Timer1Timer(Sender: TObject);
 procedure DateTimePicker2Change(Sender: TObject);
 procedure DateTimePicker1Change(Sender: TObject);
private
 { Private declarations }
public
 { Public declarations }
end;

var
 Form1: TForm1;
 implementation
 {$R *.dfm}
 procedure TForm1.Timer1Timer(Sender: TObject);
begin
 self.DateTimePicker1.Date:=Now;
 self.DateTimePicker2.Time:=Now;
end;

procedure TForm1.DateTimePicker2Change(Sender: TObject);
 var
  MyTime:TSystemTime;
 begin
  DateTimeToSystemTime(self.DateTimePicker2.Time,MyTime);
  Timer1.Enabled:=false;
  SetLocalTime(MyTime);
  Timer1.Enabled:=true;
end;

procedure TForm1.DateTimePicker1Change(Sender: TObject);
 var
  MyDate:TSystemTime;
 begin
  DateTimeToSystemTime(self.DateTimePicker1.Time,MyDate);
  Timer1.Enabled:=false;
  SetLocalTime(MyDate);
  Timer1.Enabled:=true;
end;
end.

  保存文件,然后按F9键运行程序,程序运行的初始画面如图2所示。


图2 程序运行的初始画面

  读者可以在程序运行过程中,手动修改系统的日期或时间,如图3所示。


图3 程序运行结果

  本实例不但涉及到了利用Now函数来获得当前的时间和日期,而且还涉及到了如何将TDateTime格式转换为TSystemTime格式,并且设置为系统时间。

posted @ 2005-12-15 12:05 青蛙學堂 阅读(3836) | 评论 (1)编辑 收藏

FW : 判断已创建的窗体是否释放掉

我想判断已创建的窗体是否释放掉,若释放则重新创建
如何使得函数:assigned(Form1)的值为false呢??

当你的这个窗体没有创建或者释放调以后就是false的啊

procedure TFrmWarning.FormClose(Sender: TObject; var Action: TCloseAction);

begin
     Action := caFree
。。。

if not assigned(FrmWarning) then
      FrmWarning:=TFrmWarning.Create(FrmWarning);
但assigned(Form1)还是为真,请教?

FORM1不存在,那个值就是FALSE
如果想自己设,用BOOLEAN变量

在DESTROY中把 Form1:=nil就可以了。

//另外一种方法也可以判断一个窗体是否创建~~
begin
  if Assigned(Application.FindComponent('Form2')) then
    {  }
  else begin
    Form2 := TForm2.Create(Application);
  end;
  Form2.Show;
end;

procedure TFrmWarning.FormClose(Sender: TObject; var Action: TCloseAction);

begin
     Freeandnil(TFrmWarning);
//...

if not assigned(FrmWarning) then
      FrmWarning:=TFrmWarning.Create(FrmWarning);
ok^_^





posted @ 2005-12-14 09:16 青蛙學堂 阅读(444) | 评论 (0)编辑 收藏

FW : 英文网址大全[分享]

一本英文e杂志
http://www.clevermag.com/
  
  golden age of radio
http://www.old-time.com/
  
  有趣的英文漫画站点
http://www.dilbert.com/
  史努比 snoopy
http://www.snoopy.com/
  
  英语沙龙/文摘
http://www.es123.com/wz/
http://www.es123.com/
  
  《英语学习》
  
http://www.beiwaionline.com/englishstudy/index.htm
  Disney网站
http://disney.go.com/disneyrecords/song-albums/Childrens_Favorites/
  
  读者文摘:
http://www.rd.com/
  Animal Pictures Archive
http://www.animalpicturesarchive.com/
  
  大英博物馆
http://www.thebritishmuseum.ac.uk/
  英文公共图书馆和数码照片档案馆
http://www.ibiblio.org/
  一个很好的多媒体网站
http://aimovie.warnerbros.com/html/flash.html
  
http://www.hkedcity.net/english/
  
  在线广播课程
  
  空中英语教室:
http://www.goodtv.com.tw/realhtml/
  英语一分钟:
http://www.etvonline.tv/etv/front/subject.jsp?CS_RER_NBR=41
  解析英语:
http://www.ivy.com.tw/listen.htm
  空中美语
http://www.englishtide.com/
http://www.english4u.net/amcstart.htm
  LIVE互动英语
http://www.liveabc.com/
http://broadcast.liveabc.com/abc/
  EZ美语会话
http://www.eztalk.to/
  
http://media.tjfsu.edu.cn/
http://unit.cug.edu.cn/EnglishStudy/
http://www.jsol.net/vod/
http://www.xinlian.com.cn/school/media/
  
  教授英语写作的站点
  
http://home.njenet.net.cn/ewriting/w/ewriting.htm
http://webster.commnet.edu/writing/writing.htm
http://www.cyberedit.com/?AID=876227&PID=600300
http://owl.english.purdue.edu/
  Englishtown的免费资源,可以帮你修改简历
http://www.englishtown.com/master/club/resources/
  
  免费语法教程
  
  网络英语教室
http://www.englishfree.com.cn/gb/home/
http://www.edufind.com/english/grammar/subidx.cfm
  
  免费英语在线课程
  
http://www.manythings.org/
http://www.englishpage.com/
http://www.eslpartyland.com/
http://www.english-at-home.com/
http://www.englishclub.com/
http://www.longman-elt.com/index.html
http://www.iei.uiuc.edu/free.html
http://www.focusenglish.com/
  最棒的英语听力站点esl-lab
http://www.esl-lab.com/
  friends的一个站点
http://www.topcmm.com/friends/
  儿童英语学习站点
http://www.kizclub.com/
http://www.yahooligans.com/ 
  
  翻译类站点
  
  中国翻译网
http://www.chinatranslate.net/asp/index.asp
http://www.chinatranslate.net/garden/garden1.htm
  译者
http://www.cn-trans.com/
http://www.cn-trans.com/goodsites.htm
http://www.cn-trans.com/clubmag.htm
http://www.cntranslators.com/mtsbbs/
  经贸部翻译园地
http://www.moftec.gov.cn/fyyd/index.shtml
  中国译协
http://www.tac-online.org.cn/
  翻译者家庭助手
http://www.lai.com/companion.html
  自由翻译者冯京葆的个人网站
http://www.jbfeng.com/
  汉英论坛
http://www.bilinguist.com/
  
  新闻学习类站点
  
  *** Newsroom and Worldview for ESL“ web exercises.
http://lc.byuh.edu/***_N/***-N.html
http://literacynet.org/***sf/archives.html
  ***相关站点:
ftp://149.2.140.10/realaudio/***/english/
http://66.216.96.84:3001/
  英语新闻News Now在线直播网址:
http://www.***news.com/real/live/newsnow.ram
  特别英语文字材料搜索网址:
http://www.IBB.GOV/search?NS-collection=Special_English
  听力快车:
http://www.listeningexpress.com/
  普特听力
http://www.putclub.com/
  自由mp3联盟:
http://mpfree.org/english/englishmain.htm
  
  考试类站点
  
  寄托天下:考G/T的天下
http://www.gter.net/index.jsp
  太傻单词:最新的GRE必考单词
http://www.taisha.org/
http://www.mba8.com/
  考试资源网
http://www.examres.com/index.htm
  恩波教育在线
http://www.enboedu.org/kytm.htm
  高教考研网
http://www.kaoyanren.com/web/default.asp
  
  英语书籍下载
  
http://www.bizzydays.com/freeebooks.htm
http://success.hotsales.net/
http://gaichi.nease.net/English/ENGLISH.htm
  
  英语站点索引
  
http://www.studyfuture.net/default.htm
http://userpages.umbc.edu/~kpokoy1/grammar1.htm#refs
http://www.tolearnenglish.com/
http://www.edufind.com/
http://come.6to23.com/***/language/back/057.htm /cgi-bin/view.cgi?forum=43&topic=67
http://www.edu.cn/HomePage/jiao_yu_zi_yuan/index_cernet.shtml
  
  中国文化专辑
  
  中国民俗网:
http://www.chinesefolklore.com/
  中国文化信息网
http://www.ccnt.com.cn/
  CHINA VISIT
http://www.chinavista.com/entravel/culture.php
  锦绣中华
http://www.chinapage.com/china.html
  香港电台中国文化频道
http://www.rthk.org.hk/chiculture/
  
  中国英文资讯站点
  
  南华早报:
http://www.scmp.com/
  中国日报
http://www1.chinadaily.com.cn/
  央视国际:
http://www.cctv.com/english/
  CRI CHINA
http://english.cri.com.cn/
  21世纪报
http://www.21stcentury.com.cn/
  新华网
http://www.xinhuanet.com/english/index.htm
  今日中国
http://www.chinatoday.com.cn/English/ctenglish.htm
  人民画报
http://www.rmhb.com.cn/chpic/htdocs/English/index.htm
  HONGKONG RADIO ON LINE
http://www.rthk.org.hk/
  
  旅游商务网站
  
  华尔街
http://online.wsj.com/public/us
  ACCA官方网站
http://www.acca.org.uk/
  一个提供世界上货币、时间等转换资讯的有用站点
http://www.oanda.com/
  一个很好的旅游资讯站点
http://www.roughguides.com/
  旅游商务在线
http://www.joc.com/
  合同文本大全
http://falv.3322.net/
  
http://www.businessweek.com/
http://www.fortune.com/
http://www.forbes.com/ 
http://www.economist.com/
  
  美国图书馆
  
  美国国会图书馆
http://www.coc.gov/
  美国国家医学图书馆
http://www.nlm.nih.gov/
  美国国家农业图书馆
http://www.nalusda.gov/
  美国普林斯顿大学图书馆
http://infosharel.princeton.edu:2003/
  美国斯坦福大学图书馆
http://palimpsest.stanford.edu/
  美国麻省理工学院图书馆
http://libraries.mit.edu/
  
  综合类英语教育站点
  
  常春藤英语
http://www.ivy.com.tw/
  小笨霖的英语网站
http://www.cae.wisc.edu/~kunlin/notebook/
  黛西美语世界
http://daisyland.tierranet.com/english.htm
  英语传教士
http://www.ep66.idv.tw/
  
  空中英语教室网站
http://www.studioclassroom.com.tw/
http://www.letstalk.com.tw/
  洪恩英语在线
http://www.hongen.com/eng/index.htm
  英文锁定
http://www.icansay.com/
  英语ABC
http://www.englishabc.com/
  English, baby!
http://www.englishbaby.com/
  最常用的提问网站
http://www.ask.com/
  知识在线
http://www.db66.com/
  英语之声
http://www.english.ac.cn/index.html
  中青网英语角
http://www.cycnet.com/englishcorner/
  
  其他站点
  英语姓名小常识
http://www.cycnet.com/englishcorner/background/englishname.htm
  一个很好的英语学习软件Divace
http://www.divace.com/index.html
  东方博士软件库>>英语类
http://www.helpwork.net/soft/html/user/softnevig.asp?BID=1102
  英语手势语大全
http://www.englishchina.com/hand%20sign/index.htm
  
  美国资讯
http://www.usembassy-china.org.cn/irc/usainfo/
http://www.whitepages.com/
  NASA官方有声新闻
http://science.nasa.gov/headlines/news_archive.htm
  
  其他新闻资讯类站点
  
  联合国在线
http://www.un.org/av/
http://www.guardian.co.uk/ 
http://www.thetimes.co.uk/ 
http://news.ft.com/home/rw/ 
http://www.nytimes.com/ 
http://abc.abcnews.go.com/ 
http://www.usatoday.com/ 
http://online.wsj.com/public/us 
http://www.mirror.co.uk/ 
http://www.***.com/
http://www.sky.com/skycom/home/
http://www.roughguides.com/
http://www.oanda.com/
  
  英文网络词典
  
http://www.m-w.com/    韦氏在线词典
http://www.iciba.net/     金山词霸在线
http://language.chinadaily.com.cn/vocabulary.shtml 
  中国日报网站:许多时事新词和中国的特色词汇的英译在这都可找到
http://titania.cobuild.collins.co.uk/  柯林斯大词典
http://www.oed.com/    牛津英语词典
http://www.ucc.ie/info/net/acronyms/ 缩略语查询
http://www.dreye.com.cn/english/index.html  Dr.eye译典通(双语)词汇测试
http://www.findlaw.com/     法律与经济学资料库 
http://www.amosweb.com/     AmosWorld经贸术语汇编
http://www.forumcn.com/acd/dict.php3   英汉互译财会词典
http://home.ust.hk/~lbsun/terms.html    英汉计算机及网络通讯技术词汇
 www.roboword.com.cn      全医药学大辞典:网际金典Ver3.2
http://s9.com/biography/search.html  名人查询
http://humanum.arts.cuhk.edu.hk/Lexis/Lindict/ 林语堂汉英词典
http://www.getty.edu/research/tools/vocabulary/tgn/index.html 地名大词典
http://www.bartleby.com/reference/ 美国最大的免费在线参考网站
http://www.encycolpedia.com 在线简明哥伦比亚百科全书
http://education.yahoo.com/reference/encyclopedia/index.html 在线简明牛津百科全书
http://dico.isc.cnrs.fr/dico/en/search同义词电子词典,英英
http://www.thesaurus.com/ www.dictionary.com )综合词典,同义词/反义词,分类,英英。
http://sunrain.net/太阳雨汉英英汉词典
http://www.yourdictionary.com/
http://zhongwen.com/zi.htm
  http://www.cntranslators.com/fyzy/chinese/zxfycd.htm

posted @ 2005-12-02 18:01 青蛙學堂 阅读(866) | 评论 (2)编辑 收藏

FW : DNS维护一点通

在设置使用Windows 2000 Server服务的时候,维护工作是非常重要的。下面就和大家交流一下维护和排除DNS故障的方法。

  一、使用Dnscmd方便维护DNS系统

  与UNIX或脚本命令类似,Windows 2000的资源工具包提供了一个叫做Dnscmd的命令行程序,它用来管理DNS服务器。

  该工具可用于不同任务:

  1.创建脚本或批处理文件,使DNS中每日的管理进程自动化。它特别适合设置使用文本文件的标准DNS主要区域的情况。

  2.更新资源记录。

  3. 建立并配置新的DNS服务器。

  Dnscmd的安装很简单:

  1.将Dnscmd文件从Win 2000 Server CD-ROM光盘的supportenterprise eskit文件夹复制到DNS服务器中你选择的文件夹中即可。如cwinntsystem32dns文件夹下。注意,Win 2000 Professional光盘中不存在这个程序。

  2.在“运行”菜单或命令行提示符上键入DNSCMD或加上不同参数进行维护工作。

  二、用好Ping命令

  相信大家对Ping命令都比较熟悉,它使用ICMP协议检查网络上特定IP地址的存在,一个DNS域名也是对应一个IP地址的,因此下面的命令可以检查一个DNS域名的连通性:

  Ping www.kwsoffice.com

  假如一客户端不能解析DNS域名,使用上述命令可以判断该客户端与DNS服务器的连通性。然后可以再Ping网络中的其它客户端。如果都Ping不通,说明该客户端有问题,如果后者可以Ping通,则说明DNS配置错误或DNS服务器错误。

  三、用Ipconfig设置DNS

  直接在命令提示符下执行Ipconfig命令可以查看DNS服务器的配置情况(图1)。该命令还可以手工更新一个客户的DNS注册,排除DNS名称注册失败的故障,或对DNS服务器动态更新故障。使用命令Ipconfig registerdns可以更新或排除一个客户的DNS注册故障,因为该命令将刷新DHCP的租约并注册计算机的主机名。

图1

  四、使用Nslookup诊断

  Nslookup是诊断DNS的实用程序,它允许与DNS以对话方式工作并让用户检查资源记录,它也在命令行上运行,语法如下:

  Nslookup -optionhostname server

  -option指定一个或多个命令行选项。例如要列出命令清单。

  Hostname:使用用户指定的主机名,缺省使用用户指定的服务器。

  Server:使用用户指定的DNS服务器,缺省指定使用在TCP/IP网络配置中指定的DNS服务器。

posted @ 2005-12-02 13:02 青蛙學堂 阅读(185) | 评论 (0)编辑 收藏

FW : 創建子窗體---------Delphi文本编辑器的设计

本章介绍多文本界面(MDI)、多页面界面(MPI)技术;VCL库中TMemoTEdit 控件以及有关文本编辑的常用对话框的使用。我们开发的MPIEdit.dpr是一个文本编辑的实用程序,可实现如下功能:

  ● MDI的编辑环境

  ● MPI的编辑环境

  ● 创建打开、编辑、保存文件

  ● 查找、替换文件中指定的字符串

  ● 复制、粘贴、剪切字符串

  ● 设置文件字体大小

  ● 打印文件 

  本章将通过MPIEdit实用程序逐一介绍在Delphi中如何实现上述功能。

  文本编辑器是一种常用的应用程序。用户在编辑器中编辑多种文件,在多个文件之间进行数据交换,对文件进行各种属性设置,并按自己要求打印文件。 

4.1 多文本界面 

  多文本界面是一种在一个应用程序中同时打开两个或更多文件的界面形式。例如在字处理程序可同时打开多个文件,用户可在多个文件中方便地进行切换.

MDI应用程序提供了一种方便的方式,使得用户在同一工作区域内对多个文档进行观察和交换数据。MDI工作区域可分为父窗体和子窗体,在DephiMDI应用程序中,父窗体通常是程序的主窗体。

  在MDI中,父窗体之外的窗体称为子窗体,文档或其它数据在子窗体打开。这些文档可以是相同的文件格式,或在应用程序支持下也可以是不同的文件格式。

  在设计阶段,可创建 MDI 父窗体作为应用程序主窗体, 亦可创建子窗体样板。Delphi允许创建多个子窗体类型,但MDI应用程序只支持其中的一种。

  本节讲述创建MDI应用程序的基本步骤:

  ● 创建主窗口

  ● 创建子窗口

  ● 创建主窗口菜单

  ● 融合菜单

  ● 运行时创建子窗口 

4.1.1 创建父窗口 

  在MDI应用程序中,主窗口为应用文档提供一个工作区域。这个区域可打开一个或多个子窗口,创建父窗口是建立MDI应用程序的第一步。

  创建父窗口与其它窗口类似,不同之处在于设置窗体的FormStyle属性。

  FormStyle属性可决定一个窗体是父窗口还是子窗口,或不是MDI类型。 只能在设计阶段确定FormStyle。在Object Inspector窗口中将FormStyle属性设置成fsMDIForm。值得注意的是应当把父窗口定义为应用程序的主窗体,否则程序编译会出错。 

4.1.2 创建子窗口 

  设计阶段可创建子窗口的样板,用户在运行进使用样板的实例。子窗口是缺省可见的,如果应用程序在运行进创建子窗口,不要让Delphi自动地创建。

  创建子窗口时将窗体的FormStyle属性设置为fsMDIChild。如果程序在运行时创建子窗口,则

  1. 选择OPtions|Project菜单,系统弹出自动创建列表对话框;

  2. 在自动创建列表中选中子窗口;

  3. 单击>按钮将子窗口移至可得到(Available)窗体列表;

  4. 并单击OK按钮退出。

4.1.3 创建应用程序菜单与菜单融合 

  父窗口的菜单应作为应用程序主菜单。如果子窗口有菜单, 则当子窗口在运行获得焦点并最大化时,子窗口的菜单项将融合父窗口菜单。

  创建父窗口与子窗口菜单的方法与创建普通窗体菜单类似, 详细步骤见第一章。菜单融合是指程序运行过程中,子菜单与父窗口菜单的相互作用。 如当子窗口获得焦点时,子窗口的菜单或插入主窗口的菜单中,或将替换部分或全部的父窗口菜单。

  进行菜单融合需设置的两个属性:

  ● 窗体的Menu属性

  ● 菜单项的GroupIndex属性

       Menu属性定义窗体的活动菜单,而菜单融合只对活动菜单进行。如果窗体有多个菜单部件,运行时可通过以下代码进行改变:

  Form1.Menu := SecondMenu; 

        GroupIndex属性决定出现在菜单条中各菜单项的位置,在菜单融合中,GroupIndex 将

决定融合菜单是插入还是替换主窗体菜单条中的菜单。

  GroupIndex的缺省值是0,可以用下规则确定其值:

  1. 数值越小,菜单的位置越靠左。

  例如:GroupIndex为0的菜单将出现在菜单条中的最左端。随着GroupIndex数值的增大,菜单项依次向右排列。

  2. 若需替换主菜单中的某一菜单项,则将子菜单相应菜单项的GroupIndex设为与之相等的值。这条规则适合一个或多个菜单项。例如,主菜单中的"Edit"菜单项的GroupIndex 的值为1。将子菜单的一个或多个菜单项的GroupIndext的值设为1,则在运行时,这些菜单项替换主窗口的"Edit"菜单。

  将同一窗体的多个菜单项的GroupIndex设为相同值,原有的排列顺序在菜单融合时将保持

不变。

  3. 若要在菜单融合时插入菜单项,需在主菜单中预留数值“位置”。例如,主菜单的两菜单项数值为0,5,则子菜单GroupIndex数值为1,2,3,4的菜单在融合时将插入其中。

  在使用MDI界面时,用户通常会打开多个窗体。为了使用户方便地进行窗体切换,常设有一个进行切换的菜单项.此菜单列出了打开窗体的名称,当用户选择其中的一个时,程序进行相应的窗体切换。在DelphiMDI设计时,可非常方便地实现这一功能。方法是将父窗口的WindowMenu设置成该菜单项的名字即可。

4.2 多页面界面 

  多页面界面是一种非常友好的界面形式。它由一个窗体和多个页面组成, 关于每个页面的信息列在窗体底部的标签(Tabs)上,用户可通过选择标签来进行页面切换。 每次只有一个页面显示在窗体中。MPIMDI使用更为方便,且切换速度更快。本章例程就是多页面界面的例子。另外Delphi集成开发环境中的代码编辑(Code Editor)窗体是MPI应用在文本编辑中的实例。在MPI中,一个窗体内的多个文件可以方便地进行切换和交换数据。

       多页面界面分为静态MPI和动态MPI两种形式。静态MPI的标签数量固定,用户在事先设计好的多个页面上进行切换。象选择对话框(Option Dialog)就属于静MPI。动态MPI的标签数量不固定,由程序根据需要动态的产生或消除,象代码编辑窗体就是动态MPI,程序可根据用户的需要产生多个文本页面,也可以动态地关闭页面。利用DelphiTNotebookTtabset 可十分方便地设计静态MPI。设计动态MPI则需要编写专门的代码。

4.2.1 静态多页面界面 

  TNotebook,TTabSet可用来开发静态多页面界面。TNotebook部件能显示多页, 每页都有相应的控制。通常TNotebookTTabset配合进行控制。TTabset 有一组水平的标签,每个标签可通过创建字符串列表进行某种控制。

  MPIEDit例程中的主窗体中有一个TNotebook 部件和 TTabSet 部件。 把两个部件的Aglin属性设置成bsTopbsBotton,使它们分别处在窗体的上下两部分。为了使TTabSetTNotebook配合工作,使用下代码: 

  TabSet1.Tabs := Notebook1.Page; 

       另外,在TabSetOnClick事件中定义下如下代码,可使用户在选择标签时开打相应的页。 

  procedure TEditForm.TabSetClick(Sender : TObject);

  begin

Notebook1.PageIndex := TabSet1.TabIndex;

end; 

        设计静态MPI时,可在部件窗体(Component Palette)WIN31页面中选中TNotebook 部件,然后在Object inspector窗体中双击TNotebookPages属性,Dephi 将弹出对话框,用户可以在此确定Notebook的页数和字符串列表,如图4.6。关闭对话框后, 可对每一页进行设计,使用鼠标右按钮弹出快速菜单进行页面切换。

4.2.2 动态多页面界面 

  使用Delphi进行静态MPI设计非常简单,进行动态MPI设计则需编写专门的代码。

于一个多页面文本编辑器,应能实现以下功能:

  ● 动态生成页面,每个页面均能进行文本编辑

  ● 动态关闭页面,直到窗体中只有一个页面为止

  ● 页面切换不影响各种文本编辑操作 

  为了实现以上功能,程序中使用了动态页面类(TDynaPage),其定义如下: 

  type TDynaPage = Class(TObject); 

该类可根据需要动态的产生页面, 每个页面上创建了可进行文本编辑的TMeno部件。 

  procedure...

  puclic

CurPage : integer;

FileList : TSringList;

end; 

        CurPage表示当前用户选择的页面数,用户切换、增加、删除页面均影响CurPage 的值,CurPage初如化为零页。FileList存放打开或创建文件的名字以及与这些文件相关的编辑部件TMemo,页面动态创建、删除将影响FilstList的值。

  TNotebook部件创建后至少有一个页面,因此Pages属性不是空值,只要往Pages中加入字符串,Delphi自动地把该字符串与TPage类对象相联系。TPage类是TCustomEdit派生出来的,在对象浏览器(Object Browse)中可观察到TPage的数据成员和方法。静态生成的页面也是 TPage类。

  要创建多页面编辑器,必须从TPage的父件(Parent属件)创建相应编辑部件。但在动态创建页面时,TPage只是一个与字符串相联系的TObject类,不能写成: 

  MemoParent := Notebook1.Pages.Object[ ]; 

Delphi中,宣称对象和创建对象都是用指针来标识, 因此可用无类型指针进行指针传递。 

  var

Pi : Pointer;

begin

Pi := Notebook1.Pages.Object[];

Memo.Parent := Pi;

end; 

这样就可在TPage上动态创建编辑部件了。

  往Notebook1中动态生成页面时,页面应所相应的切换,TDynaPage. Notebook1.Tabset1有关的属性要作相应的调整。

            TDynaPageDynaAdd方法定义如下: 

procedure TDynaPage.DynaAdd(Sender:TNotebook;FileName:String);

var

Pi:Pointer;

Memo:TMemo;

begin

Sender.Pages.add(FileName);

Pi:= Sender.Pages.Objects[Sender.Pages.Count-1];

DynaMemo(pi);

DynaPage.FileList.addObject(FileName,Memo1);

EditForm.TabSet1.Tabs := Sender.Pages;

EditForm.Tabset1.TabIndex:=Sender.Pages.Count-1;

EditForm.Notebook1.PageIndex := EditForm.Tabset1.TabIndex;

DynaPage.CurPage:= Sender.Pages.Count-1;

end; 

procedure DynaMemo(Pi:Pointer);

var

Memo:TMemo;

begin

Memo:=TMemo.Create(Pi);

Memo.Parent:=Pi;

Memo.Align:=alClient;

Memo.borderStyle:=bsNone;

Memo.HideSelection:=False;

Memo1:=Memo;

end;

procedure TDynaPage.Del(Sender:TNotebook;No:integer);

var

Pi:pointer;

begin

Sender.Pages.delete(No);

EditForm.TabSet1.Tabs.delete(No);

Filelist.Delete(No);

DynaPage.CurPage:=EditForm.TabSet1.TabIndex;

Sender.PageIndex := EditForm.Tabset1.TabIndex;

Pi:=FileList.Objects[DynaPage.CurPage];

Memo1:=Pi;

EditForm.Caption:=Sender.Pages.Strings[DynaPage.CurPage];

end;

  当用户在多个页面中进行切换时,程序应当保证对当前页面进行编辑。 例如在多页编辑器中,用户选中某一页面,即可对该页面中的文件进行编辑、寻找、设置、打印等。为了实现这一功能,定义了一个TMemo类型的变量:Memo1,该变量没有实例化,每次调用DynaAdd,DynaDel方法均定把TabIndex指定页面的Memo指针传给Memo1。这样在程序运行中,始终有一个实例化的Memo指针赋给Memo1,而菜单中的文本编辑功能均对Memo1进行操作。这种指针传递就能保证对当前页进行操作。

  定义了TDynaPage后,只需在Open,Close菜单项中加入如下代码,即可方便的在用户打开关闭文件时创建成删除页面。 

 procedure TEditForm.Close1Click(Sender: TObject);

begin

if DynaPage.CurPage<>0 then

DynaPage.Del(Notebook1,DynaPage.CurPage);

if Notebook1.Pages.count = 1 then

Close1.Enabled:=False;

end; 

procedure TEditForm.Open1Click(Sender: TObject);

begin

if OpenDialog1.Execute then

begin

if not(OpenFile or NewFile) then

begin

OpenFile:=true;

Open(OpenDialog1.FileName);

Notebook1.Pages.Strings[0]:=ExtractFileName( OpenDialog1.FileName);

TabSet1.Tabs:=Notebook1.Pages;

end

else

begin

DynaPage.DynaAdd( Notebook1, ExtractFileName(OpenDialog1.FileName));

Open(OpenDialog1.Filename);

if Notebook1.Pages.count > 1 then

Close1.Enabled:=True;

end;

end;

end; 

4.3 文本编辑部件及应用 

4.3.1 TEdit 部件 

        TEdit部件是一个标准的编辑框,用户可在编辑框中输入数据。编辑框也可向用户显示数据。编辑时只能读写一行信息。

   TEditText属性存放着用户输入的数据或向用户显示的数据,Modified属性用以标识 Text的数据是否改变,可通过设置Maxlength属性值来限制用户输入字符的个数量,CharCase

          属性可定义编辑框中字符的大小写。如果设计者想禁止用户输入,可将ReadOnly属性设置成真值。编辑框也能用做密码输入框。通过设置PassWordChar 属性的值,可将用户输入的字符在编辑框中显示成指定的字符,如"*"号等。编辑框还可以进行字符选择操作、粘贴、复制和剪切操作。 

4.3.2 TMemo 部件 

       TMemo部件与TEdit部件类似,能向用户显示数据,用户也可输入数据。与TEdit 部件

不同的是,TMemo部件可以处理多行文本,因此主要用于编辑文件。

  TMemoText属性只能在运行时才能访问。Modified属性用以标识Text的数据是否改

变,通过设置MaxLength属性值来限制用户输入字符的数量。

  如果把文本当成一个整体进行访问,可使用Text属性;若想逐行访问,则要使用Lines属性。Lines属性能对文件更方便地进行访问。LinesTStrings类型的,因此可使用Add Delete方法,例如在Memo1中加入一行字符串的代码如下:  

Memo1.Lines.Add('Another line is added'); 

        通过Lines属性可以方便地把文件读入部件中,例程中使用下面的代码将文件读入Memo1: 

Memo1.Lines.loadFromFile(Filename). 

TMemo 部件中剪切、复制、粘贴文本非常方便,只需使用 CutToclipboard CopyToClipBroad,PasteFromClipBoard方法,其代码如下: 

  Memo1.CopyToClipboard

  Memo1.CutToClipboard

  Memo1.PasteFromClipboard 

        TMemo有一些属性,用以控制文本的显示效果。ScrollBars属性可以定义部件的水平滚动条和垂直滚动条。当文件字体改变时,使用AutoSize属性可使部件大小做相应的调整。设置WordWrap属性可以实现自动换行。

  例程中Edit|WordWrap菜单项提供了设置WordWrap的功能,并可根据WordWrap的值决定滚动条的形式。当WordWrap为真时,不需要水平滚动条, 并在菜单中作出检查记号。

其代码如下: 

 procedure TEditForm.SetWordWrap(Sender: TObject);

begin

with Memo1 do

begin

WordWrap := not WordWrap;

if WordWrap then

ScrollBars := ssVertical else

ScrollBars := ssBoth;

WordWrap1.Checked := WordWrap;

end;

SetEditRect;

end; 

        TMemo部件提供了一组关于选择文本的属性和方法。如果想在部件成为当前控件时自动选择文本,可设置 AutoSelect 属性。运行时可用SelectAll 方法选中部件的全部文本。 Selstart属性返回选中文本的开始位置,SelText 包含着被选中的文本。SelLength属性返回选中文本的长度,这两个属性可用于字符串的查找和替换。下一节将详细讨论。

  TMemoModified属性是一个运行时才能得到的属性,可判断部件被创建时或Modified属性最后一次设置成假值之后,部件上的文本是否修改。如果修改了,Modified 将设成真值,反之假值。

  例程中在关闭文件时将测试文件的modified属性,如果文件修改后尚未保存, 将出现对话框,询问用户是否保存文件,其代码如下: 

  procedure TEditForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

var

DialogValue: Integer;

FName: string;

begin

if Memo1.Modified then

begin

FName := Caption;

DialogValue := MessageDlg(Format(SWarningText, [FName]), mtConfirmation,

[mbYes, mbNo, mbCancel], 0);

case DialogValue of

id_Yes: Save1Click(Self);

id_Cancel: CanClose := False;

end;

end;

end; 

4.4 常用对话框的使用 

  Delphi的可视部件类库(Vistual Component Liberty)中,有一组对话框部件,在对象选择板的Dialog 页面中可以找到。 本节着重介绍与文件编辑有关的字体对话框(TFontDialog Componement),查找对话框(TFindDialog Componement) ,替换对话框(TReplace Dialog Componement),文件对开对话框(TOpenDIalog Componement).

   应用这几个对话框可对文件进行字体设置、查找、替换等操作,但需要编写相应的代码。 

4.4.1字体对话框部件 

  字体对话框部件在应用程序中产生字体对话框, 用户可在对话框中进行字体选择和属性设置。用户选择字体并按下OK按钮之后,有关信息便贮存在部件的Font属性中。

  应用程序可通过调用字体对话框的Execult方法来显示对话框,当用户选择OK按钮时,Execult返回True值,否则返回Flase值。

应用程序可以使用Options属性来定义字体对话框的显示和行为方式:例如可在对话框中定义一个帮助按钮或指定出现在字体列表框中的字体。有关Options的主要取值如下表4.1: 

4.1 字体对话框的Options取值及含义

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

取值           含义

───────────────────────────────────────

AdAnsiOnly 如果是真值,只能使用Window字符集,

fdEffects 如果是真值,对话框中显示颜色列表和效果检查框;用户可使

用效果检查框定义Strikout下划线文本;使用颜色列表定义字体

颜色。

fdForceFontExise   如果是真值,用户在字体组合框中输入字体名后选择OK按钮,

将出现一个用户字体无效的消息框。

fdNoOEMFont    如果是真值,字体组合框中将不显示向量字体。

fdShowHelp 如果是真值,对话框显示Help按按钮。

fdWysiwyg 如果是真值, 只有打印和屏幕均可得到的字体才会出现在字体

            组合框中。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 

  例程中(Edit/Font)菜单具有设置文本字体的功能,其代码如下:

 

  procedure TEditForm.SetFont(Sender : TObject);

begin

FontDialog.Font := Memo1.Font;

if FontDialog1.Execult then

Memo1.Fout := FontDialog1.Font;

SetEdit Rect;

end; 




4.4.2查找对话框部件 

  查找对话框部件为应用程序提供查找对话框, 用户可使用查找对话框在文本文件中查找字符串。

  可用Execult方法显示查找对话框,如图4.8。应用程序要查找的字符放到FindText属性中。Options 属性可决定查找对话框中有哪些选项。例如, 用户可选择是否显示匹配检查框。Options的常用选项如表4.2所示。

如果用户在对话框中输入字符并选择FindNext按钮,对话框将发生OnFind事件。 

4.2 查找对话框的Options属性的取值及含义

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

取值           含义

───────────────────────────────────────

frDown 如果是真值,对话框中出现Down按钮,查找方向向下。如果是假

值,Up按钮将被选中,查找方向向上,frDown 值可在设计或运行

时设置。

frDisableUpDown 如果是真值,UpDown按钮将变灰,用户不能进行选取;如果是

假值,用户可以选择其中之一。

frFindNext 如果是真值,应用程序查找在FindNext属性中的字符串。

frMatchCase 如果是真值,匹配检查框被选中。设计、运行时均可设置。

frWholeWord 如果是真值,整字匹配检查框被选中,设计、运行时均可设置。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

  在OnFind事件中可使用Options属性来决定以何种方式查找。Find方法响应查找对话框的OnFind事件。 

  procedure TEditform.Find(Sender: TObject);

begin

with Sender as TFindDialog do

if not SearchMemo(Memo1, FindText, Options) then

ShowMessage('Cannot find "' + FindText + '".');

end;

          其中SearchMemo函数是Search单元中定义的,SearchMemo可在TEdit,TMemo,以及其它TCustomEdit派生类中查找指定的字符串。查找从控件的脱字号(^)开始, 查找方式由Options决定。如果向后查找从控件的StlStart处开始,如果向前查找则从控件的SelEnd处查找。

  如果在控件中找到相匹配的字符串,则字符串被选中,函数返回真值。如无匹配的字符串,函数返回假值。

  特别注意的是TEdit,TMemo中有一个HideSeletion属性,它决定当焦点从该控制转移至其它控制时,被选中的字符是否保持被选中的状态。如果是真值,则只有获得焦点才能保持被选中状态。查找时,焦点在查找对话框上,因此要想了解查找情况,必须将HideSeletion设成假值。控制的缺省值为真值。

  SearchMemo代码如下: 

unit Search;

interface

uses WinProcs, SysUtils, StdCtrls, Dialogs;

const

WordDelimiters: set of Char = [#0..#255] - ['a'..'z','A'..'Z','1'..'9','0']; 

function SearchMemo(Memo: TCustomEdit;

const SearchString: String;

Options: TFindOptions): Boolean; 

function SearchBuf(Buf: PChar; BufLen: Integer;

SelStart, SelLength: Integer;

SearchString: String;

Options: TFindOptions): PChar; 

implementation 

function SearchMemo(Memo: TCustomEdit;

const SearchString: String;

Options: TFindOptions): Boolean;

var

Buffer, P: PChar;

Size: Word;

begin

Result := False;

if (Length(SearchString) = 0) then Exit;

Size := Memo.GetTextLen;

if (Size = 0) then Exit;

Buffer := StrAlloc(Size + 1);

try

Memo.GetTextBuf(Buffer, Size + 1);

P := SearchBuf(Buffer, Size, Memo.SelStart,

Memo.SelLength,SearchString, Options);

if P <> nil then

begin

Memo.SelStart := P - Buffer;

Memo.SelLength := Length(SearchString);

Result := True;

end;

finally

StrDispose(Buffer);

end;

end; 

function SearchBuf(Buf: PChar; BufLen: Integer;

SelStart, SelLength: Integer;

SearchString: String;

Options: TFindOptions): PChar;

var

SearchCount, I: Integer;

C: Char;

Direction: Shortint;

CharMap: array [Char] of Char; 

function FindNextWordStart(var BufPtr: PChar): Boolean;

begin { (True XOR N) is equivalent to

(not N) }

Result := False; { (False XOR N) is equivalent

to (N) }

{ When Direction is forward (1), skip non

delimiters, then skip delimiters. }

{ When Direction is backward (-1), skip delims, then

skip non delims }

while (SearchCount > 0) and

((Direction = 1) xor (BufPtr^ in

WordDelimiters)) do

begin

Inc(BufPtr, Direction);

Dec(SearchCount);

end;

while (SearchCount > 0) and

((Direction = -1) xor (BufPtr^ in

WordDelimiters)) do

begin

Inc(BufPtr, Direction);

Dec(SearchCount);

end;

Result := SearchCount > 0;

if Direction = -1 then

begin { back up one char, to leave ptr on first non

delim }

Dec(BufPtr, Direction);

Inc(SearchCount);

end;

end; 

begin

Result := nil;

if BufLen <= 0 then Exit;

if frDown in Options then

begin

Direction := 1;

Inc(SelStart, SelLength); { start search past end of

selection }

SearchCount := BufLen - SelStart - Length(SearchString);

if SearchCount < 0 then Exit;

if Longint(SelStart) + SearchCount > BufLen then

Exit;

end

else

begin

Direction := -1;

Dec(SelStart, Length(SearchString));

SearchCount := SelStart;

end;

if (SelStart < 0) or (SelStart > BufLen) then Exit;

Result := @Buf[SelStart]; 

{ Using a Char map array is faster than calling

AnsiUpper on every character }

for C := Low(CharMap) to High(CharMap) do

CharMap[C] := C; 

if not (frMatchCase in Options) then

begin

AnsiUpperBuff(PChar(@CharMap), sizeof(CharMap));

AnsiUpperBuff(@SearchString[1],

Length(SearchString));

end; 

while SearchCount > 0 do

begin

if frWholeWord in Options then

if not FindNextWordStart(Result) then Break;

I := 0;

while (CharMap[Result[I]] = SearchString[I+1]) do

begin

Inc(I);

if I >= Length(SearchString) then

begin

if (not (frWholeWord in Options)) or

(SearchCount = 0) or

(Result[I] in WordDelimiters) then

Exit;

Break;

end;

end;

Inc(Result, Direction);

Dec(SearchCount);

end;

Result := nil;

end; 

end.

 4.4.3 替换对话框部件 

  替换对话框部件为应用程序提供替换对话框。如图4.9。它包括查找对话框的所有功能,此外还允许使用者更换被选中的字符串。FindText 属性是应用程序需查找的字符串。ReplaceText属性是被选中字符的替换字符串。Options 属性决定对话框的显示方式。其值如表4.3所示。

与查找对话框一样,替换对话框亦有OnFind 事件。用户输入查找字符串并按FindNext按钮时,发生OnFind 事件。用户选择Replace ReplacAll 时, 对话框发生OnRelpace事件,要替换的字符串存入ReplaceText属性中,要编写相应的代码以支持替换功能。 

 表4.3 替换对话框的Options属性的取值及含义

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

取值              含义

────────────────────────────────────────

frRelpace 如果是真值, 应用程序将ReplaceText 属性中的字符串替换

             FindText属性中的字符串。

frReplacAll 如果是真值,应用程序将ReplaceText属性中的字符串替换,

             查找到的所有FindText属性中的字符串。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

  例程中TEditForm.Replace方法响应OnReplace事件,Replace方法首先判断控制中被

选中字符串是否与替换字符串相等,如果不等则进行替换。而后根据Options中的方式循

环进行查找替换。直至无匹配字符串为止。其代码如下: 

  procedure TEditForm.Replace(Sender: TObject);

var

Found: Boolean;

begin

with ReplaceDialog1 do

begin

if AnsiCompareText(Memo1.SelText, FindText) = 0 then

Memo1.SelText := ReplaceText;

Found := SearchMemo(Memo1, FindText, Options);

while Found and (frReplaceAll in Options) do

begin

Memo1.SelText := ReplaceText;

Found := SearchMemo(Memo1, FindText, Options);

end;

if (not Found) and (frReplace in Options) then

ShowMessage('Cannot find "' + FindText + '".');

end;

end; 





4.4.4 打开对话框部件 

  打开对话框部件为应用程序显示打开对话框。使用Execute方法可显示打开对话框用户通过选择文件类型下拉框中的文件类型,可以确定显示在文件列表中的文件。 例如,如果用户选择*.txt文件类型,那么只有在当前目录下的文本文件才会显示在文件列表中。文件扩展名通常也称为过滤器。

  打开对话框包含一个Filters(过滤器)的属性,它可确定文件类型和在文件类型下拉框中的顺序。应用程序可以为打开对话框定义多个过滤器,对话框的FilterIndex 属性可以决定哪个过滤器是文件类型下拉框中的缺省过滤器。如FilterIndex等于2,表示程序运行时出现在文件类型下拉框的过滤器是第2个过滤器。

  例程中关于文件打开的代码如下: 

  procedure TEditForm.Open/Click(Sender : TObject);

begin

if OpenDialog/.Execult then

begin

 …

    Open(Open Dialog/.FileName)

end

end;

  打开,保存对话框中的Options属性值见表4.4 

4.4 打开、保存对话框的Options属性取值及含义

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

值               含义

──────────────────────────────────────

 

ofAllowMultiSelect 如果是真值,则允许在文件名列表中选择多个文件。

ofCreatePrompt 如果是真值,当用户在文件编辑框中输入一不存在的文件名,

            并选择OK按钮,则会出现消息框, 提示用户此文件不存在并

            询问是否以此文件名创建一新文件。

ofExiengronDifferent 如果是真值,从对话框中返回的文件扩展名将不同于缺省扩展名。

其值存入DefaultExt属性中。

ofFileMustExist   如果是真值, 当用户在文件编辑框中输入一个不存在的文件名时,

并选择OK按钮, 则会出现一消息框提示用户此文件不存,并询

问是否输入了正确的路径和文件名。

ofNoChangeDir 如果是真值,当前目录将设置成对话框第一次出现的目录,并忽

略任何目录改变。

ofOverWritePrompt 如果是真值,当用户试图保存一个已存在的文件时, 将出现一消息

框,提示用户此文件已存在,并询问是否覆盖。

ofPathMastExit 如果是真值,用户在文件名编辑框只能输入有效路径名, 否则出

现消息框,提示用户路径无效。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

4.4 打开、保存对话框中的Options属性取值及含义

文件保存对话框与打开对话框类似,如图4.11。它的Option属性见上表。例程在保存文件前先对文件进行读写判断,如果文件是只读文件或未指定文件名的新文件, 则程序对文件不保存,否则备份文件。代码如下:

  procedure TEditForm.Save1Click(Sender: TObject);

procedure CreateBackup(const Filename: string);

var

BackupFilename: string;

begin

BackupFilename := ChangeFileExt(Filename, BackupExt);

DeleteFile(BackupFilename);

RenameFile(Filename, BackupFilename);

end; 

function IsReadOnly(const Filename: string): Boolean;

begin

Result := Boolean(FileGetAttr(Filename) and faReadOnly);

if Result then MessageDlg(Format('%s is read only.',

[ExtractFilename(Filename)]), mtWarning, [mbOK], 0);

end; 

begin

if (Filename = '') or IsReadOnly(Filename) then

SaveAs1Click(Sender)

else

begin

CreateBackup(Filename);

Memo1.Lines.SaveToFile(Filename);

Memo1.Modified := False;

end;

end;

其中CreateBackup过程用以改变需备份文件的扩展名。IsReadOnly 用以判断文件属性。 

4.5 文件打印 

  在Delphi中,文件打印有两种方式:

  1. 将文件变量分配给打印机,用此变量名创建或打开文件后, 往此文件变量写入的任何文本都视为向打印机输出,以下过程可实现文件的打印。 

  procedure TEditForm,Print1Click(Sender: TObject);

var

Line: Integer;

PrintText: System.Text;

begin

if PrintDialog1.Execute then

begin

AssignPrn(PrintText)

Rewrite(PrintText);

Print.CanvasFont := Memo1.Font;

For Line := 0 to Memo1.Lines.Count - 1 do

Writeln(PrintText,Memo1.Line[line];

System.Close(PrintText);

end;

end; 

2. 利用Printers单元中定义的TPrinter对象进行文件打印,本章例程采用这种方法打印文件。 

4.5.1 TPrinter对象 

  TPrinter对象可调用Windows的打印机,在Printer 单元中定义了TPrinter 的实例Printer,用户可直接使用。

  调用TPrinterBeginDoc方法可开始一项打印工作,调用EndDoc 方法可结束一项已成功发送给打印机的工作。如果在发送过程中出现问题或用户想中途终止打印工作,可调用Abort方法。

  通过检查Printing属性可测试当前是否有打印工作,如果打印工作被终止,Abort属性为真。

  Canvas属性代表打印表面,Brush,Font,Pen属性可决定打印字体或图像的特征。

  Printers属性中包含着已安装的打印机列表,PrinterIndex 属性是当前选择的打印

机,Fonts属性中有当前打印机支持的字体。Orientertion属性可决定打印方向。

  PageHeight,PageWith中包含着当前的高度和宽度。PageNanber为当前页的值。

  设置Title属性可决定在Windows打印管理器或网络中出现的文本。 

4.5.2 TPrintDialog打印对话框 

  TPrintDialog部件显示一打印对话框。用户在对话框中,可以选择打印机、打印页数、打印份数。当用户选择对话框中的Setup按钮,则出现打印设置对话框。

  调用Execute方法显示打印对话框。如图4.12。使用Option属性可设置打印对话框显示的形式。Options的设置如表4.5所示。

  PrintRange属性可定义打印的范围。如果PrintPage的值是prPageNums,则可以设置FromPageToPage属性来确定打印范围。设置MinPage,MaxPage属性可限制用户的打印范围。 

4.5 打印对话框的Option属性的取值及含义

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

取值              含义

──────────────────────────────────────

PoHelp 如果是真值,对话框出现帮助按钮。

PoPageNums 如果是真值,页数按钮有效,用户可以设置打印范围。

PoPrintToFile 如果是真值,文件打印检查框将出现在对话框中,用户可以选

择文件打印。

PoSelection 如果是真值,选择按钮有效, 用户可打印文件中所选择的文本。

PoWarning 如果是真值,在打印机尚未安装时,用户选择OK 按按钮将出

现警告信息。

PoDisablePrinttoToFile 如果是真值,而PoPrintToFile亦是真值时,当对话框出现时,文

件打印对话框将无效。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

       本章例程是利用Printer的画布进行文本打印的。用户选择打印菜单后,将弹出打印对话框,用户可设置各种参数。当用户选择打印按钮后,打印工作进行发送,此时将弹出打印取消对话框,见图4.13 用户可中止打印工作。有关打印和打印取消的代码如下:  

procedure TEditForm.Print1Click(Sender: TObject);

var

DistanceLine,Line: Integer;

PrintText: System.Text;

begin

if PrintDialog1.Execute then

begin

Printer.Canvas.font := Memo1.Font;

DistanceLine := Trunc(1.5*FontDialog1.font.size);

OpenPrintCancelDialog;

Printer.BeginDoc;

for line := 0 to Memo1.Lines.Count - 1 do

begin

Printer.canvas.textout(0,DistanceLine*Line,Memo1.lines[Line]);

end;

Printer.EndDoc;

BtnBottomDlg.free;

end;

end;

 

procedure TEditForm.OpenPrintCancelDialog;

begin

BtnBottomDlg := TBtnBottomDlg.Create(Application);

BtnBottomDlg.show;

BtnBottomDlg.canvas.Brush.Color := clActiveBorder;

BtnBottomDlg.canvas.TextOut(50,20,'Print'+FileName);

BtnBottomDlg.canvas.TextOut(30,40,'if you want to

stop, please choice Cancel Button.');

end;

 

posted @ 2005-11-30 17:05 青蛙學堂 阅读(1406) | 评论 (0)编辑 收藏

FW : 怎样才能娶到比尔-盖茨的女儿

一位优秀的商人杰克,有一天告诉他的儿子
  杰克:我已经决定好了一个女孩子,我要你娶她
  儿子:我自己要娶的新娘我自己会决定
  杰克:但我说的这女孩可是比尔·盖茨的女儿喔
  儿子:哇!那这样的话……
  在一个聚会中,杰克走向比尔·盖茨
  杰克:我来帮你女儿介绍个好丈夫
  比尔:我女儿还没想嫁人呢
  杰克:但我说的这年轻人可是世界银行的副总裁喔
  比尔:哇!那这样的话……
  接着,杰克去见世界银行总裁
  杰克:我想介绍一位年轻人来当贵行的副总裁
  总裁:我们已经有很多位副总裁,够多了
  杰克:但我说的这年轻人可是比尔·盖茨的女婿喔
  总裁:哇!那这样的话……
  最后,杰克的儿子娶了比尔-盖茨的女儿,又当上世界银行的副总裁
  知道吗,生意通常都是这样谈成的

posted @ 2005-11-30 12:56 青蛙學堂 阅读(164) | 评论 (0)编辑 收藏

仅列出标题
共43页: First 34 35 36 37 38 39 40 41 42 Last 
<2012年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

导航

统计

常用链接

留言簿(8)

随笔分类

随笔档案

收藏夹

青蛙学堂

最新评论

阅读排行榜

评论排行榜