'Study - Programming/Visual Basic'에 해당되는 글 3건

  1. 2007.10.17 VB 질문하는 법 2
  2. 2007.10.12 오랫만에 해보는 VB 4
  3. 2007.08.29 가변 인수 및 동적 배열 예제

DC 프갤에 올리기 위해 적어 본 글.

여기 올라오는 수많은 질문들의 대부분은 C이야기겠지만 가끔가다 VB도 보이더군. 특히 전과한 학생이거나 1학년 꼬꼬마들이 VB많이 묻더라.

  C같은건 그냥 소스 파일 대충 드래그해서 C & P 해주면 되겠지만, VB는 그렇게 했다가는 죽도 밥도 안된다. 소스파일만 달랑 보고서는 프로그램의 구조를 제대로 파악하기가 어렵기 때문이다. 여기 말고도 다른데 VB 관련 질문을 올리고 싶으면 이렇게 해라.

1. VB프로젝트의 구조.
  아시다시피 VB는 RAD툴이다. 이놈이 뭐하는 놈인지는 다 알겠지? 일단 VB프로젝트를(표준 EXE 기준) 하나 만들면 기본적으로 두 개의 파일이 생성된다. vbp라는 확장자를 가진 프로젝트 파일과 frm이라는 파일을 가진 폼 파일.

2. 각 파일의 용도 및 구조.
  프로젝트는 뭐하는 놈인지 알거다. 중요한 것은 frm파일이다. C의 소스 파일 확장자명이 .c라면 VB에서는 폼 파일 소스코드의 확장자명이 .frm이라는 것.
  그런데 이놈의 구조는 C와는 조금 다르다. 폼이라는 놈이 달랑 작성자가 입력한 코드만 가지고 있는게 아니라 폼에 추가된 컨트롤이나 기타 요소들의 프로퍼티들이 다 저장되어 있어서 눈에 보이는 것보다 훨씬 많은 정보들을 담고 있다.

사용자 삽입 이미지

  첫 번째 그림을 보자. 그림을 보면 위에는 폼 파일이고 밑에는 소스 코드이다. 별거 없다. 그런데 frm파일은 저기 코드만 가지고 있는게 아니라 훨씬 많이 가지고 있다. 한번 frm파일을 찾아서 한글같은 워드프로세서로 열어보자.

사용자 삽입 이미지

  글씨가 작아서 잘 안보이겠지만 맨 밑을 보면 우리가 친 소스코드가 보이지만 그 위에 많은 코드들이 더 있다. 내용을 보면 폼에 관한 정보들이다. 저게 바로 소스코드의 원문이다.

3. 무엇이 문제인가?
  문제는 냅다 폼 아무데나 더블클릭해서 전부 복사해서 붙여 넣는다는거다. VB는 컨트롤 이벤트를 중심으로 코드가 돌아가기 때문에 폼에 관한 정보 없이 그런 코드만 보면 알아보기가 정말 어렵다. 예를 들어
Private Sub cmdStart_Click()
txtShow.Text = "Hello,World!"
End Sub
  이렇게 해놨다고 치자. 저렇게 해놓으면 cmdStart가 커맨드 버튼인지 텍스트 박스인지 알리가 없고 txtShow가 레이블인지 버튼인지 폼인지 알리가 없다. 그나마 내가 이름 txt나 cmd로 해놔서 알 수 있는거지.
  그리고 당장 폼이 어떻게 생겼는지도 모르고 몇 개의 컨트롤이 필요한지 어디다 해야 그려 넣어야 하는지도 모르기 때문에 답변하기가 상당히 곤란하다.

4. 그럼 어떻게 해야 하는가?
  폼의 스크린샷 가지고는 부족하다. 컨트롤의 이름 등을 제대로 파악하기 어려우니까.
  읽는 사람 입장에서 가장 편한 방법은 프로젝트를 압축해서 올리는 거지만 너무 성의가 없다. 최소한 컨트롤의 스펙 정도는 알려 주자. 그리고 올리더라도 frm파일을 올려주면 보기 정말 편하다. 그렇다고 frm파일 원문을 통째로 C & P하면 아예 답변 받을 생각 하지 말기 바란다.
  그리고, 프로그래밍을 할때 제발 컨트롤이름도 신경써서 해 주자. 변수이름은 신경쓰면서 컨트롤 이름은 왜 죄다 form1, command1. text1, 이런건데? txtShow,cmdStart,cmbView 이런거면 얼마나 보기 좋아.
 

이상이다. 그냥 공강시간에 시간이 좀 많이 남아서 써봤다. 제일 좋은 방법은 혼자 해결하고 이런데 질문 올리지 않는 것이지만, 혹시라도 DC아닌 다른데 질문하게 되면 이정도는 최소한으로 지켜 주자.
Posted by 머리

