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

질문

클래스를 사용하는게 좋을지 조언 부탁드립니다.

    • 글자 크기

개인사용 및 공부목적으로 프로그램을 만들고 있지만, 개인적으로 피해갈 수 있는 에러들도 없애가며, 사용법을 몰라서 못쓸 수는 있어도 에러로 오작동이 하지는 않게끔 만들고 있습니다.

 

1. 그러다보니 예외처리가 익숙하지 않아서 어려움이 있고, if ~ MsgBox, 와 GuiControl, Enalbe / Disable 을 통해 행동을 제한하는 식으로 에러를 막았는데 이게 괜찮은 방식인지 의문이 생깁니다. (try~catch가 필수사항인지 궁금합니다.)

 

2. 추가로 개념을 조금 알아가다보니 클래스를 사용하면 좀 더 괜찮아질 것도 같은데 명확하지가 않아서 조언을 얻고 싶습니다. 프로그램 상황에 따라서 다른 코드에 include할 게 아니어도 클래스 사용으로 더 좋아지는 경우가 있는지 궁금합니다.

 

구동방식 :

 하단부 DDL 에는 행동에 관한 문자열이 있고, 어떤 행동은 x,y 값이 enable, 어떤 행동은 disable 되며

추가버튼을 누를때 마다 3열로 된 리스트뷰(행동, X값, Y값)에 선택한 값들이 추가됩니다.

 

**아마 리스트뷰를 원래 목적에 맞게 사용하는 것이 아닌것 같습니다. 저는 현재 리스트뷰에 DDL 스크립트를 추가할때마다 내용을 추가하고,

로드할때는, 전체 내용을 뿌려주고, 시작이후에는 진행될때마다, 진행도를 알려주는 형식(그 행동일때, Select)으로 사용중입니다.

 

 

매크로 저장방식

저장:
Gui, Submit, NoHide
if(텍스트이름 = null)
{
	MsgBox, 파일이름을 입력해 주세요.
	return
}
MsgBox, 4, 저장, 저장하면 수정이 불가능합니다. 저장하시겠습니까?`n(파일명이 같으면 기존 파일이 삭제됩니다.)
IfMsgBox, Yes
	MsgBox, 매크로 폴더에 저장되었습니다.`n수동으로도 삭제 가능합니다.
IfMsgBox, No
	return
