HwpCtrl의 GetTableCellAddr을 대체할 기능

이전에 HwpCtrl ocx을 사용해서 기능을 구현하였었습니다.

Hwp Automation을 사용해서 동일한 기능을 구현하려고 합니다.
HwpCtrl ocx의 CHwpCtrl클래스에 GetTableCellAddr라는 함수가 있습니다.
이 함수는 커서가 표안에 있다면 커서의 열번호(파라미터가 0일 때), 행번호(파라미터가 1일 때)를 알려주는 함수입니다.

Hwp Automation의 CHwpObject클래스에서 해당 함수를 찾아보았지만 존재하지 않았습니다.
CTable클래스와 CCell클래스를 사용해서 다른 방식을 지원할 거라고 생각은 되는데 매뉴얼만으로 유추하기에 어려움이 있습니다.

도움을 부탁드립니다.
포럼에 올라온 글도 읽어보았지만 관련된 글은 없었습니다.

1개의 좋아요

안녕하세요?
어떤 언어를 사용하시는지 모르겠지만,
파이썬 기준으로 제가 만들어 쓰는 함수는 아래와 같습니다.

def GetTableCellAddr():
    if not hwp.CellShape:  # 표 안에 있을 때만 CellShape 오브젝트를 리턴함
        raise AttributeError("현재 캐럿이 표 안에 있지 않습니다.")
    return hwp.KeyIndicator()[-1][1:].split(")")[0]

def SetTableCellAddr(addr):
    init_addr = hwp.KeyIndicator()[-1][1:].split(")")[0]
    if not hwp.CellShape:  # 표 안에 있을 때만 CellShape 오브젝트를 리턴함
        raise AttributeError("현재 캐럿이 표 안에 있지 않습니다.")
    if addr == hwp.KeyIndicator()[-1][1:].split(")")[0]:
        return
    hwp.Run("CloseEx")
    hwp.FindCtrl()
    hwp.Run("ShapeObjTableSelCell")
    while True:
        current_addr = hwp.KeyIndicator()[-1][1:].split(")")[0]
        hwp.Run("TableRightCell")
        if current_addr == hwp.KeyIndicator()[-1][1:].split(")")[0]:
            SetTableCellAddr(init_addr)
            hwp.Run("Cancel")
            raise AttributeError("입력한 셀주소가 현재 표의 범위를 벗어납니다.")
        if addr == hwp.KeyIndicator()[-1][1:].split(")")[0]:
            return
    
    return hwp.KeyIndicator()[-1][1:].split(")")[0]

도움이 되었길 바랍니다^^

1개의 좋아요

안녕하세요 ^^

위에서 설명해주신것 처럼 KeyIndicator를 이용 하면 가능할것 같습니다.
KeyIndicator api의경우 한글의 상태바에 나오는 정보를 확인 가능합니다.
(B3):문자 입력 ← 이것처럼 표안에 있을 경우 표에 대한 좌표를 확인 가능합니다.

행렬로 A1 A2 B1 B2와 같이 좌표를 가집니다.

A,B,C,D …
1,2,3,4 …

v1,v2,v3,v4,v5,v6,v7,v8,v9 = hwp.KeyIndicator();

감사합니다 ^^

1개의 좋아요

감사합니다. 문제는 해결되었지만 다른 분들이 해당 글을 볼 수 있으므로 더 자세하게 언급합니다.

##############################################
개발 언어는 MFC(VIsual C++)입니다.
이전에 인터넷에서 관련된 글을 본 적이 있는데 KeyIndicator함수의 파라미터가 달라서 잘못된 글이라고 생각했었습니다.
아마도 python와 MFC의 함수가 다른 것으로 보입니다.

MFC의 함수 명세는
BOOL KeyIndicator(long * seccnt, long * secno, long * prnpageno, long * colno, long * Line, long * pos, short * over, BSTR * ctrlname)
와 같은데 그냥 반환값이라고 생각하고 빈 값을 넣어서 확인하였습니다.
BSTR은 GetText함수처럼 죽는 문제가 있어서 CComBSTR로 받았습니다.

확인한 소스코드

		long seccnt = 0, secno = 0, prnpageno = 0, colno = 0, Line = 0, pos = 0;
		short over = 0;
		CComBSTR	ctrlname = _T("");// BSTR은 안 됩니다.반드시 CComBSTR로 합니다.
		BOOL	bSuccessKeyIndicator	= m_ctrlHwp->KeyIndicator(&seccnt, &secno, &prnpageno, &colno, &Line, &pos, &over, &ctrlname);

처럼 구현하였고, ctrlname에 “(B1):문자열"과 같은 형태로 반환됩니다.
파싱해서 인덱스로 바꾸는 부분(”(B1):문자열"으로부터 2열, 1행을 얻기)은 저의 노고가 포함되므로 언급하지 않습니다.

적어주신 글에 파이썬 문법으로 if not hwp.CellShape:로 되어 있었는데 MFC의 경우에 m_ctrlHwp->get_CellShape()으로 받은 값을 어떤 클래스로 받아야 하는지 궁금하지만 저의 경우에는 해당하지 않으므로 나중에 필요하면 다시 여쭈어 보겠습니다.

CCellShape와 같은 클래스가 있을 것이고 IsCell()와 같은 함수가 있을 것이라고 생각했었는데, 그렇지 않아서 조금 더 적어보았습니다.

2개의 좋아요

안녕하세요. 한컴디벨로퍼입니다.

유용한 정보를 이렇게 공유해 주셔서 감사합니다.
한컴디벨로퍼는 고객님의 참여로 성장하고 있습니다. 관심과 기대에 부응하는 한컴디벨로퍼가 되겠습니다.

감사합니다.

한컴디벨로퍼 드림

2개의 좋아요

열심히 활동해 주시고 다양한 정보를 공유해 주셔서 감사합니다.

관심과 기대에 부응하는 한컴디벨로퍼가 되겠습니다.

한컴디벨로퍼 드림

2개의 좋아요