안녕하세요.
한글컨트롤을 이용해서
HWP의 메모 보이기/숨기기 여부를 확인할 수 있는 방법이 있는지요?
찾아보니
HwpCtrl.Run(“ViewOptionMemo”);
를 이용하여 메모를 보이기 또는 숨기기를 할 수 있는 방법만 제공하고 현재 메모가 보이기 상태인지? 숨기기 상태인지? 알 수 있는 방법은 찾지 못하여 문의드립니다.
안녕하세요.
한글컨트롤에만 제공하는 API 중에 GetActionCmdUIStatus 가 있습니다.
(한글 오토메이션에서는 제공하지 않음)
액션의 UI 업데이트 상태를 가져오는 함수인데요. checked 상태값을 통해 메모 보기 상태값을 가져올 수 있을 것 같습니다.
(C#)
int checked = 0;
int enabled = 0;
int radio = 0;
string text;
GetActionCmdUIStatue("ViewOptionMemo", true, ref enabled, ref checked, ref radio, text);
감사합니다.
먼저 답변 감사드립니다.
답변주신대로 해보았는데 checked 값은 항상 1로 출력됩니다.
메모 보이기 또는 숨기기를 해도 항상 아래와같은 값을 출력합니다.
checked = 1, enabled =1, radio = 0, text = 메모 보이기/숨기기(&M)
제가 직접 코드를 작성해서 확인해 봤는데 정상 동작했습니다.
(C++)
long bEnabled = 0;
long bChecked = 0;
long radio = 0;
CComBSTR text;
CString szMessage;
m_ocxHwpCtrl.GetActionCmdUIStatus(_T("ViewOptionMemo"), 1, &bEnabled, &bChecked, &radio, &text);
szMessage.Format(_T("메모 보이기 상태 : %s"), bChecked ? _T("보이기") : _T("숨기기"));
AfxMessageBox(szMessage);
작성하신 코드를 공유해주시면 확인해보겠습니다.
감사합니다.
답변감사드립니다.
저는 개발환경이 델파이7 입니다.
한글Neo 9.6.1.10312 사용중입니다.
procedure Buttion1Click(Sender: TObjet);
var
ls_hwpfile : string;
enabled : integer;
checked : integer;
radio : integer;
text : WideString;
begin
enabled := 0;
checked := 0;
radio := 0;
text := ‘’;
ls_hwpfile := ‘C:\1.hwp’;
HWPControl.Open(ls_hwpfile,olevariant(‘’),olevariant(‘forceopen:true’));
HWPControl.GetActionCmdUIStatus(‘ViewOptionMemo’, 1, enabled, checked, radio, text);
shwmessage('enabled : ’ + inttostr(enabled) + ’ checked : ’ + inttostr(checked) + ’ radio : ’ + inttostr(radio) + ’ text : ’ + text);
HWPControl.Clear(1);
end;
-
테스트는 1.hwp 파일을 열어서 메모 숨기기 후 1.hwp를 종료한 후 진행하였습니다.
-
메시지는 메모 보이기, 메모 숨기기 모두 아래와 같이 출력됩니다.
enabled :1 checked : 1 radio :0 text : 메모 보이기/숨기기(&M) -
모두 수기로 작성한 내용이라 오타가 있을 수 있지만 실제 코드는 정상작동하니 오타는 신경안쓰셔도 될것같습니다.
안녕하세요 ^^
GetActionCmdUIStatus의 인자값인 enabled, checked, radio, text 의 경우는 포인터를 한글로 직접 절다해 값을 얻어오는 API 입니다.
델파이에서 포인터를 이용하는 방법을 잠깐 검색해보니 변수명 앞에 ^를 쓰면 되는것 같습니다.
HWPControl.GetActionCmdUIStatus(‘ViewOptionMemo’, 1, ^enabled, ^checked, ^radio, ^text);
만약에 포인터를 사용이 가능하다면 위와 같이 해결할수 있지 않을까 생각이 듭니다.
해당 내용이 도움이 되셨으면 좋겠습니다. 감사합니다 ^^
[HWPCONTROLLib_TLB.pas 에서 해당 함수 내용]
function THwpCtrl.GetActionCmdUIStatus(const actid: WideString; bWithKey: integer; var bEnabled: Integer; var bChecked: Integer; var bRadio: Integer; var szText: WideString): WordBool;
begin
Result := DefaultInterface.GetActionCmdUIStatus(actid, bWithKey, bEnabled, bChecked, bRadio, szText);
end;
위의 내용을 보시면
GetActionCmdUIStatus 함수는 Call by Reference(참조 전달) 방식으로 매개변수를 전달하고 있습니다.
- 관련내용 링크(Call by Reference(참조 전달방식) 참고) : DELPHI 함수 프로시저에서 매개변수 전달방식
참고로 위에서 알려주신 포인터를 사용하는 방식으로 해보았으나 GetActionCmdUIStatus 사용 부분에서 오류가 발생하고 진행이 되지 않았습니다.
테스트하고 계신 문서(1.hwp) 외에 다른 문서로 확인해보셨는지요?
메모 상태가 문서 파일에 영향을 받는 요소가 보여서 확인차 테스트해보셨으면 좋을 것 같습니다.
먼저 계속되는 문의에도 답변을 해주셔서 감사드립니다.
-
말씀하신대로 다른 문서로도 해보았으나 동일한 값이 출력됩니다.
(checked = 1, enabled =1, radio = 0, text = 메모 보이기/숨기기(&M)) -
한글에서 문서를 새로 만들어서 내용도 간단하게만 작성한 후 메모만 추가하여 테스트 해보았고, 메모를 추가하지않고도 해보았고, 기존에 사용중인 문서로도 테스트 해보았지만 동일한 결과입니다.
혹시 가능하시다면, 관련 동작을 테스트할 수 있는 델파이로 작성하신 실행 모듈을 첨부해주시면 디버깅을 해보겠습니다.
(내부에서는 델파이 환경 구성이 어렵습니다.)
언어적인 차이에서 발생한 문제인지 확인해보고 싶어서요.
그냥 궁금해지네요.
제가 외부로 소스등을 전달할 수 없는 상황입니다.
저도 개발언어가 문제이지 않을까 의심스럽습니다.
(제가 가진 한글컨트롤 문서에 GetActionCmdUIStatus 부분을 보니 주의사항에 “이 함수는 빠른 속도가 요구되므로 parameter로 포인터를 받는다. 따라서 포인터를 사용할 수 없는 언어에서는 사용이 불가능하다.” 라고 되어있습니다.)
일단 제 주위에 C# 개발이 가능하신분이 있는데 C#에서 한번 확인해보겠습니다.
만약 C#에서는 정상동작하고 델파이에서는 안된다면 개발언어 문제일수도 있겠네요.
지금 C#으로 해당기능을 구현해서 해보았는데
델파이로 개발한것과 동일하게 메모 보이기/ 숨기기 모두
항상 checked =1 만 출력됩니다. T.T
가능할지 모를겠지만,
혹시 메일을 알려주시면 제가 델파이로 만든 프로그램을 보내드리도록 해보겠습니다.
(공개하기 부담되시면 제 메일로 메일을 한통 보내주시면 보내주신 메일로 보내드리도록 해보겠습니다.)
메일 주소는 개인 정보라서 삭제했습니다.
저의 메일 주소는 메시지로 전달드리겠습니다.
첨부 파일 전달받았고, GetActionCmdUIStatus 함수의 동작은 이상 없음을 확인했습니다.
한글컨트롤은 레지스트리와 같은 로컬 자원을 사용하지 않기 때문에 실행 중에 변경된 보기의 상태(여기서는 메모의 보기)을 로컬에 저장하지 못합니다.
그래서 보기 상태값을 변경하더라도 한글컨트롤을 종료하고 재실행하면 보기 상태는 초기화된 상태를 유지합니다.
한글컨트롤을 재실행 후에 GetActionCmdUIStatus을 호출해도 checked의 상태값은 초기값인 1이 반환된 것임
HWPControl.GetActionCmdUIStatus(‘ViewOptionMemo’, 1, enabled, checked, radio, text);
한글컨트롤을 실행했을 때 메모의 보기 상태를 숨기기로 유지하고자 한다면 아래처럼 응용 로직을 추가하셔야 할 것 같습니다.
HWPControl.GetActionCmdUIStatus(‘ViewOptionMemo’, 1, enabled, checked, radio, text);
if (checked) {
HWPControl.Run("ViewOptionMemo");
}
감사합니다.
제가 하고자하는 일은 사용자의 PC에서 다른사람이 작성한 한글문서를 읽을때 메모 숨기기가 되어있으면 메모가 보이지 않으니 메모 숨기기가 되어있는 경우 개발된 프로그램에서 알려주려고 하는 일입니다.
그래서 저는 사용자의 PC에서 현재 한글의 메모 보이기 상태가 보이기인지 숨기기인지를 알고 싶었습니다.
답변주신 내용대로면 GetActionCmdUIStatus는 한글컨트롤을 이용해서 한글문서를 띄운상태라야 제대로된 값을 전달받을 수 있다는 설명으로 이해됩니다.
하지만 저의 상황은 한글문서를 한글컨트롤을 이용해서 띄우는 부분은 없습니다.
다만, 아래와 같이 내부적으로 파일을 부를수는 있습니다.
ls_hwpfile := ‘C:\1.hwp’;
HWPControl.Open(ls_hwpfile,olevariant(‘’),olevariant(‘forceopen:true’));
아무튼 화면에서 한글컨트롤 위에 한글을 띄우지는 않습니다.
그래서 궁금한것이 있습니다.
-
한글컨트롤을 이용해서 개발되는 프로그램에서 화면위에 한글컨트롤에 한글문서를 띄우지 않고 HWPControl.Open 으로 한글문서를 읽어서도 GetActionCmdUIStatus 에서 정상적으로 값을 전달받아야할것 같은데 제가 위에서 해봤을경우 동일하게 항상 같은 값이 반환됩니다.
-
위에 써주신 부분에서 보면…
HWPControl.GetActionCmdUIStatus(‘ViewOptionMemo’, 1, enabled, checked, radio, text);
if (checked) {
HWPControl.Run(“ViewOptionMemo”);
}
저의 경우 보이기 숨기기 여부에 관계없이 checked 언제나 동일하게 checked = 1 이 반환되는데 그렇다면 언제나 HWPControl.Run(“ViewOptionMemo”); 가 실행될겁니다.
HWPControl.Run(“ViewOptionMemo”); 이부분은 토글이므로 메모가 보이기상태인지 숨기기 상태인지 모르는 상황에서 위 로직이 실행될때마다 메모 보이기, 메모 숨기기 를 왔다갔다 할것 같습니다.
- 레지스트리 등에 따로 저장을 하지 않는다고 하셨는데 한글문서를 열어서 메모보이기를 한뒤에 한글문서를 닫고 다시 한글문서를 열어서 보면 메모보이기로 되어있습니다.
이후 다시 메모 숨기기를 한뒤에 한글문서를 닫고 다시 한글문서를 열어보면 메모 숨기기로 되어있습니다. 이렇게 보면 어딘가에 메모 보이기 숨기기 값을 가지고 있을것 같습니다.
결론적으로 위에 C++로 동작하는 화면을 보여주신것처럼 실제 한글컨트롤을 화면에 띄워서 메모보이기 숨기기를 하지않는 이상 GetActionCmdUIStatus 는 정상적인 값을 반환하지 않는다고 생각하면 되는것인지알고 싶습니다.
<계속되는 문의에 답변 달아주셔서 정말 감사드립니다.>
착오가 있으신 것 같습니다.
메모 보기 상태는 문서에 종속되어 있지는 않고, 앱에 종속된 상태 값입니다.
그래서 다른 사람이 작성한 문서를 불러오더라도 메모 보기 상태값은 문서에 영향을 받지 않기 때문에
한글컨트롤 앱(델파이앱)의 실행했을 때의 보기 상태 값만을 반환하게 되는 것입니다.
HwpControl := THwpCtrl.Create(self);
// 한글컨트롤을 생성했을 때도 checked = 1;
// 한글컨트롤을 화면에 띄우지 않더라도 동일함
HWPControl.GetActionCmdUIStatus(‘ViewOptionMemo’, 1, enabled, checked, radio, text);
...
// 1.hwp 파일이 메모 숨기기 상태로 저장했더라도 checked = 1;
ls_hwpfile := ‘C:\1.hwp’;
HWPControl.Open(ls_hwpfile,olevariant(‘’),olevariant(‘forceopen:true’));
HWPControl.GetActionCmdUIStatus(‘ViewOptionMemo’, 1, enabled, checked, radio, text);
// 앱을 실행했을 때 메모 보기 상태를 변경해야만 checked = 0;
HWPControl.Run(“ViewOptionMemo”);
HWPControl.GetActionCmdUIStatus(‘ViewOptionMemo’, 1, enabled, checked, radio, text);
제가 원하는 기능은 현재 사용자PC에서 한글문서를 열었을때 메모 보이기 상태인지, 메모 숨기기 상태인지 알 수 있는 기능입니다.
위에서 설명하신 내용이 한글컨트롤에서 메모보이기/숨기기 를 실행했을때만 변화된 값을 알 수 있다는 의미라면 제가 원하신 기능은 구현이 불가능하다고 생각됩니다.
혹시 제가 잘못 이해한거라면 다시 한번 알려주셨으면 합니다.
안녕하세요,
문의 주신 내용과 저희가 전달드린 답변을 다시 한 번 정리하려고 합니다.
메모 보이기/숨기기 상태는 앱에 종속되는 값입니다.
이전 댓글 내용 중 "사용자 PC에서 한글문서를 열었을 때"라는 내용이 있는데,
한글 문서를 어떤 앱으로 열었는지에 따라 해당 값은 달라집니다.
-
한글 데스크탑 앱 : 레지스트리 경로의 값 참조
HKEY_CURRENT_USER\SOFTWARE\HNC\Hwp\9.6\HwpFrame\ViewInfo\DocVolFlag
DocVolFlag의 0x00000004 Flag이 있으면 보이기 상태, 없으면 숨기기 상태
(9.6은 NEO 버전을 의미하는 것으로, 한글 버전별로 번호가 다른 점 참고 부탁드립니다.) -
한글컨트롤을 사용하는 앱 : 고정 초기값, 이후 ViewOptionMemo 액션 동작에 따라 토글됨
문서에 저장되는 값이 아니라는 점 확인 부탁드립니다.
말씀하신 것처럼 기능을 구현할 때
기준이 되는 앱이 어떤 앱인지에 따라 구현 방식은 달라질 수 있으며,
한글컨트롤에서 ViewOptionMemo로 값을 변경하더라도 한글 데스크탑 앱에는 영향을 미치지 않습니다.
감사합니다.
PC용 한글과 한글컨트롤용 한글이 다르게 동작하는군요.
제가 지금 레지스트리에 있는 값을 확인해보니
메모숨기기 시에는 DocVolFlag 값이
숨기기 : 16진수 a (10진수 10)
보이기 : 16진수 e (10진수 14)
로 확인됩니다.
말씀하신것과 다른데 이렇게 알고 사용하면 될련지요?
DocVolFlag은 비트 연산으로 여러 가지 값을 함께 담고 있습니다.
그 중에서도 0x00000004 Flag이 있으면 메모 보이기 상태, 없으면 숨기기 상태라는 의미입니다.
2진수로 표현했을 때, 굵게 표시된 위치가 1인 경우가 보이기 상태라고 이해하시면 됩니다.
- 숨기기 : 1010 (16진수 a, 10진수 10)
- 보이기 : 1110 (16진수 e, 10진수 14)
감사합니다.