FileDelete, %파일경로%%텍스트이름%.txt
a := 0
Loop, % LV_GetCount()
{
	a++
	Loop, % LV_GetCount("Col")
	{
		LV_GetText(Output, a, A_Index)
		FileAppend, %Output%`n, %파일경로%%텍스트이름%.txt
	}
}
GuiControl,, 텍스트이름,
LV_Delete()
return

단순하게 메모장에 리스트뷰에서 내용을 받아와서 한줄씩 엔터하면서 저장합니다. 이후에 한줄씩 읽어들입니다.

 

3. 이중루프에서 a변수 없이 첫번째 루프의 A_Index / 두번째 루프의 A_Index를 구분짓는 방법이 있을지 갑자기 궁금해졌습니다.

 

 

 

매크로 작동방식

동작()
{
	Sleep, 500
	반복횟수++
	GuiControl,, 반복횟수, %반복횟수% 회
	스크립트로드 := []
	LV_Modify(0, "-Select")
	Loop, Read, %매크로파일%
		스크립트로드.Insert(A_LoopReadLine)
	Loop, % 스크립트로드.Length()
	{
		if(Mod(A_Index,3) = 1)
		{	
			if(오류 = true)
			{
				LV_Modify(0, "Select")
				break
			}
			위치찾기()
			LV_Modify((A_Index+2)/3, "Select")
			행동(스크립트로드[A_Index], 스크립트로드[A_Index+1], 스크립트로드[A_Index+2])
		}
	}
	return
}

 

개선하고는 싶은데 더이상 자력으로는 이게 맞는지 아닌지 조차 감이 안오고 전반적인 내용없이는 말로는 설명할 자신이 없어서 두서없게 올려봅니다.

저장때 한줄씩 저장했기 때문에 한줄씩 불러와서 스크립트로드 배열에 저장하고, (1, 2, 3) (4, 5, 6) 등등 3개씩 세트로 묶여서 함수를 불러옵니다.

 

행동(문자열, X좌표, Y좌표)  가 결국 핵심 작동 부분이고, 이 부분에서 문자열에 대한 부분이 20개 정도 있습니다.

대부분은 단순한 마우스 클릭이고, x,y좌표까지 쓰이는 경우는 6개 입니다.

 

4. 매행동마다 현재 상태 메세지를 바꿔주는 부분도 있어서, 이 행동 부분을 우선해서 (행동변수, x좌표, y좌표, 현재상태메세지) 로

묶어주면 어떨까 고민하고 있습니다.

 

5. 생각해보면 GuiControl이 거의 모든 행동마다 사용되고 있는데 이게 맞는지도 모르겠네요.

 

6. Gui,에서 2:Gui, 3:Gui등 창을 여러개로 구성할 경우 아예 처음 다루는 경우에서 예외적으로 알아야 할 것 없이 기존에 알고 있는 지식으로

구성이 가능할지 알고 싶습니다.

 

 

**방개 커뮤니티 관련내용으로 글 하단부에 사진 및 파일첨부에서 실제로 파일첨부가 된 건지 모르겠는데 N개 첨부 됨. 이라고 나옵니다.

본문에 사진 추가 용도로 사용했는데 파일이 첨부된 것인지 궁금하고, 본문에서의 사진을 지웠는데도 하단부에는 남아있는데, 별도로 취소나,

삭제가 불가능한 것 같아서 문의드립니다.

    • 글자 크기
댓글 4
  • 2020.3.17 13:12 댓글

    1. try~catch가 없던 시절엔 모두 if를 통한 예외처리를 사용했고, 지금도 Exception명이 명확하지 않은 경우엔 if~else로 예외처리했습니다. if만으로 구성하셔도, 다른 방식을 쓰셔도 됩니다. 

     

    2. 네. 같은 기능을 담당하는 함수들을 Class로 묶어주시면 좋죠. 예를 들어서, 본인이 캡처 프로그램을 구상한다고 할 때, 아래와 같은 방식으로 Class를 구성하여 사용해주면 깔끔할것입니다.

    Class Capture
    {
        SetArea() ; 영역 지정을 담당하는 함수
        Capture() ; 저장된 영역을 캡처하는 함수
        Save() ; 캡처한 비트맵을 저장하는 함수
    }
    
    Class Edit
    {
        Draw() ;비트맵 위에 그림 그리는 함수
        Demetion() ; 비트맵의 크기 조절
    }

    용도(대분류)에 맞게 같은 기능을 하는 함수끼리 묶어주는게 좋을것입니다.

     

    3.없습니다. 지금처럼 별도의 인덱스변수를 사용하시면 됩니다.

     

    4. 정확히 이해가가 가지는 않지만, 함수 내에서 바뀌는 부분이라면 말씀하신대로 매개변수로 주시는게 맞겠지요.

     

    5. GUI의 내용을 바꾸는 데 GuiControl을 쓰는거죠 뭐. 용도에만 맞게 쓰시고 계시면 맞습니다.

     

    6. 기존 지식이 어떤지 모르니까요.. ^^ 아래 링크정도가 기존 지식이라면 거의 예외없이 맞습니다.

    https://pnal.kr/pages/multiple-gui

     

    **: "사진 및 파일 첨부"란에 각 사진에 체크박스가 있는데, 해당 체크박스에 체크 후 오른쪽 '삭제'를 눌러주심 됩니다.

  • 프날님께
    차랑글쓴이
    2020.3.17 14:26 댓글

    매번 감사합니다. 화이팅하겠습니다.

  • 차랑님께
    2020.3.17 18:01 댓글

    본문 사진 아까는 잘 보였는데 지금은 보이지 않네요. 혹시 본인이 삭제하신건가요?

  • 프날님께
    차랑글쓴이
    2020.3.17 22:23 댓글

    앗.. 넵. 댓글 확인해보고 확인차원에서 삭제해봤는데 삭제할때는 본문에 그대로 남아있었어서 그 후에 엑박으로 된지도 모르고 있었네요.

    글 올린후 사진들도 다 지웠어서..ㅠ 지우는 쪽으로 수정했습니다.

댓글 달기

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