글상자 HwpCtrl 에 관해 문의드립니다.

안녕하세요.
글상자 HwpCtrl 에 관해 문의드립니다.
아래는 서브셋을 사용하여 글상자 여백, 글상자 필드이름 을 넣는 코드입니다.
그런데 두가지가 같이 적용이 안됩니다. 항상 두번째 넣는 서브셋 만 작동을 합니다.

	act = CreateAction("ShapeObjDialog");
	set = act.CreateSet();
	
	subset = set.CreateItemSet("ShapeListProperites", "ListProperties"); //글상자 여백용
	
	subset2 = set.CreateItemSet("ShapeListProperites", "FieldCtrl"); // 글상자 필드용
	subsubset2 = subset2.CreateItemSet("CtrlData", "CtrlData"); // 글상자 필드용
	
	act.GetDefault(set);

	// 글상자 여백 -------------------------------------
	subset.SetItem("MarginBottom", MiliToHwpUnit(4.0));
	subset.SetItem("MarginTop", MiliToHwpUnit(3.0));
	subset.SetItem("MarginRight", MiliToHwpUnit(2.0));
	subset.SetItem("MarginLeft", MiliToHwpUnit(1.0));

	// 글상자 필드 -------------------------------------
	subsubset2.SetItem("Name", "필드_글박스");

	act.Execute(set);

아래처럼 따로따로 작성시는 잘동작 합니다.

:play_button: 글상자 여백

	act = CreateAction("ShapeObjDialog");
	set = act.CreateSet();
	
	subset = set.CreateItemSet("ShapeListProperites", "ListProperties"); //글상자 여백용

	act.GetDefault(set);

	// 글상자 여백 -------------------------------------
	subset.SetItem("MarginBottom", MiliToHwpUnit(4.0));
	subset.SetItem("MarginTop", MiliToHwpUnit(3.0));
	subset.SetItem("MarginRight", MiliToHwpUnit(2.0));
	subset.SetItem("MarginLeft", MiliToHwpUnit(1.0));

	act.Execute(set);

:play_button: 글상자 필드이름

	act = CreateAction("ShapeObjDialog");
	set = act.CreateSet();
	
	subset2 = set.CreateItemSet("ShapeListProperites", "FieldCtrl"); // 글상자 필드용
	subsubset2 = subset2.CreateItemSet("CtrlData", "CtrlData"); // 글상자 필드용
	
	act.GetDefault(set);

	// 글상자 필드 -------------------------------------
	subsubset2.SetItem("Name", "필드_글박스");

	act.Execute(set);

서브셋 이름도 분명 다르게 주었는데 같이 작동을 안하는 이유는 무엇일까요?? ㅠㅠ

자문자답으로… set 을 한개더 만들어서 실행해보니 작동은 됩니다.
그런데 이게 올바른 코드인지는 잘 모르겠네요..

	act = CreateAction("ShapeObjDialog");
	set = act.CreateSet();
	subset = set.CreateItemSet("ShapeListProperites", "ListProperties"); //글상자 여백용
	act.GetDefault(set);
	
		set2 = act.CreateSet();
		subset2 = set2.CreateItemSet("ShapeListProperites", "FieldCtrl"); // 글상자 필드용
		subsubset2 = subset2.CreateItemSet("CtrlData", "CtrlData"); // 글상자 필드용
		act.GetDefault(set2);

	// 글상자 여백 -------------------------------------
	subset.SetItem("MarginBottom", MiliToHwpUnit(4.0));
	subset.SetItem("MarginTop", MiliToHwpUnit(3.0));
	subset.SetItem("MarginRight", MiliToHwpUnit(2.0));
	subset.SetItem("MarginLeft", MiliToHwpUnit(1.0));

		// 글상자 필드 -------------------------------------
		subsubset2.SetItem("Name", "필드_글박스");

		act.Execute(set2);
	act.Execute(set);

개념적으로

act = CreateAction(...)

set = act.CreateSet();
subset = ...
act.GetDefault(set);

	set2 = ...
	subset2 = ...
	subsubset2 = ...
	act.GetDefault(set2);
...
...
	act.Execute(set2);
act.Execute(set);

이런식 구조로 사용해도 문제가 없을까요? ㅎㅎ
공식 API에는 아래처럼 액션2개를 사용시 문제가 생길수 있다고 써있는데
세트는 2개를 써도 상관이 없을가요??


공식문서
한글 액션을 이용하면서 주의해야할 점은 하나의 액션을 Create한 후 Execute하기 전까지 또 다른 액션을 Create하면 안된다.
예를 들어,

act1.CreateAction();
act2.CreateAction();
...
act1.Execute();
act2.Execute();

위와 같이 사용할 경우 잘못된 동작을 수행하게 되는 경우가 발생할 수 있다.

안녕하세요.

액션은 하나의 셋으로 저장하여 실행하는 방식으로 구현하면 됩니다.
ParameterSet의 구조는 key - value 로 구성되며, value에 ParameterSet(서브셋)을 가질 수도 있도록 되어 있습니다.

액션과 ParameterSet은 보통 아래와 같은 형식으로 구현하는데요. 참고 부탁드립니다.

