스타터 에디션으로 메모장 클론 만들기

begin { 소개



작년 말 Delphi Advent Calendar 2017에서 Delphi Starter Edition에서 메모장 클론을 만드는 기사를 썼습니다.


  • Delphi Starter Edition으로 메모장 클론 만들기 (전편)
  • Delphi Starter Edition에서 메모장 클론 만들기 (후편)
  • Delphi Starter Edition으로 메모장 클론 만들기 - 2nd Edition -

  • 그리고 이런 기사를 찾았습니다.
  • 【Windows 뒷면] 4 문자 입력하는 것만으로 [메모장]이 편리하게된다는 것을 알고 있었습니까? (할 수있는 그물)

  • 헤에! 맞아! ! ...라는 것으로 이 기능을 추가하고 싶습니다.

    구현



    마지막까지 소스 코드 다운로드



    지난번 종료 시점의 소스 코드는 다음에서 DL할 수 있습니다.
  • htps : // ht-에서. 이 m/그 f와 ぁ레/의 테파 d_cぉ네. 지 p

  • 리팩토링



    파일을 읽고 있는 장소가 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"라는 것은 대문자로 .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:
  • Delphi Starter Edition (Embarcadero)
  • Starter Edition 사용자를 위한 Delphi / C++Builder 10.2 Tokyo Starter Edition (무료!)
  • 금요일 사자 (Take it to the lucky) - TM Network (Amazon Music)
  • 좋은 웹페이지 즐겨찾기