방개
비밀번호를 잊어버리셨나요?

질문

콤보박스에서 예외처리 방법이 궁금합니다.

    • 글자 크기

1. 콤보박스에 여러항목이 있고, 그 외 항목을 입력했을 때, 에러메세지를 띄우고 싶습니다.

(질문을 드린 후에 DropDownList로 해결했는데 해당 질문의 답변도 알고 싶습니다.)

(제일 처음 Gui를 볼 때, 내용을 반대로 읽어서 무의식적으로 DropDownList가 수정이 가능한 걸로 알고 아예 배제하고 있었네요.)

 

 

2. 추가로 edit에 숫자만 입력해야 하는 경우에 어떤 식으로 처리하면 좋을지 알고 싶습니다.

 

 

질문이 많아서 죄송합니다. 쓰다보니 억지로 맞춰놓은 것들에 대한 해결법이 있을지 궁금해서 추가했습니다..ㅠ

 

함수1()

{

   Loop

   {

      함수2()

   }

}

 

함수2()

{

   Loop

   return

}

 

3. 이런식으로 돼있을 때, 함수2에서 리턴받고 함수1도 빠져나갈 수 있는 방법이 있는지 궁금합니다.

(현재 return 1로 받고 if문을 추가해서 // 탈출 := 함수2() // if(탈출 = 1)로 사용하고 있습니다.)

 

 

 

if ~ else if ~ return을 쓸 때,

함수()

{

   if(조건1)

   {

      항목1

      return

   }

   else if(조건2)

   {

      항목2

      return

   }

   ...

}

4. 이런식의 if문에서 가장 기본적인 방법으로 return을 위에처럼 쓰는것과 밖으로 빼주는 것중에 어떤것을 권장하는지 궁금합니다.

if이후에 한줄로 해결되는 경우 중괄호를 생략하고 가독성이 좋아지는 느낌은 받는데 권장하지 않는 방법인지 궁금합니다.

 

 

5. 이미지서치에서 이미지의 패턴은 있지만 색이 단조로울 때, 같은(비슷한) 색의 배경에서 혹시 구분할 수 있는 방법이 있을지 궁금합니다.

 

 

6. 코드가 길어질 때, 반복되는 내용이 아니어도 가독성을 위해 함수를 사용하는 것도 괜찮은지 궁금합니다.

 

 

7. Gui 설정 return 이후 서브루틴과 핫키설정, 함수가 너무 중구난방으로 된 느낌이라 하나의 가이드를 제시해 주셨으면 하는데

혹시 권장되는 방법이나 개인적으로 이렇게 하니 좋았다하는 방법이 있는지 알고 싶습니다.

 

 

8. 라디오버튼의 경우 +BackgroundTrans 옵션이 없어서 라디오버튼은 버튼만 있게 하고, 텍스트를 따로 추가해서 사용하거나,

Gui, Color, 를 억지로 넣어줘서 사용중인데, 라디오버튼에 배경을 변경하거나, Gui, Color를 범위를 지정해서 줄 수 있는 방법이

있는지 궁금합니다. 확인해보니 CheckBox는 +BackgroundTrans가 가능하고,

Gui, Color를 범위를 지정하는 방법 대신으로 Gui, Picture로 해보려 했는데 라디오버튼은 +BackgroundTrans가 안되니 결국 원점이었습니다.

    • 글자 크기
댓글 9
  • 2020.3.11 16:05 댓글

    이번 기회에 궁금하셨던 부분을 모두 알아가시는군요..ㅎㅎ
    저도 정확히는 모르는 사항들이 많으니 제 주관적인 의견을 섞어서 말씀드립니다.

     

    1. ComboBox의 모든 값을 읽어온 다음에, InStr() 명령어를 이용하여 현재 콤보박스에 입력한 값이 ComboBox의 목록에 있는지 확인하시면 될 것 같습니다. 단, 애초에 이런 UX 디자인은 대중적이지 않지요. 목록 중 하나를 입력하는 디자인이면 ListBox + edit나, DropDownList + Edit가 나을것입니다. ComboBox의 모든 내용을 가져오는 방법은 찾아봐야겠네요 ^^

     

    2.Edit에 숫자만 입력받으실려면 edit만드실때 Number 옵션을 주시면 됩니다.

    Gui, Add, Edit, x y w h Number vLabel,

     

    3. 함수 두 개를 동시에 return할수는 없고, 쓰시던대로 쓰시면 됩니다. 저는 근데 대입문 없이 바로 함수의 반환값이랑 비교하는 편이네요.

    if (함수2 = 1)
        return

     

    4. 구조적 프로그래밍의 관점에서, 한 서브루틴(혹은 함수)마다 한 개의 종료점을 가지는게 좋습니다. 즉, 저런 경우엔 그냥 return을 한번씩만 쓰시면 됩니다.

     

    5.if문 한 줄은 정답은 없습니다만, 보통 중괄호를 생략하는 편입니다. 코드를 읽는건 사람이고, 그 사람이 보기에 편한게 답이겠지요.

     

    6. 배경색을 이미지서치하면 됩니다. 패턴 부분은 특정한 색(예를들면 #FF0000 → 빨간색)으로 칠한 후, ImageSearch의 옵션에 trans옵션을 주면 해당 색상을 제외하고 찾게됩니다.

    ImageSearch, vx, vy, x1, y1, x2, y2, *TransRed, Image.png

     

    7. 네 함수 사용이 좋습니다. 기능적으로 분리해주는 것이기 때문입니다. 이를 구조적 프로그래밍에선 모듈화라고 하는데, 모든 기능을 함수로 구현한다음에 메인 진행부엠선 이 함수를 호출함으로서 마치 블록을 조립하듯이 코딩하는 방식입니다. 단, 하나의 함수는 하나의 기능만을 구현하고있어야겠지요. 함수가 너무 많다면 하나의 기능을 구성하는 함수끼리 Class로 묶어주어도 좋습니다.

     

    8. 정해진 답은 없지만 저는 가독성을 위해  Gui이후에

    GuiClose:
    ExitApp

    구문이 있을겁니다. 이 구문 밑엔 함수, 위엔 서브루틴과 핫키를 적어주는 편입니다.

  • 2020.3.11 16:07 댓글

    8번은 제가 지금 밖이라서 집에서 한번 해볼게요 ^^ 저도 해봐야해서요.

  • 프날님께
    차랑글쓴이
    2020.3.11 16:08 댓글

    감사합니다. 하나하나 정독해서 깔끔한 코드를 위해 정진하겠습니다!

  • 프날님께
    차랑글쓴이
    2020.3.11 16:25 댓글

    이미지 서치에서 이미 특징점 특화를 위해 중구난방인 배경속에서 특징점을 살려 나머지 부분을 검은색으로 칠한 후, transBlack옵션을 줘서, 특징점을 살렸고, 이 특징점을 살린 부분의 색깔이 예를 들어 하늘색계열이라, 하늘, 바다등의 배경에서 사용 못하는 경우에도 이를 극복할 수 있는 방법이 있을지 궁금합니다.

    특징점 이미지의 경우에 육안으로는 모두 같은 색처럼 보이지만 미묘하게 픽셀값마다 다른 값을 가지고 있는 60*60이미지에서 약 60개의 픽셀로 정보를 담고 있습니다.

     

    혹은 다른 프로그램에서 썼던 함수중에 getColorRGB 같이 R, G, B의 값을 따로 빼오는 기능이 있을지,

    ( SubStr으로 0x000000에서 R, G, B값을 빼올 수 있을지 궁금합니다.)

     

    아직은 이 기능을 빼와도 어떻게 적용할지 감은 안오지만 특징점의 Blue값이 모두 E4인 점을 이용해서 고민을 해보려고 합니다.

  • 차랑님께
    2020.3.11 16:38 댓글첨부 1

    도저히 오차값으로 해결 못하시면 머신러닝을 쓰셔야하는데 너무 간 것 같네요 그건.. ^^; 일반적인 프로그램에서 그렇게까지 이용할 일은 없으니까요.

     

    라디오 박스에 대해 테스트를 지금 해봤는데, 그냥 별도로 쓸 것 없이 배경색이 투명한데요? 혹시 어떤 걸 말씀하신건지..

     

    1.png

  • 프날님께
    차랑글쓴이
    2020.3.11 16:41 댓글

    Gui, Color를 사용할 경우 Gui 전체에 해당 색이 칠해져서, Gui, Color 대신에 Picture를 구간별로 지정해서 Gui를 구성했는데 이 때,

    라디오버튼만 배경이 안지워지는 현상을 겪었습니다. Gui, Color를 부분만 적용할 수 있어도 좋고,

    Picture로 불러온 부분에서 라디오박스의 배경이 지워져도 좋을 것 같습니다.

     

    아직 공부가 덜 된 부분인데, 그룹이나 섹션등으로 해결이 가능하면 연구해보겠습니다!

  • 차랑글쓴이
    2020.3.11 17:04 댓글첨부 1

    1.png

     

    다른 답변들을 읽는 중에 gui버튼에 내장된 서브루틴이 아니라 g라벨을 따로 설정하는걸 권장한다는 부분과

     

    서브루틴에는 중괄호를 사용하지 않는걸 권장한다는 부분을 알게 됐는데, 위와 같이 사용하면서 축소, 확대를 시키는 것도

     

    고치는게 좋을지 알고 싶습니다.ㅠㅠ

  • 차랑님께
    2020.3.11 18:17 댓글첨부 1

    글쎄요 그렇기 써본적은 없어서요.. ^^ 서브루틴을 자주 접는다면 필요할 수도 있겠네요.


    그리고 g레이블을 써주는걸 권장하는 이유는, 텍스트가 겹치는 경우가 생기기 때문입니다. 이거는 공식적인 권장사항이 아니라 제 주관입니다. (래퍼런스에서도 Button버튼텍스트:와 같은 구문을 사용합니다.)

     

    라디오박스에 대해 찾아보았는데요, 뚜렷한 해결책은 보이지 않네요.
    일단 Gui, Color의 매개변수 중에서 windowColor 부분은 특정 영역만 칠하긴 좀 그렇고요
    ControlColor로 변하지 않는 컨트롤과 같은 경우엔 아래와 같은 함수를 누가 만들어놓아서 이걸 사용하면 되긴 하네요.

    다만 근본적인 해결책은 아니겠지요.
     

    Gui, Add, Radio, x10 y10 w150 h15 hwndR, 123123
    Gui, show, w200 h50, 1
    CtlColorStatic(R, "0x00C896")
    return
    
    Guiclose:
    Exitapp
    
    CtlColorStatic(W, L := "", M := "")
    {
    	Static Controls := {}, Init := OnMessage(0x0138, "CtlColorStatic")
    	If DllCall("User32.dll\IsWindow", "Ptr", W, "UInt")
    	{
    		Controls.Remove(W, "")
    		If (L <> "") && ((B := ((L & 0xFF0000) >> 16) | (L & 0x00FF00) | ((L & 0x0000FF) << 16)) <> "")
    			Controls[W] := {B: B, T: M <> "" ? ((M & 0xFF0000) >> 16) | (M & 0x00FF00) | ((M & 0x0000FF) << 16) : ""}
    		Return DllCall("User32.dll\RedrawWindow", "Ptr", W, "Ptr", 0, "Ptr", 0, "UInt", 0x0405, "UInt")
    	}
    	If Controls.HasKey(L)
    	{
    		If (Controls[L].T <> "")
    			DllCall("Gdi32.dll\SetTextColor", "Ptr", W, "UInt", Controls[L].T)
    		DllCall("Gdi32.dll\SetBkColor", "Ptr", W, "UInt", Controls[L].B)
    		DllCall("Gdi32.dll\SetDCBrushColor", "Ptr", W, "UInt", Controls[L].B)
    		Return DllCall("Gdi32.dll\GetStockObject", "UInt", 18, "UPtr")
    	}
    }

     

    개인적으로 생각한 방법은, 아래와 같이 Gui뒤에 배경 사진과 똑같은 Gui를 만든 다음, 앞부분 Gui의 Radio배경색을 WinSet으로 투명화시켜주는 방법이 있네요.

    즉, 앞 GUI에는 라디오와 배경, 뒤 GUI에는 배경만 있는 겁니다. 그래서 앞 GUI에서 라디오 색상을 투명화시켜도, 뒤 GUI의 배경이 보여서 컨트롤만 투명화된 것처럼 보이는거지요.

    SetWinDelay, 0
    Gui, Add, picture, x0 y0 w200 h150, 1.png
    Gui, Add, Radio, x10 y10 w150 h20, 글자글자글자글자
    Gui, Back:+ToolWindow -Border -Caption
    Gui, Back:Add, picture, x0 y0 w200 h150, 1.png
    Gui, Back:Show, w200 h50, Back
    Gui, show, w200 h50, Front
    OnMove()
    WinSet, Transcolor, 0xf0f0f0, Front
    OnMessage(0x03, "onMove")
    OnMessage(0x06, "onActivate")
    return
    
    
    BackGuiClose:
    Guiclose:
    Exitapp
    
    onMove()
    {
    	SysGet, CaptionSize,4
    	SysGet, BorderSizeX,32
    	SysGet, BorderSizeY,33
    	
    	WinGetpos, x, y,,,Front
        WinMove, Back,, X+(BorderSizeX/2) - 1, Y + CaptionSize + (BorderSizeY / 2) - 1
    }
    
    onActivate()
    {
    	WinSet, Top,, Back
    	WinSet, Top,, Front
    }

    2.png

  • 프날님께
    차랑글쓴이
    2020.3.11 18:47 댓글

    감사합니다! 확인했습니다. 오토핫키가 편의성이 높은 프로그램은 맞는데 하나하나 막힐때마다 없는 기능을 해결하는게 벅차네요..ㅠㅠ

    (있는 기능 사용하기도 벅차네요..ㅠㅠ)

    알려주신 방법의 경우에 창이 2개가 겹쳐있는걸로 인식되다 보니 배경(?)부분을 클릭할 경우 창이 비활성되고, 라디오가 여러개 있을 경우,

    텍스트부분 클릭시 한번에 클릭이 안되는 경향이 있었습니다.

     

    Radio와 Text를 구분하지 않을 경우 Radio에 포함된 텍스트를 클릭해도 체크되는게 좋다고 생각했는데, 이 부분이 Text, g라벨로

    GuiControl,,v라디오,1 과 같은 식으로 가능해서(방금 알아보다가 확인가능했습니다), 라디오와 텍스트로 구분해서 쓰는 방법으로도

    원하는 기능이 가능한 것 같습니다.

    (본문에도 쓰긴 했는데 라디오에 15*15정도의 사이즈만 주고, 배경은 Picture로 받아오고,

    Text에 +BackgroundTrans를 하면 Gui,Color를 쓰지 않고 투명한 Text가 나왔습니다.)

     

    여러가지 방향성을 알려주셔서 감사합니다! 다음에 Gui, Back부분을 활용할 기회가 생기면 좋겠네요.ㅎㅎ

댓글 달기

서버에 요청 중입니다. 잠시만 기다려 주십시오...