<javascript>

	var act = CreateAction("ShapeObjDialog");
	var set = act.CreateSet();
	var drawTextSet, ctrlDataSet;
	
	// 액션을 생성하면 기본값을 가져오기 위해 가장 먼저 수행
	act.GetDefault(set);

	// 가져온 기본값에 글상자와 관련된 서브셋 아이템이 있는지 체크 후에 있으면 서브셋의 아이템을 가져오고, 없으면 글상자 서브셋을 생성합니다.
	if (set.ItemExist("ShapeListProperites")) {
		drawTextSet = set.Item("ShapeListProperites");			
	} else {
		drawTextSet = set.CreateItemSet("DrawTextBox", "ShapeListProperites");
	}

	// 가져오거나 생성한 서브셋에 아이템을 지정
	drawTextSet.SetItem("MarginBottom", MiliToHwpUnit(4.0));
	drawTextSet.SetItem("MarginTop", MiliToHwpUnit(3.0));
	drawTextSet.SetItem("MarginRight", MiliToHwpUnit(2.0));
	drawTextSet.SetItem("MarginLeft", MiliToHwpUnit(1.0));
	
	// 서브셋의 서브셋의 아이템이 있는지 체크, 위와 동일
	if (drawTextSet.ItemExist("CtrlData")) {
		ctrlDataSet = drawTextSet.Item("CtrlData")
	} else {
		ctrlDataSet = drawTextSet.CreateItemSet("CtrlData", "CtrlData");
	}
	
	ctrlDataSet.SetItem("Name", "글상자_필드");

	// 변경된 서브셋의 값을 지정
	drawTextSet.SetItem("CtrlData", ctrlDataSet);	
	set.SetItem("ShapeListProperites", drawTextSet);
	
	// 액션 수행
	act.Execute(set);

PS) 위의 방법은 한글 오토메이션에서 사용 가이드고 한글 컨트롤의 경우 약간 사용법이 다를 수 있으니 참고 바랍니다.

  • 제목에 HwpCtrl이라 하셔서 참고 삼아 남깁니다.

감사합니다.

1개의 좋아요

해결책을 주셔서 감사합니다. (^^) (__);;
코드가 잘 작동을 하는군요..

몇가지 더 궁금한게 있어서 추가 문의 드리고 싶습니다.

일단 제 경우 두가지 기능 모두 else 값 안거치고 실행이 되는데요
한가지 기능만 else 값을 빼고 코드를 단순화 하면

	act = CreateAction("ShapeObjDialog");
	set = act.CreateSet();

	// 액션을 생성하면 기본값을 가져오기 위해 가장 먼저 수행
	act.GetDefault(set);

	// 서브셋의 아이템을 가져옴
	drawTextSet = set.Item("ShapeListProperites");			

	// 가져온 서브셋에 아이템을 지정
	drawTextSet.SetItem("MarginBottom", MiliToHwpUnit(4.0));

	// 변경된 서브셋의 값을 지정
	set.SetItem("ShapeListProperites", drawTextSet);

	// 액션 수행
	act.Execute(set);

이런식으로 됩니다.

여기서 문의 사항이 여직까지 저는 서브셋을 set.CreateItemSet 으로 만들었는데.
서브셋중에 필요한 아이템명만 알면 아래처럼 set.Item 으로 가져와도 되는지요??

	// 서브셋의 아이템을 가져옴
	drawTextSet = set.Item("ShapeListProperites");	

그리고 요부분이 이해가 잘 안되는데요.

	// 변경된 서브셋의 값을 지정
	set.SetItem("ShapeListProperites", drawTextSet);

위에줄에 있는

	// 가져온 서브셋에 아이템을 지정
	drawTextSet.SetItem("MarginBottom", MiliToHwpUnit(4.0));

아래여백을 4밀리미터 준 drawTextSet
ShapeListProperites 셋에 지정해준다고 이해하면 될까요??

① 여기서 문의 사항이 여직까지 저는 서브셋을 set.CreateItemSet 으로 만들었는데.
서브셋중에 필요한 아이템명만 알면 아래처럼 set.Item 으로 가져와도 되는지요??
→ if 문으로 ItemExist를 한 것은 개체의 상태에 따라 “ShapeListProperites” 서브셋 아이템이 있을 수도 있고, 없을 수도 있기 때문입니다.

  1. 글상자가 있는 개체를 선택한 후에 ShapeObjDialog 액션의 GetDefault를 수행하면 “ShapeListProperites” 아이템이 있을테고,
  2. 글상자가 없는 일반 도형을 선택했을 때는 “ShapeListProperites” 아이템이 없을겁니다.
    서브셋의 아이템이 없으면 CreateItemSet으로 아이템을 새로 생성해야 하는 것이고, 아이템이 있으면 Item으로 가져오면 되는것이지요.

② set.SetItem(“ShapeListProperites”, drawTextSet) 코드 관련
→ 제가 PS로 코멘트를 한 것이 이것 때문인데요.
한글 오토메이션의 경우 Item, CreateItemSet으로 생성한 서브셋의 아이템이 참조형이 아닌 복사형으로 개체가 생성되기 때문입니다.
그래서 생성하거나 반환된 서브셋을 set에 직접 설정하는 단계를 코드로 추가시켰습니다.

(반면에 한글 컨트롤(HwpCtrl.ocx)의 경우 참조형이기 때문에 Item, CreateItemSet으로 반환된 서브셋에 SetItem으로 값을 채우기만 하면 됩니다.)

답변이 됐는지는 모르겠는데요.
다른 문의가 있으시면 남겨주세요.
감사합니다.

1개의 좋아요