EXE:http://files.cnblogs.com/xe2011/Text_EditorRelease2013-12-20-185320.rar
Delphi XE5 PAS:http://files.cnblogs.com/xe2011/Text_Editor_Pascal2013-12-20-185320.rar
字符处理单元
1 // 字符串处理功能 2 3 unit StringFunctions; 4 5 interface 6 7 uses 8 Windows, Messages, SysUtils, Variants, Classes, Forms, Dialogs, StdCtrls, 9 Commctrl; 10 11 type 12 TStringFunction = class(TObject) 13 private 14 function IsUpper(ch: char): boolean; 15 function IsLower(ch: char): boolean; 16 function ToUpper(ch: char): char; 17 function ToLower(ch: char): char; 18 public 19 procedure ReplaceSelText(Edit: TCustomEdit; const s: String); 20 procedure UpperSelText(Edit: TCustomEdit); 21 procedure LowerSelText(Edit: TCustomEdit); 22 23 function UpperFistLetter(Memo: TMemo): string; 24 25 procedure ClearBlankLine(Memo: TMemo); 26 procedure ClearBlankSpace(Memo: TMemo); 27 procedure ClearNum(Memo: TMemo); 28 procedure ClearLetter(Memo: TMemo); 29 30 procedure InsertNumber(Memo: TMemo); 31 procedure InsertString(Memo: TMemo; str: string); 32 procedure InsertComment(Memo: TMemo); 33 procedure BatchReplaceString(Memo: TMemo); 34 35 procedure JustOneLine(Memo: TMemo); 36 procedure ReLine(Memo: TMemo; n: Integer); 37 38 procedure TextToHtml(sTextFile, sHtmlFile: string); 39 40 function Proper(const s: string): string; 41 function CNWordsCount(text: string): Integer; 42 function ENWordsCount(text: string): Integer; 43 44 end; 45 46 var 47 StrFunction: TStringFunction; 48 49 implementation 50 51 // 让代码设置Memo后可以让memo在Ctrl+Z撤销有效 52 procedure TStringFunction.ReplaceSelText(Edit: TCustomEdit; const s: String); 53 begin 54 SendMessage(Edit.Handle, EM_REPLACESEL, 1, LPARAM(PChar(s))); 55 // Edit.Perform(EM_REPLACESEL, 1, LPARAM(PChar(s))); 56 end; 57 58 // Edit显示行号 59 // ------------------------------------------------------------------------------ 60 // 去除空行 61 // Memo1.Text := StringReplace(Memo1.Text, #13#10#13#10, #13#10, [rfReplaceAll]); 62 { 63 //无法撤销 64 //空行的去掉 65 //本行只有空格的也去掉 66 //全选 67 //复制到剪切板上 68 } 69 procedure TStringFunction.ClearBlankLine(Memo: TMemo); 70 var 71 i: Integer; 72 list: TStringList; 73 begin 74 with Memo do 75 begin 76 if Lines.Count > 0 then 77 begin 78 list := TStringList.Create; 79 for i := 0 to Lines.Count - 1 do 80 if (Trim(Lines[i]) <> '') then 81 list.Add(Lines[i]); 82 SelectAll; 83 ReplaceSelText(Memo, list.text); 84 list.Free; 85 end; 86 end; 87 end; 88 89 // 去除空格 90 // 将 空格替换为空 91 procedure TStringFunction.ClearBlankSpace(Memo: TMemo); 92 var 93 s: string; 94 begin 95 s := StringReplace(Memo.Lines.text, ' ', '', [rfReplaceAll]); 96 s := StringReplace(s, ' ', '', [rfReplaceAll]); //中文的空格 97 98 Memo.SelectAll; 99 ReplaceSelText(Memo,s); 100 end; 101 102 // 去除一字符串中的所有的数字 103 // 104 procedure TStringFunction.ClearNum(Memo: TMemo); 105 var 106 str: string; 107 i: Integer; 108 begin 109 str := '1234567890'; 110 for i := 0 to Length(str) do 111 Memo.text := StringReplace(Memo.Lines.text, str[i], '', [rfReplaceAll]); 112 113 { rfReplaceAll 114 TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase); 115 } 116 end; 117 118 // 去除一字符串中的所有的字母 119 procedure TStringFunction.ClearLetter(Memo: TMemo); 120 var 121 str: string; 122 i: Integer; 123 begin 124 str := 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 125 for i := 0 to Length(str) do 126 Memo.text := StringReplace(Memo.Lines.text, str[i], '', [rfReplaceAll]); 127 end; 128 129 // 批量替换关键字 130 procedure TStringFunction.BatchReplaceString(Memo: TMemo); 131 var 132 i: Integer; 133 begin 134 for i := 0 to Length(Memo.Lines.text) do 135 Memo.text := StringReplace(Memo.Lines.text, Memo.Lines[i], '', 136 [rfReplaceAll]); 137 ClearBlankSpace(Memo); 138 end; 139 140 // ------------------------------------------------------------------------------ 141 // 全角转半角 142 // 符号有哪些 143 procedure ConvertQtoB; 144 begin 145 146 end; 147 148 // 半角转换全角 149 procedure ConvertBtoQ; 150 begin 151 152 end; 153 154 { 转换选中的文本大写 } 155 procedure TStringFunction.UpperSelText(Edit: TCustomEdit); 156 var 157 x, y: Integer; 158 begin 159 With Edit do 160 begin 161 x := SelStart; 162 y := SelLength; 163 if SelText <> '' then 164 begin 165 ReplaceSelText(Edit, UpperCase(SelText)); 166 SelStart := x; 167 SelLength := y; 168 end 169 else 170 begin 171 Edit.SelectAll; 172 ReplaceSelText(Edit, UpperCase(Edit.text)); 173 end; 174 end; 175 end; 176 177 { 转换选中的文本小写 } 178 procedure TStringFunction.LowerSelText(Edit: TCustomEdit); 179 var 180 x, y: Integer; 181 begin 182 With Edit do 183 begin 184 x := SelStart; 185 y := SelLength; 186 if SelText <> '' then 187 begin 188 ReplaceSelText(Edit, LowerCase(SelText)); 189 SelStart := x; 190 SelLength := y; 191 end 192 else 193 begin 194 Edit.SelectAll; 195 ReplaceSelText(Edit, LowerCase(Edit.text)); 196 end; 197 end; 198 end; 199 200 { 判断字符是否是大写字符 } 201 function TStringFunction.IsUpper(ch: char): boolean; 202 begin 203 Result := ch in ['A' .. 'Z']; 204 end; 205 206 { 判断字符是否是小写字符 } 207 function TStringFunction.IsLower(ch: char): boolean; 208 begin 209 Result := ch in ['a' .. 'z']; 210 end; 211 212 { 转换为大写字符 } 213 function TStringFunction.ToUpper(ch: char): char; 214 begin 215 Result := chr(ord(ch) and $DF); 216 end; 217 218 { 转换为小写字符 } 219 function TStringFunction.ToLower(ch: char): char; 220 begin 221 Result := chr(ord(ch) or $20); 222 end; 223 224 { Capitalizes First Letter Of Every Word In S 单语首字母大写 } 225 function TStringFunction.Proper(const s: string): string; 226 var 227 i: Integer; 228 CapitalizeNextLetter: boolean; 229 begin 230 Result := LowerCase(s); 231 CapitalizeNextLetter := True; 232 for i := 1 to Length(Result) do 233 begin 234 if CapitalizeNextLetter and IsLower(Result[i]) then 235 Result[i] := ToUpper(Result[i]); 236 CapitalizeNextLetter := Result[i] = ' '; 237 end; 238 end; 239 240 { //// Memo选中的首字母大写 } 241 function TStringFunction.UpperFistLetter(Memo: TMemo): string; 242 var 243 lst: TStrings; 244 i: Integer; 245 s: string; 246 begin 247 lst := TStrings.Create; 248 lst := Memo.Lines; 249 250 for i := 0 to lst.Count - 1 do 251 begin 252 s := s + StrFunction.Proper(lst[i] + #13#10); 253 end; 254 Memo.SelectAll; 255 StrFunction.ReplaceSelText(Memo, s); 256 // Memo.SelectAll; 257 end; 258 259 // ------------------------------------------------------------------------------ 260 procedure TStringFunction.InsertNumber(Memo: TMemo); 261 var 262 lst: TStrings; 263 i: Integer; 264 s: string; 265 begin 266 lst := TStrings.Create; 267 lst := Memo.Lines; 268 269 for i := 0 to lst.Count - 1 do 270 begin 271 s := s + Format('%d %s'#13#10, [i, lst[i]]);; 272 end; 273 Memo.SelectAll; 274 ReplaceSelText(Memo, s); 275 // Memo.SelectAll; 276 end; 277 278 procedure TStringFunction.InsertString(Memo: TMemo; str: string); 279 var 280 lst: TStrings; 281 i: Integer; 282 s: string; 283 begin 284 lst := TStrings.Create; 285 lst := Memo.Lines; 286 287 for i := 0 to lst.Count - 1 do 288 begin 289 s := s + Format('%s%s'#13#10, [lst[i], str]);; 290 end; 291 Memo.SelectAll; 292 ReplaceSelText(Memo, s); 293 end; 294 295 // 注释和取消注释 296 // 获得选中的文本的起始行和结束行 297 // 可以通过 MOUSEDOWN MOUSEUP得到 298 procedure TStringFunction.InsertComment(Memo: TMemo); 299 var 300 str: string; 301 x, y: Integer; 302 begin 303 str := Memo.SelText; 304 x := Memo.SelStart; 305 y := Memo.SelLength; 306 307 if str = '' then 308 Exit; 309 // Memo.SetSelText('//' +str); 310 Memo.SelText := '//' + str; 311 Memo.SelStart := x + 2; 312 Memo.SelLength := y + 2; 313 314 end; 315 316 // ------------------------------------------------------------------------------ 317 // 合并成一行 318 procedure TStringFunction.JustOneLine(Memo: TMemo); 319 var 320 s: string; 321 i: Integer; 322 begin 323 for i := 0 to Memo.Lines.Count - 1 do 324 s := s + Memo.Lines[i]; 325 Memo.SelectAll; 326 ReplaceSelText(Memo, s); 327 end; 328 329 // ------------------------------------------------------------------------------ 330 // 重新分行 331 { 332 var 333 n: Integer; 334 begin 335 n := StrToInt(InputBox('重新分行', '每行几个字符', '8')); 336 ReLine(Memo1, n); 337 end; 338 } 339 procedure TStringFunction.ReLine(Memo: TMemo; n: Integer); 340 var 341 s: string; 342 i, j, k: Integer; 343 L: TStringList; 344 begin 345 L := TStringList.Create; 346 j := 1; 347 348 for k := 0 to Memo.Lines.Count - 1 do 349 s := s + Memo.Lines[k]; 350 351 if Trim(s) <> '' then 352 begin 353 for i := 0 to (Length(s) div n) do // 几行 354 begin 355 j := j + n; 356 L.Add(Copy(s, j - n, n)); // COPY 的第一位不是0是1 // 每行的字符 357 end; 358 end; 359 Memo.SelectAll; 360 ReplaceSelText(Memo, L.text); 361 L.Free; 362 end; 363 364 // ------------------------------------------------------------------------------ 365 // 获得汉字字符个数 366 function TStringFunction.CNWordsCount(text: string): Integer; 367 var 368 i, sum, c: Integer; 369 begin 370 Result := 0; 371 372 c := 0; 373 sum := Length(text); 374 375 if sum = 0 then 376 Exit; 377 for i := 0 to sum do 378 begin 379 if ord(text[i]) >= 127 then 380 begin 381 Inc(c); 382 end; 383 end; 384 Result := c; 385 end; 386 387 // 获得非汉字字符个数 388 function TStringFunction.ENWordsCount(text: string): Integer; 389 var 390 i, sum, e: Integer; 391 begin 392 Result := 0; 393 e := 0; 394 sum := Length(text); 395 if sum = 0 then 396 Exit; 397 for i := 0 to sum do 398 begin 399 if (ord(text[i]) >= 33) and (ord(text[i]) <= 126) then 400 begin 401 Inc(e); 402 end; 403 end; 404 Result := e; 405 end; 406 407 { 408 TextToHtml('C:\1.txt','c:\2.htm'); 409 } 410 procedure TStringFunction.TextToHtml(sTextFile, sHtmlFile: string); 411 var 412 aText: TStringList; 413 aHtml: TStringList; 414 i: Integer; 415 begin 416 aText := TStringList.Create; 417 try 418 aText.LoadFromFile(sTextFile); 419 aHtml := TStringList.Create; 420 try 421 aHtml.Clear; 422 aHtml.Add('<html>'); 423 aHtml.Add('<body>'); 424 for i := 0 to aText.Count - 1 do 425 aHtml.Add(aText.Strings[i] + '<br>'); 426 aHtml.Add('</body>'); 427 aHtml.Add('</html>'); 428 aHtml.SaveToFile(sHtmlFile); 429 finally 430 aHtml.Free; 431 end; 432 finally 433 aText.Free; 434 end; 435 end; 436 437 Initialization 438 439 StrFunction := TStringFunction.Create; 440 441 Finalization 442 443 StrFunction.Free; 444 445 end.
主窗体单元
1 unit TextEditor; 2 3 interface 4 5 uses 6 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 7 System.Classes, Vcl.Graphics, 8 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.StdCtrls, Vcl.ComCtrls, 9 Vcl.StdActns, Vcl.ActnList, Vcl.ExtActns, System.Actions, Vcl.ExtCtrls, 10 Vcl.ExtDlgs, INIFILES; 11 12 function GetUserDefaultUILanguage(): Integer; external 'Kernel32.DLL'; 13 14 type 15 TTextEditorForm = class(TForm) 16 Memo1: TMemo; 17 StatusBar1: TStatusBar; 18 MainMenu1: TMainMenu; 19 mni_File: TMenuItem; 20 FileNew: TMenuItem; 21 FileOpen: TMenuItem; 22 FileSave: TMenuItem; 23 FileSaveAs: TMenuItem; 24 mni_PageSetup: TMenuItem; 25 mni_Print: TMenuItem; 26 mni_Exit: TMenuItem; 27 mni_Edit: TMenuItem; 28 mni_Undo: TMenuItem; 29 mni_Cut: TMenuItem; 30 mni_Copy: TMenuItem; 31 mni_Paste: TMenuItem; 32 mni_Delete: TMenuItem; 33 mni_Find: TMenuItem; 34 mni_FindNext: TMenuItem; 35 mni_Replace: TMenuItem; 36 mni_GoTo: TMenuItem; 37 mni_SelectAll: TMenuItem; 38 mni_DateTime: TMenuItem; 39 mni_Format: TMenuItem; 40 mni_Font: TMenuItem; 41 mni_WordWrap: TMenuItem; 42 mni_View: TMenuItem; 43 mni_StatusBar: TMenuItem; 44 mni_Help: TMenuItem; 45 mni_ViewHelp: TMenuItem; 46 mni_About: TMenuItem; 47 mni_SetTopMoset: TMenuItem; 48 FindDialog1: TFindDialog; 49 ReplaceDialog1: TReplaceDialog; 50 Tools: TMenuItem; 51 Options1: TMenuItem; 52 N2: TMenuItem; 53 Convert1: TMenuItem; 54 Clear1: TMenuItem; 55 Bat1: TMenuItem; 56 Rnd1: TMenuItem; 57 Total1: TMenuItem; 58 upperCase: TMenuItem; 59 Lowercase: TMenuItem; 60 N3: TMenuItem; 61 UpperFirstLatter: TMenuItem; 62 InsertNumber: TMenuItem; 63 Comment: TMenuItem; 64 NoBank: TMenuItem; 65 BatNoKeyWord: TMenuItem; 66 N5: TMenuItem; 67 NoSpace: TMenuItem; 68 NoNumber: TMenuItem; 69 NoLetter: TMenuItem; 70 CombineOne: TMenuItem; 71 ReLine: TMenuItem; 72 N7: TMenuItem; 73 BatCreateFile: TMenuItem; 74 BatCreateFolder: TMenuItem; 75 BatCreateRename: TMenuItem; 76 N4: TMenuItem; 77 N1: TMenuItem; 78 HTMLTXT1: TMenuItem; 79 XTHTML1: TMenuItem; 80 RecentFiles: TMenuItem; 81 ClearFiles: TMenuItem; 82 N6: TMenuItem; 83 ComplexText1: TMenuItem; 84 SimpleText1: TMenuItem; 85 mni_InsertRightStr: TMenuItem; 86 ASCIIHEX1: TMenuItem; 87 HEXASCII1: TMenuItem; 88 N8: TMenuItem; 89 procedure FormResize(Sender: TObject); 90 procedure mni_WordWrapClick(Sender: TObject); 91 procedure mni_AboutClick(Sender: TObject); 92 procedure mni_FontClick(Sender: TObject); 93 procedure mni_DateTimeClick(Sender: TObject); 94 procedure mni_GoToClick(Sender: TObject); 95 procedure mni_StatusBarClick(Sender: TObject); 96 procedure FormCreate(Sender: TObject); 97 procedure SaveConfig(Sender: TObject); 98 procedure LoadConfig(Sender: TObject); 99 procedure FormClose(Sender: TObject; var Action: TCloseAction); 100 procedure mni_PrintClick(Sender: TObject); 101 procedure mni_SetTopMosetClick(Sender: TObject); 102 procedure Memo1MouseUp(Sender: TObject; Button: TMouseButton; 103 Shift: TShiftState; X, Y: Integer); 104 procedure act_SetCaretPosExecute(Sender: TObject); 105 procedure Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); 106 procedure FindDialog1Find(Sender: TObject); 107 procedure mni_DeleteClick(Sender: TObject); 108 procedure mni_PasteClick(Sender: TObject); 109 procedure mni_CopyClick(Sender: TObject); 110 procedure mni_CutClick(Sender: TObject); 111 procedure ReplaceDialog1Replace(Sender: TObject); 112 procedure ReplaceDialog1Find(Sender: TObject); 113 procedure mni_FindNextClick(Sender: TObject); 114 procedure mni_FindClick(Sender: TObject); 115 procedure mni_ReplaceClick(Sender: TObject); 116 procedure mni_EditClick(Sender: TObject); 117 procedure mni_UndoClick(Sender: TObject); 118 procedure mni_PageSetupClick(Sender: TObject); 119 procedure mni_ExitClick(Sender: TObject); 120 procedure Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 121 procedure mni_SelectAllClick(Sender: TObject); 122 procedure Memo1KeyPress(Sender: TObject; var Key: Char); 123 procedure FileNewClick(Sender: TObject); 124 procedure FileOpenClick(Sender: TObject); 125 procedure FileSaveClick(Sender: TObject); 126 procedure FileSaveAsClick(Sender: TObject); 127 procedure Total1Click(Sender: TObject); 128 procedure upperCaseClick(Sender: TObject); 129 procedure LowercaseClick(Sender: TObject); 130 procedure UpperFirstLatterClick(Sender: TObject); 131 procedure NoSpaceClick(Sender: TObject); 132 procedure NoBankClick(Sender: TObject); 133 procedure CombineOneClick(Sender: TObject); 134 procedure ReLineClick(Sender: TObject); 135 procedure HTMLTXT1Click(Sender: TObject); 136 procedure InsertNumberClick(Sender: TObject); 137 procedure mni_InsertRightStrClick(Sender: TObject); 138 procedure NoNumberClick(Sender: TObject); 139 procedure NoLetterClick(Sender: TObject); 140 procedure mni_ViewHelpClick(Sender: TObject); 141 private 142 { Private declarations } 143 FFileName: string; 144 procedure CheckFileSave; 145 procedure SetFileName(const FileName: String); 146 procedure PerformFileOpen(const AFileName: string); 147 procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES; 148 149 // ------------------------------------------------------------------------------ 150 // procedure WMDROPFILES(var MSg: TMessage); message WM_DROPFILES; 151 procedure GoToMemoLineDialog(Memo: TMemo); 152 procedure SetUiCHS(); 153 procedure SetUiEN(); 154 procedure MemoPrinter(Memo: TMemo; TitleStr: string = '无标题'); 155 156 157 // ------------------------------------------------------------------------------ 158 159 public 160 { Public declarations } 161 end; 162 163 var 164 TextEditorForm: TTextEditorForm; 165 FindStr: string; 166 bStatueBar: Boolean = False; 167 AppINI: string; 168 // ------------------------------------------------------------------------------ 169 170 implementation 171 172 uses 173 ShellApi, Registry, Printers, Clipbrd, StrUtils, 174 Search, StringFunctions, Encrypt, Config, SimpleConvert; 175 {$R *.dfm} 176 177 resourcestring 178 sSaveChanges = '是否将未更改保存到 %s?'; 179 sOverWrite = '%s 已存在。' + #13#10 + '要替换它吗?'; 180 sTitle = '记事本'; 181 sUntitled = '未命名'; 182 sColRowInfo = '行: %3d 列: %3d'; 183 sLine = '行'; // 184 scol = '列'; 185 sGoToTitle = '转到指定行'; // 轮到行的 输入对话框的标题 186 sGoToTips = '行号(&L):'; // 187 sMsgBoxTitle = '行数超过了总行数'; 188 sFileDlgFilter = '文本文档(*.txt)|*.txt|所有文件(*.*)|*.*'; // 打开和保存的文本是一样的 189 190 procedure TextToHtml(Memo: TMemo); 191 var 192 lst: TStringList; 193 i: Integer; 194 begin 195 try 196 lst := TStringList.Create; 197 with lst do 198 begin 199 Clear; 200 Add('<html>'); 201 Add('<body>'); 202 for i := 0 to Memo.Lines.Count - 1 do 203 Add(Memo.Lines[i] + '<br>'); 204 Add('</body>'); 205 Add('</html>'); 206 Memo.text := text; 207 ShowMessage(text); 208 end; 209 finally 210 lst.Free; 211 end; 212 end; 213 214 procedure TTextEditorForm.CheckFileSave; 215 var 216 SaveRespond: Integer; 217 begin 218 if not Memo1.Modified then 219 Exit; 220 SaveRespond := MessageBox(Handle, PWideChar(Format(sSaveChanges, [FFileName]) 221 ), PWideChar(sTitle), MB_YESNOCANCEL + MB_ICONINFORMATION); 222 case SaveRespond of 223 idYes: 224 FileSave.click; 225 idNo: 226 ; { Nothing } 227 idCancel: 228 Abort; 229 end; 230 end; 231 232 procedure TTextEditorForm.CombineOneClick(Sender: TObject); 233 begin 234 strfunction.JustOneLine(Memo1); 235 end; 236 237 procedure TTextEditorForm.SetFileName(const FileName: String); 238 begin 239 FFileName := FileName; 240 Caption := Format('%s - %s', [ExtractFileName(FileName), sTitle]); 241 end; 242 243 procedure TTextEditorForm.PerformFileOpen(const AFileName: string); 244 begin 245 Memo1.Lines.LoadFromFile(AFileName); 246 SetFileName(AFileName); 247 Memo1.SetFocus; 248 Memo1.Modified := False; 249 end; 250 251 procedure TTextEditorForm.WMDropFiles(var Msg: TWMDropFiles); 252 var 253 CFileName: array [0 .. MAX_PATH] of Char; 254 begin 255 try 256 if DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH) > 0 then 257 begin 258 CheckFileSave; 259 PerformFileOpen(CFileName); 260 Msg.Result := 0; 261 end; 262 finally 263 DragFinish(Msg.Drop); 264 end; 265 end; 266 267 { ReplaceDialog Find } 268 procedure TTextEditorForm.ReLineClick(Sender: TObject); 269 var 270 n: Integer; 271 begin 272 n := StrToInt(InputBox('重新分行', '每行几个字符', '8')); 273 strfunction.ReLine(Memo1, n); 274 end; 275 276 procedure TTextEditorForm.ReplaceDialog1Find(Sender: TObject); 277 begin 278 with Sender as TReplaceDialog do 279 if not SearchMemo(Memo1, FindText, Options) then 280 MessageBox(Handle, PWideChar(Concat('找不到"', FindText, '"')), '记事本', 281 MB_ICONINFORMATION); 282 end; 283 284 { ReplaceDialog Replace } 285 procedure TTextEditorForm.ReplaceDialog1Replace(Sender: TObject); 286 var 287 Found: Boolean; 288 begin 289 with ReplaceDialog1 do 290 begin 291 { Replace } 292 if (frReplace in Options) and (Memo1.SelText = FindText) then 293 Memo1.SelText := ReplaceText; 294 Found := SearchMemo(Memo1, FindText, Options); 295 296 { Replace All } 297 if (frReplaceAll in Options) then 298 begin 299 Memo1.SelStart := 0; 300 while Found do 301 begin 302 if (Memo1.SelText = FindText) then 303 Memo1.SelText := ReplaceText; 304 Found := SearchMemo(Memo1, FindText, Options); 305 end; 306 if not Found then 307 SendMessage(Memo1.Handle, WM_VSCROLL, SB_TOP, 0); 308 end; 309 310 if (not Found) and (frReplace in Options) then 311 MessageBox(Handle, PWideChar(Concat('找不到"', FindText, '"')), '记事本', 312 MB_ICONINFORMATION); 313 end; 314 315 end; 316 317 procedure TTextEditorForm.FileNewClick(Sender: TObject); 318 begin 319 CheckFileSave; 320 SetFileName(sUntitled); 321 322 Memo1.Lines.Clear; 323 Memo1.Modified := False; 324 end; 325 326 procedure TTextEditorForm.FileOpenClick(Sender: TObject); 327 begin 328 CheckFileSave; 329 330 with TOpenDialog.Create(nil) do 331 begin 332 Filter := sFileDlgFilter; 333 FileName := '*.txt'; 334 if Execute then 335 begin 336 PerformFileOpen(FileName); 337 Memo1.ReadOnly := ofReadOnly in Options; 338 end; 339 end; 340 end; 341 342 procedure TTextEditorForm.FileSaveClick(Sender: TObject); 343 begin 344 if FFileName = sUntitled then 345 FileSaveAs.click 346 else 347 begin 348 Memo1.Lines.SaveToFile(FFileName); 349 Memo1.Modified := False; 350 end; 351 end; 352 353 procedure TTextEditorForm.FileSaveAsClick(Sender: TObject); 354 begin 355 with TSaveDialog.Create(nil) do 356 begin 357 Filter := sFileDlgFilter; 358 FileName := '*.txt'; 359 if Execute then 360 begin 361 if FileExists(FileName) then 362 if MessageBox(Handle, PWideChar(Format(sOverWrite, [FFileName])), 363 PWideChar(sTitle), MB_YESNOCANCEL + MB_ICONINFORMATION) <> idYes then 364 Exit; 365 Memo1.Lines.SaveToFile(FileName); 366 SetFileName(FileName); 367 Memo1.Modified := False; 368 end; 369 end; 370 end; 371 372 procedure TTextEditorForm.FindDialog1Find(Sender: TObject); 373 begin 374 with Sender as TFindDialog do 375 begin 376 FindStr := FindText; 377 if not SearchMemo(Memo1, FindText, Options) then 378 MessageBox(Handle, PWideChar(Concat('找不到"', FindText, '"')), '记事本', 379 MB_ICONINFORMATION); 380 end; 381 end; 382 383 procedure TTextEditorForm.FormClose(Sender: TObject; var Action: TCloseAction); 384 begin 385 SaveConfig(Sender); 386 Action := caFree; 387 388 CheckFileSave; 389 end; 390 391 procedure TTextEditorForm.FormCreate(Sender: TObject); 392 begin 393 394 AppINI := ExtractFilePath(Application.ExeName) + 'Text Editor.ini'; 395 396 SetFileName(sUntitled); 397 DragAcceptFiles(Handle, True); 398 // FindDialog1.Options := [frDown, frHideWholeWord]; 399 // ReplaceDialog1.Options := [frDown, frHideWholeWord]; 400 with Memo1 do 401 begin 402 HideSelection := False; 403 ScrollBars := ssVertical; 404 Align := alClient; 405 end; 406 407 act_SetCaretPosExecute(Sender); 408 409 if GetUserDefaultUILanguage() = $0804 then 410 SetUiCHS // Caption:='简体中文'; 411 else 412 SetUiEN; // Caption:='英文'; 413 414 // Caption := Form1Title; 415 LoadConfig(Sender); 416 bStatueBar := mni_StatusBar.Checked; 417 418 if mni_WordWrap.Checked then 419 begin 420 mni_WordWrap.click; 421 mni_WordWrap.Checked := True; 422 // 可以自动换行 423 Memo1.ScrollBars := ssVertical; 424 Memo1.WordWrap := True; 425 mni_GoTo.Enabled := False; 426 mni_StatusBar.Checked := False; 427 mni_StatusBar.Enabled := False; 428 StatusBar1.Visible := False; 429 end 430 else 431 begin 432 // 不能换行 433 Memo1.ScrollBars := ssBoth; 434 Memo1.WordWrap := False; 435 mni_GoTo.Enabled := True; 436 mni_StatusBar.Enabled := True; 437 StatusBar1.Visible := bStatueBar; 438 end; 439 440 bStatueBar := mni_StatusBar.Checked; 441 mni_StatusBar.Checked := bStatueBar; 442 StatusBar1.Panels[0].Width := (75 * StatusBar1.Width) div 100; 443 end; 444 445 procedure TTextEditorForm.FormResize(Sender: TObject); 446 begin 447 StatusBar1.Panels[0].Width := (75 * StatusBar1.Width) div 100; 448 // SaveConfig(Sender); 449 end; 450 451 procedure TTextEditorForm.GoToMemoLineDialog(Memo: TMemo); 452 var 453 LineIndex1, LineLength1, selStart1, Line, i: Integer; 454 begin 455 selStart1 := 0; 456 Line := StrToInt(InputBox(sGoToTitle, sGoToTips, 457 IntToStr(Memo.CaretPos.Y + 1))) - 1; 458 459 if (Line > 0) and (Line <= Memo.Lines.Count) then 460 for i := 0 to Line - 1 do 461 begin 462 LineIndex1 := SendMessage(Memo.Handle, EM_LINEINDEX, i, 0); 463 LineLength1 := SendMessage(Memo.Handle, EM_LINELENGTH, LineIndex1, 0) + 2; 464 selStart1 := selStart1 + LineLength1; 465 end 466 else if Line = 0 then 467 Memo.SelStart := selStart1 468 else 469 MessageBox(Handle, PWideChar('行数超出了总行数'), PWideChar('记事本 - 跳行'), 0); 470 Memo.SelStart := selStart1; 471 end; 472 473 procedure TTextEditorForm.HTMLTXT1Click(Sender: TObject); 474 begin 475 TextToHtml(Memo1); 476 end; 477 478 procedure TTextEditorForm.InsertNumberClick(Sender: TObject); 479 begin 480 strfunction.InsertNumber(Memo1); 481 end; 482 483 procedure TTextEditorForm.LowercaseClick(Sender: TObject); 484 begin 485 strfunction.LowerSelText(Memo1); 486 end; 487 488 procedure TTextEditorForm.Memo1KeyDown(Sender: TObject; var Key: Word; 489 Shift: TShiftState); 490 begin 491 { 你猜在编辑菜单中为何不使用系统的HotKey而在这里用手动来实现快捷键 492 去除声音 493 } 494 if (Shift = [ssCtrl]) and (Key = $46) then // 按下<Ctrl+F> 495 mni_Find.click; 496 497 if (Key = vk_F3) and mni_FindNext.Enabled then // F3 498 mni_FindNext.click; 499 500 if (Shift = [ssCtrl]) and (Key = $48) then // Ctrl+H 501 mni_Replace.click; 502 503 if (Shift = [ssCtrl]) and (Key = $47) and (not Memo1.WordWrap) then // Ctrl+G 504 mni_GoTo.click; 505 506 if (Shift = [ssCtrl]) and (Key = $41) then // Ctrl+A 507 mni_SelectAll.click; 508 509 if (Key = vk_F5) then // F5 510 mni_DateTime.click; 511 end; 512 513 procedure TTextEditorForm.Memo1KeyPress(Sender: TObject; var Key: Char); 514 begin 515 // F,H,G,A 516 if (Key = #6) or (Key = #1) { or (Key = #8) } or (Key = #7) then 517 Key := #0; 518 end; 519 520 procedure TTextEditorForm.Memo1KeyUp(Sender: TObject; var Key: Word; 521 Shift: TShiftState); 522 begin 523 act_SetCaretPosExecute(Sender); 524 end; 525 526 procedure TTextEditorForm.Memo1MouseUp(Sender: TObject; Button: TMouseButton; 527 Shift: TShiftState; X, Y: Integer); 528 begin 529 530 act_SetCaretPosExecute(Sender); 531 end; 532 533 // ------------------------------------------------------------------------------ 534 { Edit Menu Item Enable } 535 procedure TTextEditorForm.mni_EditClick(Sender: TObject); 536 begin 537 mni_Find.Enabled := (Memo1.text <> ''); 538 mni_FindNext.Enabled := (Memo1.text <> '') and (FindStr <> ''); 539 mni_Replace.Enabled := (Memo1.text <> ''); 540 541 mni_GoTo.Enabled := not Memo1.WordWrap; 542 mni_Undo.Enabled := Memo1.Modified; 543 mni_Cut.Enabled := (Memo1.SelLength > 0); 544 mni_Copy.Enabled := (Memo1.SelLength > 0); 545 mni_Paste.Enabled := Clipboard.HasFormat(CF_TEXT); 546 mni_Delete.Enabled := (Memo1.text <> ''); 547 // mni_SelectAll.Enabled:= ( Memo1.SelLength <> Length(Memo1.Text) ); 548 end; 549 550 procedure TTextEditorForm.mni_AboutClick(Sender: TObject); 551 begin 552 ShellAbout(Handle, PWideChar('记事本'), 553 'Roman E-Main:[email protected] 2013年6月15日17:46:18', 554 Application.Icon.Handle); 555 end; 556 557 procedure TTextEditorForm.mni_CopyClick(Sender: TObject); 558 begin 559 Memo1.CopyToClipboard 560 end; 561 562 procedure TTextEditorForm.mni_CutClick(Sender: TObject); 563 begin 564 Memo1.CutToClipboard; 565 end; 566 567 procedure TTextEditorForm.mni_DeleteClick(Sender: TObject); 568 begin 569 // 没选中也能删除的 570 // 快捷键del去掉就可以正常使用了 571 Memo1.ClearSelection; 572 end; 573 574 procedure TTextEditorForm.mni_SelectAllClick(Sender: TObject); 575 begin 576 Memo1.SelectAll; 577 end; 578 579 procedure TTextEditorForm.mni_DateTimeClick(Sender: TObject); 580 begin 581 Memo1.SetSelText((FormatDateTime('hh:mm yyyy/m/dd', now))); // 插入时间/日期 582 end; 583 584 procedure TTextEditorForm.mni_ExitClick(Sender: TObject); 585 begin 586 Close; 587 end; 588 589 // 调用查找对话框 590 procedure TTextEditorForm.mni_FindClick(Sender: TObject); 591 begin 592 with FindDialog1 do 593 begin 594 Left := Self.Left + 100; 595 Top := Self.Top + 150; 596 FindText := Memo1.SelText; 597 Execute; 598 end; 599 end; 600 601 { ReplaceDialog1.Execute } 602 procedure TTextEditorForm.mni_ReplaceClick(Sender: TObject); 603 begin 604 with ReplaceDialog1 do 605 begin 606 Left := Self.Left + 100; 607 Top := Self.Top + 150; 608 FindText := Memo1.SelText; 609 Execute; 610 end; 611 end; 612 613 { Find Next } 614 procedure TTextEditorForm.mni_FindNextClick(Sender: TObject); 615 begin 616 if not SearchMemo(Memo1, FindStr, FindDialog1.Options) then 617 MessageBox(Handle, PWideChar(Concat('找不到"', FindStr, '"')), '记事本', 618 MB_ICONINFORMATION); 619 end; 620 621 procedure TTextEditorForm.mni_FontClick(Sender: TObject); 622 begin 623 with TFontDialog.Create(nil) do 624 begin 625 Font := Memo1.Font; 626 Options := [fdApplyButton]; 627 if Execute() then 628 Memo1.Font := Font; 629 end; 630 end; 631 632 procedure TTextEditorForm.mni_GoToClick(Sender: TObject); 633 begin 634 GoToMemoLineDialog(Memo1); 635 end; 636 637 procedure TTextEditorForm.mni_InsertRightStrClick(Sender: TObject); 638 var 639 str: string; 640 begin 641 str := InputBox('提示', '放在每行的最右边的字符串', ' - Hello Roman'); 642 strfunction.InsertString(Memo1, str); 643 end; 644 645 procedure TTextEditorForm.mni_PageSetupClick(Sender: TObject); 646 begin 647 With TPageSetupDialog.Create(nil) do 648 Execute; 649 end; 650 651 procedure TTextEditorForm.mni_PasteClick(Sender: TObject); 652 begin 653 Memo1.PasteFromClipboard; 654 end; 655 656 procedure TTextEditorForm.mni_PrintClick(Sender: TObject); 657 begin 658 MemoPrinter(Memo1); // 标题修改为文件名 659 end; 660 661 procedure TTextEditorForm.mni_StatusBarClick(Sender: TObject); 662 begin 663 if mni_StatusBar.Checked then 664 begin 665 bStatueBar := True; 666 StatusBar1.Visible := True; 667 end 668 669 else 670 begin 671 StatusBar1.Visible := False; 672 bStatueBar := False; 673 end; 674 end; 675 676 procedure TTextEditorForm.mni_UndoClick(Sender: TObject); 677 begin 678 Memo1.Undo; 679 end; 680 681 procedure TTextEditorForm.mni_ViewHelpClick(Sender: TObject); 682 begin 683 ShellExecute(Handle, 'open', 'http://www.cnblogs.com/xe2011/p/3483809.html', 684 0, 0, SW_SHOWNORMAL); 685 end; 686 687 procedure TTextEditorForm.mni_WordWrapClick(Sender: TObject); 688 begin 689 if mni_WordWrap.Checked then 690 begin 691 Memo1.ScrollBars := ssVertical; // 自动换行 692 Memo1.WordWrap := True; 693 694 // 转到 和 状态栏不可用 和状态栏菜单不可用 check为false 695 mni_GoTo.Enabled := False; 696 697 // ---------------------------------------- 698 mni_StatusBar.Enabled := False; 699 mni_StatusBar.Checked := False; 700 StatusBar1.Visible := False; 701 end 702 else 703 begin 704 Memo1.ScrollBars := ssBoth; // 取消自动换行 705 Memo1.WordWrap := False; 706 707 mni_GoTo.Enabled := True; 708 709 // ---------------------------------------- 710 mni_StatusBar.Enabled := True; 711 mni_StatusBar.Checked := bStatueBar; 712 StatusBar1.Visible := bStatueBar; 713 end; 714 // if bStatueBar=True then Caption:='True'; 715 // if bStatueBar=False then Caption:='False'; 716 717 end; 718 719 procedure TTextEditorForm.NoBankClick(Sender: TObject); 720 begin 721 strfunction.ClearBlankLine(Memo1); 722 end; 723 724 procedure TTextEditorForm.NoLetterClick(Sender: TObject); 725 begin 726 strfunction.ClearLetter(Memo1); 727 end; 728 729 procedure TTextEditorForm.NoNumberClick(Sender: TObject); 730 begin 731 strfunction.ClearNum(Memo1); 732 end; 733 734 procedure TTextEditorForm.NoSpaceClick(Sender: TObject); 735 begin 736 strfunction.ClearBlankSpace(Memo1); 737 end; 738 739 procedure TTextEditorForm.mni_SetTopMosetClick(Sender: TObject); 740 begin 741 if mni_SetTopMoset.Checked then 742 FormStyle := fsStayOnTop 743 else 744 FormStyle := fsNormal; 745 end; 746 747 procedure TTextEditorForm.SetUiCHS(); 748 begin 749 // SetUICH 750 // ------------------------------------------ 751 mni_File.Caption := '文件(&F)'; 752 FileNew.Caption := '新建(&N)'; 753 FileOpen.Caption := '打开(&O)...'; 754 FileSave.Caption := '保存(&S)'; 755 FileSaveAs.Caption := '另存为(&A)...'; 756 mni_PageSetup.Caption := '页面设置(&U)...'; 757 mni_Print.Caption := '打印(&P)...'; 758 mni_Exit.Caption := '退出(&X)'; 759 // ------------------------------------------ 760 mni_Edit.Caption := '编辑(&E)'; 761 mni_Undo.Caption := '撤消(&U) Ctrl+Z'; 762 mni_Cut.Caption := '剪切(&T) Ctrl+X'; 763 mni_Copy.Caption := '复制(&C) Ctrl+C'; 764 mni_Paste.Caption := '粘贴(&P) Ctrl+V'; 765 mni_Delete.Caption := '删除(&L)) Del'; 766 mni_Find.Caption := '查找(F)... Ctrl+F'; 767 mni_FindNext.Caption := '查找下一个(&N) F3'; 768 mni_Replace.Caption := '替换(&R)... Ctrl+H'; 769 mni_GoTo.Caption := '转到(&G)... Ctrl+G'; 770 mni_SelectAll.Caption := '全选(&A) Ctrl+A'; 771 mni_DateTime.Caption := '时间/日期(&D) F5'; 772 // ------------------------------------------ 773 mni_Format.Caption := '格式(&O)'; 774 mni_WordWrap.Caption := '自动换行(&W)'; 775 mni_Font.Caption := '字体(&F)...'; 776 // ------------------------------------------ 777 mni_View.Caption := '查看(&V)'; 778 mni_StatusBar.Caption := '状态栏(&S)'; 779 mni_SetTopMoset.Caption := '置顶(&T)'; 780 // ------------------------------------------ 781 mni_Help.Caption := '帮助(&H)'; 782 mni_ViewHelp.Caption := '查看帮助(&H)'; 783 mni_About.Caption := '关于记事本(&A)'; 784 785 // // ------------------------------------------ 786 // Form1Title := '无标题 - 记事本'; 787 // Line := '行'; // 788 // col := '列'; 789 // sGoToTitle := '转到指定行'; // 轮到行的 输入对话框的标题 790 // sGoToTips := '行号(&L):'; // 791 // MsgBoxTitle := '行数超过了总行数'; 792 // MsgBoxHint := '记事本 - 跳行'; 793 // shellAboutText := '关于 - 记事本'; 794 // FileDialogFilter := '文本文档(*.txt)|*.txt|所有文件(*.*)|*.*'; 795 796 end; 797 798 procedure TTextEditorForm.SetUiEN(); 799 begin 800 // SetUIENGLISH 801 // ------------------------------------------ 802 mni_File.Caption := '&File'; 803 FileNew.Caption := '&New'; 804 FileOpen.Caption := '&Open...'; 805 FileSave.Caption := '&Save'; 806 FileSaveAs.Caption := 'Save &As...'; 807 mni_PageSetup.Caption := 'Page Set&up...'; 808 mni_Print.Caption := '&Print...'; 809 mni_Exit.Caption := 'E&xit'; 810 // ------------------------------------------ 811 mni_Edit.Caption := '&Edit'; 812 mni_Undo.Caption := '&Undo Ctrl+Z'; 813 mni_Cut.Caption := 'Cu&t Ctrl+X'; 814 mni_Copy.Caption := '&Copy Ctrl+C'; 815 mni_Paste.Caption := '&Paste) Ctrl+V'; 816 mni_Delete.Caption := '&Delete Del'; 817 mni_Find.Caption := '&Find... Ctrl+F'; 818 mni_FindNext.Caption := 'Find &Next F3'; 819 mni_Replace.Caption := '&Replace... Ctrl+H'; 820 mni_GoTo.Caption := '&Go To... Ctrl+G'; 821 mni_SelectAll.Caption := 'Select &All Ctrl+A'; 822 mni_DateTime.Caption := 'Time/&Date F5'; 823 // ------------------------------------------ 824 mni_Format.Caption := 'F&ormat'; 825 mni_WordWrap.Caption := '&Word Wrap'; 826 mni_Font.Caption := '&Font...'; 827 // ------------------------------------------ 828 mni_View.Caption := '&View'; 829 mni_StatusBar.Caption := '&StatueBar'; 830 mni_SetTopMoset.Caption := '&TopMost'; 831 // ------------------------------------------ 832 mni_Help.Caption := '&Help'; 833 mni_ViewHelp.Caption := 'View H&elp'; 834 mni_About.Caption := '&About Notepad'; 835 836 // // ------------------------------------------ 837 // Form1Title := 'Untitled - Notepad'; 838 // Line := 'Ln'; // 839 // col := 'Col'; 840 // sGoToTitle := 'Go To Line'; // 轮到行的 输入对话框的标题 841 // sGoToTips := '&Line Number:'; // 842 // MsgBoxTitle := 'The line number is beyond the total number of lines'; 843 // MsgBoxHint := 'Notepad - Goto Line'; 844 // shellAboutText := ' - Notepad'; 845 // FileDialogFilter := 'Text File(*.txt)|*.txt|All File(*.*)|*.*'; 846 end; 847 848 procedure TTextEditorForm.Total1Click(Sender: TObject); 849 var 850 Line: Integer; 851 Count: Integer; 852 en, cn: Integer; 853 s: string; 854 begin 855 with Memo1 do 856 begin 857 Line := Memo1.Lines.Count; 858 Count := Length(Memo1.Lines.text); 859 en := strfunction.ENWordsCount(text); 860 cn := strfunction.CNWordsCount(text); 861 end; 862 s := Format 863 ('行 %d '#13'字符(全部 包括空格) %d '#13'字符(非汉字 无空格) %d '#13'汉字(汉字字符) %d', 864 [Line, Count, en, cn]); 865 Application.MessageBox(PWideChar(s), '统计 - 记事本', MB_ICONINFORMATION); 866 end; 867 868 procedure TTextEditorForm.upperCaseClick(Sender: TObject); 869 begin 870 strfunction.UpperSelText(Memo1); 871 end; 872 873 procedure TTextEditorForm.UpperFirstLatterClick(Sender: TObject); 874 begin 875 strfunction.UpperFistLetter(Memo1); 876 end; 877 878 // Printers 879 procedure TTextEditorForm.MemoPrinter(Memo: TMemo; TitleStr: string = '无标题'); 880 var 881 Left: Integer; 882 Top: Integer; 883 i, j, X, Y: Integer; // PageHeight, 884 PagesStr: String; 885 posX, posY, Posx1, posY1: Integer; 886 PrintDialog1: TPrintDialog; 887 begin 888 Left := 500; 889 Top := 800; 890 Y := Top; // 40 891 X := Left; // 80 892 j := 1; 893 PrintDialog1 := TPrintDialog.Create(Application); 894 if PrintDialog1.Execute then 895 begin 896 if Memo1.text = '' then 897 Exit; // 文本为空 本次操作不会被执行 898 899 With Printer do 900 begin 901 BeginDoc; // 另存的打印的文件名 如何实现 默认为 .jnt 902 // Form2.Show; 903 Canvas.Font := Memo.Font; 904 // ------------------------------------------------------------------------- 905 // 打印文件名的标题 906 // TitleStr:='无标题'; 907 posX := (PageWidth div 2) - Length(TitleStr) * 50; // x+1800; 908 posY := (PageHeight * 6) div 100; 909 910 // 第N页的标题 911 PagesStr := Format('第 %d 页', [Printer.PageNumber]); 912 Posx1 := (PageWidth div 2) - Length(PagesStr) * 50; 913 posY1 := (PageHeight * 92) div 100; 914 // ------------------------------------------------------------------------- 915 for i := 0 to Memo.Lines.Count - 1 do 916 begin 917 Canvas.TextOut(X, Y, Memo.Lines[i]); // TextOut(Left,Top,string); 918 Y := Y + Memo.Font.Size * 10; 919 // Memo.Font.Size*10为行间距 第1行与第2行的间距,2和3,3与4,... 920 921 if (Y > PageHeight - Top) then 922 begin 923 Canvas.TextOut(posX, posY, TitleStr); 924 for j := 1 to Printer.PageNumber do 925 begin 926 PagesStr := Format('第 %d 页', [j]); 927 Canvas.TextOut(Posx1, posY1, PagesStr); 928 // Form2.Label1.Caption := System.Concat(' 正在打印', #13#10, TitleStr, 929 // #13#10, Format('第 %d 页', [j])); 930 // if Form2.Tag = 1 then 931 // begin 932 // Abort; 933 // Exit; 934 // end; 935 end; 936 NewPage; 937 Y := Top; 938 end; 939 end; 940 Canvas.TextOut(posX, posY, TitleStr); 941 Canvas.TextOut(Posx1, posY1, Format('第 %d 页', [j])); 942 // Form2.Close; 943 EndDoc; 944 end; 945 end; 946 end; 947 948 procedure TTextEditorForm.LoadConfig(Sender: TObject); 949 begin 950 ReadformState('MainForm', AppINI, Self); 951 952 with TIniFile.Create(AppINI) do 953 begin 954 Memo1.Font.Name := ReadString('Memo', 'FontName', '宋体'); 955 Memo1.Font.Size := ReadInteger('Memo', 'Size', 10); 956 mni_StatusBar.Checked := ReadBool('Other', 'StatueBarChecked', True); 957 mni_WordWrap.Checked := ReadBool('Other', 'WordWrapChecked', True); 958 Free; 959 end; 960 end; 961 962 procedure TTextEditorForm.SaveConfig(Sender: TObject); 963 begin 964 WriteformState('MainForm', AppINI, Self); 965 966 with TIniFile.Create(AppINI) do 967 begin 968 WriteString('Memo', 'FontName', Memo1.Font.Name); 969 WriteInteger('Memo', 'Size', Memo1.Font.Size); 970 WriteBool('Other', 'StatueBarChecked', mni_StatusBar.Checked); 971 WriteBool('Other', 'WordWrapChecked', mni_WordWrap.Checked); 972 Free; 973 end; 974 end; 975 976 procedure TTextEditorForm.act_SetCaretPosExecute(Sender: TObject); 977 begin 978 if GetUserDefaultUILanguage() = $0804 then // SetUiCHS // Caption:='简体中文'; 979 StatusBar1.Panels[1].text := Format(' %s %d %s,%s %d %s ', 980 [sLine, Memo1.CaretPos.Y + 1, scol, sLine, Memo1.CaretPos.X + 1, scol]) 981 else 982 // SetUiEN; //Caption:='英文'; 983 StatusBar1.Panels[1].text := Format(' %s %d ,%s %d ', 984 [sLine, Memo1.CaretPos.Y + 1, scol, Memo1.CaretPos.X + 1]); 985 end; 986 987 end.