プラグインで、「Mery.ini」のファイルを扱うときには注意が必要です。

 読み込みは TMemIniFile を使用して可能ですが、書き込みはマクロを経由して書き込みます。

注意事項としては「Mery.ini」は Delphi の TiniFile とは文字コードが異なり、「通常」は「UTF16LE BOM在り」ですが「Mery」は「UTF8 BOM在り」です。 また「通常」の TIniFile は書き込むときに先頭と最後の空白が除去されますが、「Mery」は削除されないで書き込まれます。

 

絶対に「Mery.ini」に直接書き込む事は行わないで下さい。書き込みはマクロ経由で行って下さい。

 

 

「通常」

var
  IniFile: TIniFile;

//確保
IniFile := TIniFile.Create (StrIniFile);
//設定
ComboBox1.ItemIndex := IniFile.ReadInteger('FormQuickAccess', 'ComboBox1', 4);
//破棄
IniFile.Free;

「Mery」

var
  IniFile: TMemIniFile;
 
//確保
IniFile := TMemIniFile.Create(sStr21, TEncoding.UTF8);
//設定
iCnt1   := IniFile.ReadInteger('PinnedFile', 'Count',    0);
//破棄
IniFile.Free;


MeryReadOnlyTrue.js
editor.WriteSettingInteger("Display", "GeneralBackColor", 4194304)
editor.WriteSettingInteger("Display", "GeneralForeColor", 16119285)
editor.ReadSettings()


プラグインから他のプラグインの起動を取得する場合は以下を使用します。

function CheckPlugin(PluginName: String): Boolean;
var
  ID: Cardinal;
  LChecked: BOOL;
  LDllHandle: HMODULE;
begin
  LDllHandle := GetModuleHandle(PChar(PluginName));
  if LDllHandle <> 0 then
  begin
    //DLL のハンドルを取得
    ID := Editor_GetCmdID(EditorHwnd, LDllHandle);
    //プラグインが実行可能か、またはチェックされた状態かを調べます
    Editor_QueryStatus(EditorHwnd, ID, @LChecked);
    //設定
    if LChecked = TRUE then
    begin
      Result := TRUE;
    end
    else
    begin
      Result := FALSE;
    end;
  end
  else
  begin
      Result := FALSE;
  end;
end;

プラグインのイベント以外に、キーボードのイベントが利用できます。 Delphi の OnKeyDown と同じ処理が使用できます。 最初は検索ダイアログが表示している場合の判定はできないと思ってメッセージダイアログを表示して対応していましたが、トップウィンドウのタイトル文字の判定で対応が可能でした。

