首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载
2011中考 | 2011高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试
MPA考试 | 中科院
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 雅思 | 专四专八 | 口译笔译 | 博思 | GRE GMAT
新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 法语 | 德语 | 韩语
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证
华为认证 | Java认证
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格
报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师
人力资源 | 管理咨询师考试 | 秘书资格 | 心理咨询师考试 | 出版专业资格 | 广告师职业水平
驾驶员 | 网络编辑
卫生资格 | 执业医师 | 执业药师 | 执业护士
会计从业资格考试会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师
注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师
质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师
设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师
城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏
您现在的位置: 考试吧(Exam8.com) > 计算机等级考试 > 计算机二级 > Delphi > 复习资料 > 正文

2011计算机等级考试Delphi讲义:字符串列表应用

来源:考试吧Exam8.com) 2010-10-25 18:17:46 考试吧:中国教育培训第一门户 模拟考场
本章介绍多文本界面(MDI)、多页面界面(MPI)技术;VCL库中TMemo,TEdit 控件以及有关文本编辑的常用对话框的使用。

  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属性的取值及含义

 

  例程中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;

上一页  1 2 3 4 5 下一页
  相关推荐:2010年9月计算机等级考试试题及答案解析专题
       预告:名师解析2010年9月计算机等级考试试题答案
       2010年9月计算机等级考试成绩查询时间及入口
       2010年9月计算机等考成绩查询短信免费提醒开通
文章搜索
版权声明:如果计算机等级考试网所转载内容不慎侵犯了您的权益,请与我们联系800@exam8.com,我们将会及时处理。如转载本计算机等级考试网内容,请注明出处。