プラグイン プログラム構成 後編
イベント処理 mRowCol.pas の中に必要な処理を書きます。
ここで渡される「hwnd: HWND」は、開いている文書毎に変わるのが重要な項目です。
procedure SetRowCol(hwnd: HWND);
var
sStr1: String;
sStr2: String;
sStr4: String;
sStr6: WideString;
sStr7: WideString;
sStr9: String;
iValue1: Integer;
iValue2: Integer;
iRow1: Integer;
iLen2: Integer;
iLen3: Integer;
iLen5: Integer;
iNum2: Integer;
iMod2: Integer;
iPosX: Integer;
iPosY: Integer;
LpPPoint1: PPoint;
Text: array [0..MAX_LINE_LENGTH-1] of Char;
LpBuffer: array [0..MAX_PATH - 1] of Char;
OutPutText: array [0..MAX_LINE_LENGTH-1] of Char;
LineInfo: TGetLineInfo;
begin
//カーソル位置
New(LpPPoint1);
try
Editor_GetCaretPos(hwnd, POS_LOGICAL, LpPPoint1);
iPosX := LpPPoint1.X;
iPosY := LpPPoint1.Y;
finally
Dispose(LpPPoint1);
end;
//該当行の文字列を取得
FillChar(Text, SizeOf(Text), 0);
LineInfo.flags := POS_LOGICAL;
LineInfo.cch := Length(Text);
LineInfo.yLine := iPosY;
Editor_GetLine(hwnd, @LineInfo, Text);
sStr4 := Text;
//設定
sStr6 := Copy(sStr4, 1, iPosx);
//桁位置を計算
iNum2 := 0;
iLen2 := 0;
sStr9 := ' ';
for iRow1 := 0 to iPosX-1 do
begin
//1文字設定
sStr7 := MecsCopyC(sStr6, iRow1+1, 1);
FillChar(LpBuffer, SizeOf(LpBuffer), 0);
StrPCopy(PChar(@LpBuffer[0]), sStr7);
//該当文字のエレメント数
iLen3 := MecsCCSLength(sStr6, iRow1+1);
//各エレメントの内容
iValue1 := Ord(LpBuffer[0]);
iValue2 := Ord(LpBuffer[1]);
//エレメントが1以上
if iLen3 > 1 then
begin
if ((iValue1 and $D83C) = $D83C) and ((iValue2 and $DFFD) = $DFFD) then
begin
iLen5 := 0;
end
else if ((iValue1 and $D83C) = $D83C) and ((iValue2 and $DFFF) = $DFFF) then
begin
iLen5 := 0;
end
else
begin
iLen5 := 2;
end;
end
//エレメントが1
else
begin
if iValue1 = $0000 then //情報なし
begin
iLen5 := 0;
end
else if iValue1 = $200D then //特殊文字
begin
iLen5 := 0;
end
else if iValue1 > $00FF then //半角エリア外
begin
iLen5 := 2;
end
else if iValue1 = $0009 then //タブ
begin
iLen5 := IntTabSize;
end
else
begin
iLen5 := 1; //該当外なので半角
end;
end;
//とりあえず加算
iLen2 := iLen2+ iLen5;
//余り
iMod2 := iLen2 mod IntTabSize;
//無し
if iMod2 = 0 then
begin
iNum2 := iNum2 + iLen5;
iLen2 := 0;
end
//有り
else
begin
//タブ
if iLen5 = IntTabSize then
begin
iNum2 := iNum2 + iLen5 - iMod2;
iLen2 := 0;
end
//タブ以外
else
begin
iNum2 := iNum2 + iLen5;
end;
end;
//設定
sStr9 := sStr9 + IntToStr(irow1+1) + '@' + sStr7 + '@' + IntToStr(iLen3) + '$' +
IntToHex(Ord(LpBuffer[0]), 4) + '$' + IntToHex(Ord(LpBuffer[1]), 4) + ' ';
end;
//設定
sStr1 := ' ' +
Format('%d',[iPosY+1]) + ' 行, ' +
Format('%d',[iNum2+1]) + ' 桁' ;
//設定
sStr1 := sStr1 + ' (' +
Format('%d',[iPosY+1]) + ' 行, ' +
Format('%d',[iPosX+1]) + ' 列) ' +
'タブ=' + IntToStr(IntTabSize);
//詳細
if BoolShowDetail = TRUE then
begin
sStr1 := sStr1 + sStr9
end;
//指定桁オーバー
if BoolShowAddMark= TRUE then
begin
if iNum2 > IntLineWrap then
begin
sStr1 := '●' + sStr1;
end
else
begin
sStr1 := ' ' + sStr1;
end;
end
else
begin
sStr1 := ' ' + sStr1;
end;
//現在の内容を取得
FillChar(OutPutText, SizeOf(OutPutText), 0);
Editor_GetOutputString(hwnd, MAX_LINE_LENGTH, OutPutText);
sStr2 := StrPas(OutPutText);
//前回と異なる
if (sStr1 <> sStr2) then
begin
//アウトプットバー
if BoolShowOutPutBar= TRUE then
begin
Editor_OutputString(hwnd, nil, FLAG_OPEN_OUTPUT);
Editor_OutputString(hwnd, nil, FLAG_CLEAR_OUTPUT);
Editor_OutputString(hwnd, PChar(sStr1), FLAG_OPEN_OUTPUT);
Editor_OutputString(hwnd, nil, FLAG_FOCUS_OUTPUT);
Editor_ExecCommand(hwnd, MEID_WINDOW_NEXT_PANE);
Editor_SetStatus(hwnd, nil);
end
//ステータスバー
else
begin
Editor_SetStatus(hwnd, PChar(sStr1));
Editor_OutputString(hwnd, nil, FLAG_CLEAR_OUTPUT);
Editor_OutputString(hwnd, nil, FLAG_CLOSE_OUTPUT);
end;
end;
end;
procedure TRowColFrame.OnEvents(hwnd: HWND; nEvent: Cardinal; lParam: LPARAM);
begin
if (nEvent and EVENT_CREATE_FRAME) <> 0 then
begin
//Ini
ReadIniFile(hwnd);
//Ini
ReadMeryIniFile(hwnd);
//リセット
BoolClear := FALSE;
end;
if (nEvent and EVENT_CLOSE_FRAME) <> 0 then
begin
if FForm <> nil then
begin
;
end;
end;
if ((nEvent and EVENT_FILE_OPENED) <> 0) or
((nEvent and EVENT_DOC_SEL_CHANGED) <> 0) or
((nEvent and EVENT_IDLE) <> 0) or
((nEvent and EVENT_CHANGED) <> 0) or
((nEvent and EVENT_CARET_MOVED) <> 0) then
begin
//Status
ReadStatus(hwnd);
//表示
if ((BoolRun = TRUE) and (IntZenMode = 0)) or
((IntZenMode = 1) and (BoolShowZenMode = TRUE)) then
begin
//表示
SetRowCol(hwnd);
//更新
BoolClear := TRUE;
end
else
begin
//クリア
if BoolClear = TRUE then
begin
//ステータスバー
Editor_SetStatus(hwnd, nil);
//アウトプットバー
Editor_OutputString(hwnd, nil, FLAG_CLEAR_OUTPUT);
Editor_OutputString(hwnd, nil, FLAG_CLOSE_OUTPUT);
end;
//更新
BoolClear := FALSE;
end;
end;
end;
function TRowColFrame.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
//確保
PropatyForm := TPropatyForm.Create(Application);
//設定
PropatyForm.EditorHwnd := hwnd;
//表示
if PropatyForm.ShowModal = mrOK then
begin
bResult := TRUE;
end
else
begin
bResult := FALSE;
end;
//破棄
PropatyForm.Free;
//保存
if bResult = TRUE then
begin
//Ini
ReadIniFile(hwnd);
//Ini
ReadMeryIniFile(hwnd);
//リセット
BoolClear := TRUE;
//ステータスバー
Editor_SetStatus(hwnd, nil);
//アウトプットバー
Editor_OutputString(hwnd, nil, FLAG_CLEAR_OUTPUT);
//表示
SetRowCol(hwnd);
end;
//
Result := LRESULT(SetProperties);
end;
end;
end;