function TReadOnlyFrame.PluginProc(hwnd: HWND; nMsg: Cardinal; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
  bResult: Boolean;
begin
  Result := 0;
  case nMsg of
    MP_QUERY_PROPERTIES:
      begin
        Result := LRESULT(QueryProperties);
      end;
    MP_SET_PROPERTIES:
      begin
        Result := LRESULT(SetProperties);
      end;
    MP_PRE_TRANSLATE_MSG:
      Result := LRESULT(PreTranslateMessage(hwnd, PMsg(lParam)^));
  end;
end;
function TReadOnlyFrame.PreTranslateMessage(hwnd: HWND; var Msg: tagMSG): Boolean;
var
  LCtrl, LShift: Boolean;
  iPos1: Integer;
  wHwnd1: Thandle;
  sCaption: String;
  iLen1: Integer;
  sStr1: String;
  sStr6: String;
  sStr12: String;
  StrList13: TStringList;
begin
  //書込禁止
  //// 3.3.2
  if Editor_Info(hwnd, MI_GET_READ_ONLY, 0) = 0 then
  begin
     Result := FALSE;
     Exit;
  end;
  if Msg.message = WM_KEYDOWN then
  begin
    //トップウィンドウのタイトル
    wHwnd1 := GetForegroundWindow;
    SetLength(sCaption, 1023);
    iLen1 := GetWindowText(wHwnd1, PChar(sCaption), Length(sCaption) - 1);
    SetLength(sCaption, iLen1);
    sStr1 :=sCaption;
    iPos1 := Pos(UpperCase(TITLE_BAR_MERY), UpperCase(sStr1));
    //キー状態
    LCtrl  := GetKeyState(VK_CONTROL) < 0;
    LShift := GetKeyState(VK_SHIFT)   < 0;

    //プラグインの起動
    bRun  := FALSE;
    bRun1 := FALSE;
    bRun2 := FALSE;
    bRun3 := FALSE;
    bRun4 := FALSE;
    bRun5 := FALSE;
    if CheckPlugin('OutLine.dll') = TRUE then
    begin
      bRun1 := TRUE;
    end;
    //
    if CheckPlugin('MeryOutLine.dll') = TRUE then
    begin
      bRun2 := TRUE;
    end;
    //
    if CheckPlugin('MeryColCount.dll') = TRUE then
    begin
      bRun3 := TRUE;
    end;
    //
    if CheckPlugin('MarkdownPreview.dll') = TRUE then
    begin
      bRun4 := TRUE;
    end;
    //
    if CheckPlugin('WebPreview.dll') = TRUE then
    begin
      bRun5 := TRUE;
    end;
    //
    if (bRun1 = TRUE) or (bRun2 = TRUE) or (bRun3 = TRUE) or (bRun4 = TRUE) or (bRun5 = TRUE)then
    begin
      bRun := TRUE;
    end;

    //キーボード
    if Msg.wParam = VK_RETURN then
    begin
      //Ctrl なら無条件
      if  (LShift = FALSE) and (LCtrl = TRUE) then
      begin
        //終了確認
        ConfirmExit(hwnd);
        //結果
        sStr12 := ExtractFilePath(ParamStr(0)) + MACROS_FOLDER_NAME + '\' + MACROS_FILE_NAME_RESULT;
        if System.SysUtils.FileExists(sStr12, FALSE) = TRUE then
        begin
          //読込
          StrList13 := TStringList.Create;
          try
            StrList13.LoadFromFile(sStr12);
            sStr6 := StrList13.Strings[0];
          finally
            StrList13.Free;
          end;
        end;
        //全て書込禁止
        if (BoolExitCtrlEnter = TRUE) and (sStr6 = MACROS_FILE_NAME_RESULT_TRUE) then
        begin
          Editor_ExecCommand(hwnd, MEID_FILE_CLOSE_ALL);
          Result := TRUE;
          Exit;
        end
        else
        begin
          Result := FALSE;
          Exit;
        end;
      end
      //Enter で -Mery が前面
      else if  (LShift = FALSE) and (LCtrl = FALSE) and (iPos1 > 0) then
      begin
        //終了確認
        ConfirmExit(hwnd);
        //結果
        sStr12 := ExtractFilePath(ParamStr(0)) + MACROS_FOLDER_NAME + '\' + MACROS_FILE_NAME_RESULT;
        if System.SysUtils.FileExists(sStr12, FALSE) = TRUE then
        begin
          //読込
          StrList13 := TStringList.Create;
          try
            StrList13.LoadFromFile(sStr12);
            sStr6 := StrList13.Strings[0];
          finally
            StrList13.Free;
          end;
        end;
        //全て書込禁止でプラグインが起動されていない
        if (BoolExitEnter = TRUE) and (sStr6 = MACROS_FILE_NAME_RESULT_TRUE) and (bRun = FALSE) then
        begin
          Editor_ExecCommand(hwnd, MEID_FILE_CLOSE_ALL);
          Result := TRUE;
          Exit;
        end
        else
        begin
          Result := FALSE;
          Exit;
        end;
      end
      //
      else
      begin
        Result := FALSE;
        Exit;
      end;
    end
    //
    else if Msg.wParam = VK_ESCAPE then
    begin
      //Escape で -Mery が前面
      if (iPos1 > 0)  then
      begin
        //終了確認
        ConfirmExit(hwnd);
        //結果
        sStr12 := ExtractFilePath(ParamStr(0)) + MACROS_FOLDER_NAME + '\' + MACROS_FILE_NAME_RESULT;
        if System.SysUtils.FileExists(sStr12, FALSE) = TRUE then
        begin
          //読込
          StrList13 := TStringList.Create;
          try
            StrList13.LoadFromFile(sStr12);
            sStr6 := StrList13.Strings[0];
          finally
            StrList13.Free;
          end;
        end;
        //全て書込禁止でプラグインが起動されていない
        if (BoolExitEscape = TRUE) and (sStr6 = MACROS_FILE_NAME_RESULT_TRUE) and (bRun = FALSE) then
        begin
          Editor_ExecCommand(hwnd, MEID_FILE_CLOSE_ALL);
          Result := TRUE;
          Exit;
        end
        else
        begin
          Result := FALSE;
          Exit;
        end;
      end
      else
      begin
          Result := FALSE;
          Exit;
      end;
    end
    else
    begin
      Result := FALSE;
      Exit;
    end;
  end;
  //
  Result := FALSE;
end;


マクロ側で実行した結果をファイルに保存しているので、プラグインから結果のファイルを読み込んで使用します。

function TReadOnlyFrame.PreTranslateMessage(hwnd: HWND; var Msg: tagMSG): Boolean;
var
  LCtrl, LShift: Boolean;
  sStr6: String;
  sStr12: String;
  iResult1: Integer;
  StrList13: TStringList;
begin
  if Msg.message = WM_KEYDOWN then
  begin
    LCtrl  := GetKeyState(VK_CONTROL) < 0;
    LShift := GetKeyState(VK_SHIFT)   < 0;
    if Msg.wParam = VK_RETURN then
    begin
      //
      if  (LShift = FALSE) and (LCtrl = TRUE) then
      begin
        //終了確認
        ConfirmExit(hwnd);
        //結果
        sStr12 := ExtractFilePath(ParamStr(0)) + MACROS_FOLDER_NAME + '\' + MACROS_FILE_NAME_RESULT;
        if System.SysUtils.FileExists(sStr12, FALSE) = TRUE then
        begin
          //読込
          StrList13 := TStringList.Create;
          try
            StrList13.LoadFromFile(sStr12);
            sStr6 := StrList13.Strings[0];
          finally
            StrList13.Free;
          end;
        end;
        //全て書込禁止
        if (BoolExitCtrlEnter = TRUE) and (sStr6 = MACROS_FILE_NAME_RESULT_TRUE) then
        begin
          Editor_ExecCommand(hwnd, MEID_FILE_CLOSE_ALL);
          Result := FALSE;
          Exit;
        end;
      end    
    end
    else
    begin
      ;
    end;
  end;
  Result := FALSE;
end;

プラグインからマクロを実行した時に、実行結果をファイルに保存して、プラグインからファイルを読み込んで利用する事が可能です。

var bResult1 = true;
//タブ有効
if (editor.EnableTab == true) {
  //設定
  var doc = editor.documents;
  //文書数だけ実行
  for (i = 0; i < doc.Count; i++) {
    //個別
    var item = doc.item(i);
    //書込禁止
    if (item.ReadOnly == false) {
        bResult1 = false;
    }
    //編集
    if (item.Saved == false) {
        bResult1 = false;
    }
  }
}
//タブ無効
else {
  //設定
  var edit = editors;
  //文書数だけ実行
  for (i = 0; i < edit.Count; i++) {
    //個別
    var item = edit.item(i);
    //書込禁止
    if (item.ActiveDocument.ReadOnly == false) {
        bResult1 = false;
    }
    //編集
    if (item.ActiveDocument.Saved == false) {
        bResult1 = false;
    }
  }
}

if (bResult1 == true){
  sResult = 'ReadOnly=true';
}
else {
  sResult = 'ReadOnly=false';
}

// Scripting.FileSystemObject の定数
var ForReading = 1;          // ファイルを読み取り専用として開きます。このファイルには書き込むことができません。
var ForWriting = 2;          // ファイルを書き込み専用として開きます。
var ForAppending = 8;        // ファイルを開き、ファイルの最後に追加して書き込みます。
var TristateUseDefault = -2; // システム デフォルトを使ってファイルを開きます。
var TriStateTrue = -1;       // ファイルを Unicode ファイルとして開きます。
var TristateFalse = 0;       // ファイルを ASCII ファイルとして開きます。
var filename = 'C:\\WIN_APL\\MeryPortable64\\Macros\\MeryReadOnlyResult.txt';
var fso = new ActiveXObject( "Scripting.FileSystemObject" );
var fsOut = fso.OpenTextFile( filename, ForWriting, true, TriStateTrue );
fsOut.Write(sResult);
fsOut.Close();