스타터 에디션으로 메모장 클론 만들기
17041 단어 objectpascal델파이PascalVCLprogramming
begin { 소개
작년 말 Delphi Advent Calendar 2017에서 Delphi Starter Edition에서 메모장 클론을 만드는 기사를 썼습니다.

그리고 이런 기사를 찾았습니다.
헤에! 맞아! ! ...라는 것으로 이 기능을 추가하고 싶습니다.
구현
마지막까지 소스 코드 다운로드
지난번 종료 시점의 소스 코드는 다음에서 DL할 수 있습니다.
리팩토링
파일을 읽고 있는 장소가 3 개소 있으므로, 이것을 하나로 정리합니다.
frmuMain.pas
... // キャプションを変更 UpdateCaption; // エンコーディングを指定して読み込み Memo1.Lines.LoadFromFile(FFileName, GetEditorEncoding); ... 우선 클래스의 정의부에 LoadFromFile() 라고 하는 메소드를 만듭니다.
frmuMain.pas
... private { Private 宣言 } FFileName: String; FEncodingIndex: Integer; FHeaderStr: string; FFooterStr: string; FMarginTop: Integer; FMarginBottom: Integer; FMarginLeft: Integer; FMarginRight: Integer; function DetectEncodingFromFile(FileName: string): Integer; procedure DispRowCol; function GetEditorEncoding: TEncoding; function GetTextFileName: string; procedure Init(AFileName: string = ''); procedure LoadFromFile; // <- 追加 procedure PrintText(const HeaderStr, FooterStr: string); procedure SaveFile; procedure UpdateCaption; procedure WmDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES; public { Public 宣言 } end; ... 실장부는 다음과 같습니다. implementation 아래에 설명합니다.
frmuMain.pas
procedure TForm1.LoadFromFile; begin // キャプションを変更 UpdateCaption; // エンコーディングを指定して読み込み Memo1.Lines.LoadFromFile(FFileName, GetEditorEncoding); end; 그리고 Memo1.Lines.LoadFromFile() 로 되어 있는 개소를, 이 LoadFromFile() 로 옮겨놓습니다. 우선 WmDropFiles() 메시지 핸들러 안.
frmuMain.pas
procedure TForm1.WmDropFiles(var Msg: TWMDropFiles); var Buf: array [0..MAX_PATH] of Char; begin // ドロップされた (最初の) ファイル名を取得 DragQueryFile(Msg.Drop, 0, Buf, MAX_PATH); DragFinish(Msg.Drop); // ファイル名を保存 FFileName := StrPas(Buf); // エンコーディングを判定 FEncodingIndex := DetectEncodingFromFile(FFileName); // ファイルを読み込み LoadFromFile; // 修正 end; FormShow() 이벤트 핸들러 안.
frmuMain.pas
procedure TForm1.FormShow(Sender: TObject); // フォーム表示時 var FileName, Msg: string; ret: Integer; reg: TRegistryIniFile; begin ... FileName := ParamStr(1); if TFile.Exists(FileName) then begin // ファイルが存在する FFileName := FileName; // エンコーディングを判定 FEncodingIndex := DetectEncodingFromFile(FFileName); // ファイルを読み込み LoadFromFile; // 修正 end else begin ... acOpenExecute() 이벤트 핸들러 안.
frmuMain.pas
procedure TForm1.acOpenExecute(Sender: TObject); // Action: 開く(O)... begin OpenTextFileDialog1.EncodingIndex := FEncodingIndex; if OpenTextFileDialog1.Execute then begin // 値を保存 FFileName := OpenTextFileDialog1.FileName; FEncodingIndex := OpenTextFileDialog1.EncodingIndex; // ファイルを読み込み LoadFromFile; // 修正 end; end; 이것으로 리팩토링이 완료됩니다. 파일을 여는 논리가 한 곳에 집계되었습니다.
날짜 삽입 로직 추가
날짜 삽입 로직은 다음과 같습니다.
선행이 ".LOG"라는 것은 대문자로 .LOG 로부터 시작되고 있다고 하는 의미로, 소문자에서는 안 됩니다만, .LOGCABIN 는 받아들입니다. 별을 흩뜨린 달콤한 밤을 지금도 생각나네요 (?).
첫 번째 줄은 Memo1 (TMemo)의 Lines 속성의 첫 번째 요소입니다. 즉 Memo1.Lines[0] 가 선두행의 캐릭터 라인이 됩니다. 이것을 조사하면 좋지만 Memo1이 비어 있으면 액세스 할 수 없습니다. 즉, 우선은 최저라도 일행 존재할지 어떨지를 판정하지 않으면 안됩니다. Memo1의 행 수는 Lines.Count 속성에서 확인할 수 있습니다.
if Memo1.Lines.Count > 0 then begin // ここに処理 end; 첫 번째 행이 ".LOG"로 시작하는지 여부는 System.Pos() 함수에서 확인할 수 있습니다. System.Pos()은 대소문자를 구분합니다. 단순한 비교이므로 정규 표현식을 사용할 때까지 없을 것입니다.
if Pos('.LOG', Memo1.Lines[0]) = 1 then begin // ここに処理 end; TMemo의 끝에 행을 추가하려면 Lines.Add() 메서드를 사용합니다. 다음 코드는 Memo1의 끝에 'ABC'라는 행을 추가합니다.
Memo1.Lines.Add('ABC'); 이것을 근거로 하면, LoadFromFile() 메소드의 내용은 이렇게 됩니다.
frmuMain.pas
procedure TForm1.LoadFromFile; begin // キャプションを変更 UpdateCaption; // エンコーディングを指定して読み込み Memo1.Lines.LoadFromFile(FFileName, GetEditorEncoding); // 日付の追加 if (Memo1.Lines.Count > 0) and (Pos('.LOG', Memo1.Lines[0]) = 1) then begin Memo1.Lines.Add(FormatDateTime('hh:nn yyyy/mm/dd', Now)); Memo1.Lines.Add(''); end; end; 결론 } end.
작은 개조이므로 프로퍼티나 메소드를 알고 있으면 간단했습니다.
Delphi Starter Edition은 현재 10.2 Tokyo Release 3 (10.2.3)이 출시되었습니다. 무료로 업데이트할 수 있으므로 Starter Edition을 사용하시는 분은 꼭 업데이트해 보세요.

새로 설치하면 처음부터 10.2.3이 됩니다.
See also:
Reference
이 문제에 관하여(스타터 에디션으로 메모장 클론 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ht_deko/items/90b8500d0ca4fc286206텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)