오토핫키 커뮤니티

정보
2016.06.25 22:54

소개 : CJon class

조회 수 729 추천 2 댓글 1

출처 : http://v1.autohotkey.co.kr/cgi/board.php?bo_table=script&wr_id=1987


오핫사사의 만약에님이 만드신건데 오브젝트 단위로 파일 저장 및 로딩 할수 있어서 오브젝트로 설정 관리 하시는 분들에게는 매우 편리할 것 같습니다.

TreeView() 메소드를 사용하면 오브젝트 디버깅에도 유용합니다.




;-------------------------------------------------------------------------------

; 예제

#SingleInstance Force


oTest := [{a: 123}, {b: 456}, {c: 789}]

sJson := CJson.stringify(oTest)

MsgBox % sJson



F1::

CJson.save(oTest, "oTest.ini")

return


F2::

oTest := CJson.load("oTest.ini")

CJson.TreeView(oTest)

return


ESC::ExitApp


;-------------------------------------------------------------------------------



class CJson

{

load(file)

{

if (FileExist(file))

{

FileRead text, % file

return this.parse(text)

}

return {}

}

save(obj, file)

{

if (FileExist(file))

FileDelete % file

FileAppend % res := this.stringify(obj), % file

return res

}

parse(t, r="")

{

o := {}

if (r = "")

r := {p: 1}

while (r.p := RegExMatch(t, "`as)((?<=[^\\]))""(?P<k>.*?)(?1)""\s*:\s*"

. "(?:(?P<o>(?1)\{)|(?1)""(?P<v>.*?)(?1)"")|(?P<c>(?1)\})", _, r.p)+StrLen(_))

if (_c)

return o

else

o[this.unescape(_k)] := _o ? this.parse(t, r) : this.unescape(_v)

}

stringify(o, t="    ", x="", r="")

{

if (IsObject(o))

{

if (r = "")

r := {(&o): true}

s := "{"

for k, v in o

s .= c "`n" x t """" this.escape(k) """: " (r[&v] ? """[Object]""" : this.stringify(v, t, x t, r))

, c := (r.c ? (r.c := "") : ",")

return s "`n" x "}", r.c := true

}

else

return """" this.escape(o) """"

}

escape(v)

{

return RegExReplace(v, """|\{|\}", "\$0")

}

unescape(v)

{

return RegExReplace(v, "\\(""|\{|\})", "$1")

}

TreeView(Obj, hParent="", Option="Expand", r="")

{

if (r = "")

{

Gui +LastFound

hWnd := WinExist()

loop 99

Gui % (nDefaultGui := A_Index) ":+LastFoundExist"

until (WinExist() = hWnd)

loop 99

Gui % (nGui := A_Index) ":+LastFoundExist"

until (WinExist() = 0)

Gui % nGui ":Default"

Gui +ToolWindow +Resize +LabelCJson_TreeView

Gui Margin, -1, -1

Gui Add, TreeView, w400 r40 hWndhWnd

this.hTreeView[nGui] := hWnd

Gui Show, x0 y0

}

if (IsObject(Obj))

{

if (r = "")

r := {(&Obj): true}

for k, v in Obj

{

if (r[&v])

TV_Add("[Object]", hParent, Option)

else if (IsObject(v))

this.TreeView(v, TV_Add(k, hParent, Option), Option, r)

else

TV_Add(k " : " v, hParent, Option)

}

}

if (nDefaultGui)

Gui % nDefaultGui ":Default"

}

TreeViewSize()

{

Anchor(this.hTreeView[A_Gui], "wh")

}

TreeViewClose()

{

Gui % A_Gui ":Destroy"

this.hTreeView[A_Gui] := ""

}

}


CJson_TreeViewSize:

CJson.TreeViewSize()

return

CJson_TreeViewEscape:

CJson_TreeViewClose:

CJson.TreeViewClose()

return






/*

Function: Anchor

Defines how controls should be automatically positioned relative to the new dimensions of a window when resized.


Parameters:

cl - a control HWND, associated variable name or ClassNN to operate on

a - (optional) one or more of the anchors: 'x', 'y', 'w' (width) and 'h' (height),

optionally followed by a relative factor, e.g. "x h0.5"

r - (optional) true to redraw controls, recommended for GroupBox and Button types


Examples:

> "xy" ; bounds a control to the bottom-left edge of the window

> "w0.5" ; any change in the width of the window will resize the width of the control on a 2:1 ratio

> "h" ; similar to above but directrly proportional to height


Remarks:

To assume the current window size for the new bounds of a control (i.e. resetting) simply omit the second and third parameters.

However if the control had been created with DllCall() and has its own parent window,

the container AutoHotkey created GUI must be made default with the +LastFound option prior to the call.

For a complete example see anchor-example.ahk.


License:

- Version 4.60a <http://www.autohotkey.net/~polyethene/#anchor>

- Dedicated to the public domain <http://creativecommons.org/licenses/publicdomain/>

*/

Anchor(i, a = "", r = false) {

static c, cs = 12, cx = 255, cl = 0, g, gs = 8, gl = 0, gpi, gw, gh, z = 0, k = 0xffff

If z = 0

VarSetCapacity(g, gs * 99, 0), VarSetCapacity(c, cs * cx, 0), z := true

If (!WinExist("ahk_id" . i)) {

GuiControlGet, t, Hwnd, %i%

If ErrorLevel = 0

i := t

Else ControlGet, i, Hwnd, , %i%

}

VarSetCapacity(gi, 68, 0), DllCall("GetWindowInfo", "UInt", gp := DllCall("GetParent", "UInt", i), "UInt", &gi)

, giw := NumGet(gi, 28, "Int") - NumGet(gi, 20, "Int"), gih := NumGet(gi, 32, "Int") - NumGet(gi, 24, "Int")

If (gp != gpi) {

gpi := gp

Loop, %gl%

If (NumGet(g, cb := gs * (A_Index - 1)) == gp) {

gw := NumGet(g, cb + 4, "Short"), gh := NumGet(g, cb + 6, "Short"), gf := 1

Break

}

If (!gf)

NumPut(gp, g, gl), NumPut(gw := giw, g, gl + 4, "Short"), NumPut(gh := gih, g, gl + 6, "Short"), gl += gs

}

ControlGetPos, dx, dy, dw, dh, , ahk_id %i%

Loop, %cl%

If (NumGet(c, cb := cs * (A_Index - 1)) == i) {

If a =

{

cf = 1

Break

}

giw -= gw, gih -= gh, as := 1, dx := NumGet(c, cb + 4, "Short"), dy := NumGet(c, cb + 6, "Short")

, cw := dw, dw := NumGet(c, cb + 8, "Short"), ch := dh, dh := NumGet(c, cb + 10, "Short")

Loop, Parse, a, xywh

If A_Index > 1

av := SubStr(a, as, 1), as += 1 + StrLen(A_LoopField)

, d%av% += (InStr("yh", av) ? gih : giw) * (A_LoopField + 0 ? A_LoopField : 1)

DllCall("SetWindowPos", "UInt", i, "Int", 0, "Int", dx, "Int", dy

, "Int", InStr(a, "w") ? dw : cw, "Int", InStr(a, "h") ? dh : ch, "Int", 4)

If r != 0

DllCall("RedrawWindow", "UInt", i, "UInt", 0, "UInt", 0, "UInt", 0x0101) ; RDW_UPDATENOW | RDW_INVALIDATE

Return

}

If cf != 1

cb := cl, cl += cs

bx := NumGet(gi, 48), by := NumGet(gi, 16, "Int") - NumGet(gi, 8, "Int") - gih - NumGet(gi, 52)

If cf = 1

dw -= giw - gw, dh -= gih - gh

NumPut(i, c, cb), NumPut(dx - bx, c, cb + 4, "Short"), NumPut(dy - by, c, cb + 6, "Short")

, NumPut(dw, c, cb + 8, "Short"), NumPut(dh, c, cb + 10, "Short")

Return, true

}






List of Articles
분류 제목 글쓴이 최근변경 추천
정보 (안내) 글내용확인하시고 자삭하세요 27 snf 2015.02.23 0/0
정보 (펌)픽셀서치를 대체할 수 있는 비활성픽셀칼라 활용 ... 6 앙꼬호빵 2019.05.26 0/0
정보 adb 관련 비활성화 이미지 서치 쉽게하기 6 운하파는 2016.07.02 1/0
정보 adb를 이용한 연속 터치 및 키입력 TIP 7 하연데디 2019.03.05 1/0
정보 AHK_Helper.exe 오토핫키 도움말 프로그램 입니다. 2 월드걸스 2023.02.24 0/0
정보 Array 확장 13 모바게 2015.07.16 3/0
정보 Autohotkey에서 함수와 ByRef 사용에 대해... 12 류Macro 2015.07.12 1/0
정보 ControlSend 명령을 이용한, 카톡으로 알림받기 간단하... 10 죠케빈 2018.01.02 0/0
정보 DllCall "mouse_event" 속도조절하는 법 rkfdma 2016.12.08 0/0
정보 DynaScript - Child 프로세스로 코드 실행 13 예지력1 2019.07.16 3/0
정보 gdip 간단 응용 팁들 13 매크로맨서 2015.04.18 0/0
정보 gdip 비활성 이미지 서치, postmessage 모모 소스입니다. 6 사이다업 2021.01.23 1/0
정보 Gdip_all.ahk를 이용한 Bitmap의 size 변경 함수 6 할거엄따구 2022.12.14 1/0
정보 Gdip를 이용한 클립보드에 있는 이미지를 통한 이미지서치 11 암드래 2016.07.19 0/0
정보 GUI - 파일(폴더) 목록을 DropDownList로 만들기 14 모바게 2016.06.13 3/0
정보 Gui- dropdownlist 사용하기 기초내용 (모르시는 분만 ... 3 으뜸어린이 2017.09.07 1/0
정보 g라벨? v라벨? 설명좀해주세요 5 이리오리오 2016.10.25 0/0
정보 INI 를 쉽게 사용해봅시다. 11 모바게 2017.11.01 3/0
정보 ListBox로 로그창을 만들어보자! 고음l 2017.11.18 1/0
정보 List에 해당하는 GUI 팁 9 외치기 2015.08.24 2/0
Board Pagination Prev 1 23456 7 Next
/ 7

전체 최신 인기글

전체 주간 인기글