인터넷 돌아다니는데 누가 VB관련 질문을 했길래 그냥 심심해서 1분만에 짜 본거 대충 문자열 자르는 거 구현하는 것이다.

진짜 VB오랫만에 하는구나.. 맨날 C만 하다가 VB하니 어색하다.. 왠지 씁쓸. 훨씬 VB를 오래 했는데..

다음은 소스.

Option Explicit


Sub main()
Dim b_input As String
Dim arry(10) As Integer
Dim cnt As Integer
Dim i As Integer


cnt = 0
b_input = InputBox("입력해봐", "입력")

If b_input <> "" Then
    For i = 1 To Len(b_input)
        If "," <> Mid(b_input, i, 1) Then
            arry(cnt) = Val(Mid(b_input, i, 1))
            cnt = cnt + 1
        End If
    Next i
Else
    MsgBox "제대로 입력해"
End If

For i = 0 To cnt - 1
    Debug.Print "arry(" & i & ") = " & arry(i)
Next i
End Sub

이거 쓰면서 자꾸만 C하던 습관이 나와서 고생했다.
예를 들어
if a = 1 then 이렇게 해야하는걸 if(a==1){}하려 했다건가
for i = 1 to 10 하려는걸 for(i = 1 ; i <= 10 ; i++)하려 하던가
끝에 세미콜론(;)을 붙이려 하려 했다던가..


웃긴건 C를 할때는 역으로 된 상황을 자주 겪는다.

그리고 또 하나 신기한거. VC++의 코드를 그대로 복사해서 딴데 붙여 넣으면 들여쓰기가 제대로 안되어서 나오는데 VB는 제대로 되는구나. 편하다.

Posted by 머리

커맨드 버튼 하나만 만들어 놓고 붙여넣기


나머지는 알아서 주석으로 해결~~


Option Explicit
'가변 인수 테스트
'Inputbox로 수를 입력받아 그 합을 구한다.


'UBound 함수 : 배열의 마지막 번호를 넘긴다
'LBound 함수 : 배열의 첫 번호를 넘긴다.
'ex : Dim exam(2 to 4) as Integer
'Debug.print LBound(exam) 결과 : 2
'Debug.print UBound(exam) 결과 : 4

Public Function Sum(ParamArray vArgs())

    Dim i As Integer '루프 변수
    Sum = 0
   
    For i = LBound(vArgs) To UBound(vArgs) '합계 구하는 루프
   
        Sum = Sum + vArgs(i)
   
    Next i
   
End Function

Private Sub Command1_Click()
Dim Args() As Integer '인자 배열
Dim InputNumber As Integer '입력 변수
Dim Count As Integer '첫 입력인지 확인
Dim i As Integer '출력값

Count = 0



Rem 입력 받는 루프, 0이 나올때까지 루프

Do
    InputNumber = Val(InputBox("수를 입력해 주세요(0 : 입력 종료)", "입력")) '입력 받는다
   
    If InputNumber <> 0 Then '입력 받은게 0이 아니라면 배열에 수를 넣는다.
       
        If Count = 0 Then '제일 처음 입력하는 것이면
            ReDim Args(1) As Integer '일단 배열 한개 만들고
            Args(0) = InputNumber '0번째 배열에 첫 수를 넣는다.
            Count = Count + 1 '카운트 추가 -> 사실 이거는 bool형으로 해서 처음이냐 아니냐만 체크해도 되는데.. 일단 이걸로 수도 셀수 있고 하니 놔둠.
       
        Else '처음 입력이 아니면
       
            ReDim Preserve Args(UBound(Args) + 1) As Integer '데이터를 보존하면서 배열 크기 재선언
            Args(UBound(Args) - 1) = InputNumber 'VB의 배열 틍징 -> 배열 크기를 1로 하면 공간이 2개 생긴다 -_-;; -> 그래서 마지막 번호 앞의 거에다가 입력 값을 넣는다
        End If
   
    End If
   
Loop While InputNumber <> 0 '0이 입력안되는동안 계속 루프

If Count <> 0 Then
    ReDim Preserve Args(UBound(Args) - 1) As Integer '이거 지우고 한번 debug.print로 배열 첨부터 끝까지 루프 돌려보면 안다,(UBound,LBound 참조) 맨 마지막에 배열 요소 하나가 남기 때문에 공간 하나를 없앤다.
End If

'출력
For i = LBound(Args) To UBound(Args)
    Debug.Print "Args(" & i & ") : " & Args(i)
Next i

'가변 인수 테스트
Debug.Print
Debug.Print Sum(1, 2, 3, 4, 5)
End Sub

Posted by 머리