스타터 에디션으로 메모장 클론 만들기
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.)