728x90

예전 카페에서 폐지 공지가 와서 자료를 옮겨 놓습니다.


 

이 자료의 출처는 http://www.vb.co.kr/입니다.

//==========================================================================
우리는 우선 디비에 관련된 용어를 배워야 합니다.

비쥬얼베이직에서는 프로그래머가 데이터베이스를 파일 수준에서 다루지 않구요! 좀더
편하게 프로그래밍할수있도록 몇가지 개체를 제공하고있는데.. 이는 우리가 흔히 듣는
DAO(DATA ACCESS OBJECT), RDO(REMOTE DATA OBJECT), ADO(ACTIVEX DATA OBJECT)
등이 있습니다.
DAO는 마이크로소프트 사의 엑세스 1.0버전에서부터 출발하게 된는데요!
엑세스가 발표되었을 때 PC에서 관계형 데이터베이스(RDBMS)를 지원하는 데이터베이스
엔진은 거의 전무한 상태였고, 그때 엑세스는 관계형디비를 지원할수 있게 되었습니다.
젯 데이터베이스 엔지 이었던 것입니다. 여러분도 젯데이터베이스 엔진에 대해서
조금은 알고있을것입니다. 그러나 DAO는 로컬시스템에서만 돌아 간다는 문제점을 가지고
있었습니다. 그리고 마이크로소프트사는 이럴 보강하여 서버와 클라이언트를 연결시키기
위해서 RDO를 만들게 되었고 이후에는 ADO로 계량되었습니다.
그러나 저는 ADO를 가지고 설명하겠습니다. 지금 추세가 그러하니깐요

ADO의 개요
ADO는 기존의 DAO나 RDO와는 달리 개체간의 관계는 계층적인 구조를 가지고 있습니다.
또한 전체적으로는 간단하게 되어있구요!
ADO의 각 개체에 대해서 간단하게 설명하겠습니다.
COMMAND
Connection
|_ command
  |_ parameters
질의 문자열, 매개변수 정의 등의 명령에 대한 정보를 가지고 특정 명령문을 수행하기
위한 개체입니다.

Connection
|_ errors
|_ command
|_ recordset
데이터 원본에 대하여 열려 있는 연결을 나타냅니다.
자 여기까지만 알아도 사용하는데는 문제가 없습니다.
그리고 지금부터는 ADODC OCX에서 관해서 설명하겠습니다. ADODC OCX은 구성요소에서
찾으시면 됩니다.
체크된 내용이 우리가 사용할 ADODC OCX입니다. ADO디비를 연결할려면 필요하죠!
자 체크를 하시고 확인버턴을 누르면 툴바에 올라오게 되죠!
그럼 이젠 ADODC OCX에 관련된 속성을 정의해 보고자 합니다.
Provider – 사용자가 선택할수 있는 데이터베이스를 결정하게 되며, 기본적으로
MSDASQL 데이터제공자가 선택되어 있으므로 컴퓨터상의 아무 DSN 이라도 선택할수
있습니다. 그런데 DSN이 무엇인냐고요? 뒷편에 가면 설명하게 되어집니다.
또한 데이터 제공자는 ConnectionString 속성에 인수로 지정될수 있습니다.
이렇게 provider가 양쪽 모두에 지정되어 있다면 connectionString에 지정된 Provider는
Provider속성에 지정된 데이터 제공자를 무시하게 됩니다.

ConnectionString – 이 속성은 연결되는 데 필요한 모든 문자열을 포함할수있습니다.
이 문자열에 전달되는 매개변수는 해당 드라이버에 따라 달라지게 됩니다. 예를 들어서
ODBC드라이버를 사용할 때 이 문자열에 드라이버,데이터 제공자, 기본 데이터베이스,
서버,사용자 이름,그리고 암호를 포함하게 됩니다.

Username – 사용자 이름, 필요에 따라 데이터베이스는 암호를 보호하게 되는데
Provider속성처럼 이속성은 connectionString속성에 전달되는 매개 변수로서 지정될수있습니다. ConnectionString과 Username 속성값을 무시하게 됩니다.

Password – 데이터베이스를 보호하기위한것으로 provider나 username처럼 속성값이
ConnectionString에 지정되어 있으며 이 속성의 값이 무시되어집니다.

Source – 이 속성은 일반적으로 데이터베이스에서 검색할 사항을 결정하는 문을 포함
하게됩니다.

CommandType – 이 속성은 source속성이 sq문, 테이블이름, 저장된 프로시저, 또는 알수
없는 형식일 때 데이터 제공자를 지정하는 역할을 하게됩니다.

Cursorlocation – 이 속성은 클라이언트나 서버상에 커서의 위치를 지정하는데..
이 결정의 결과는 사용자가 이후에 설정하는 몇몇 속성에 영향을 미치게 됩니다.

LockType – 이 속성은 편집하고 있는 데이터를 다른 사람들이 변경하려고 할 때 데이터
를 잠그는 방법을 결정하게 합니다.

Mode – 이 속성은 레코드집합의 용도를 결정하게 되는데요! 예를 들어서 보고서 작성에만 관심이 있다면 이 속성을 읽기 전용으로 설정하면 성능을 향상시킬수있습니다.

MaxRecords – 이 속성은 커서의 크기를 결정하게되며 커서의 크기 결정은 검색하려는
레코드의 크기와 컴퓨터에서 사용할수 있는 메모리 리소스에 따라 달라지게 됩니다.
열의 개수가 많고 큰 문자열을 갖고 있는 큰레코드는 작은 레코드보다 더 많은 리소스
를 필요로 하므로 MaxRecords 속성은 필요 이상으로 크지게 되겠죠!

ConnectionTimeout – 디비를 연결할 때 기다리는 시간을 초단위로 이 속성에 지정하게
됩니다. 연결시간이 초과되면 오류가 반환되겠죠!

BOF ACTION / EOF ACTION – 이 두속성은 컨트롤이 커서의 시작 부분이나 끝에 있을 때
다음 작동을 결정하게 됩니다. 시작 부분이나 끝부분에 있거나 첫번째 레코드나 마지막
레코드로 이동하거나 또는 커서가 끝 부분에 있을 때 새 레코드를 추가할수있겠죠!

자 여기까지 우리는 ADODC OCX의 속성을 알아보았습니다. 힘드시다구요!
이것을 모두이용하는 것은 아닙니다. 그러나 어떤 의미인지는 알아두십시오.
까먹어도 좋습니다. 다음에 언급할 때 아 그런 것이 있었지? 하고 떠올리시면 됩니다.



자 위에서 언급한 DSN이란 용어가 있죠! 이것이 무었일까 하는 분들이 있을수
있겠내요? 그럼 설명드리겠습니다.

우선 ODBC(OPEN DATABASE CONNECTIVITY) 에 대해서 설명하겠습니다.
원도우즈 제어판에 보시면 ODBC라는 아이콘이 있습니다. 그러나 이것으로 무엇하는지 아는분은 별로 없습니다. 한마디로 모르면 무용지물이지요..
DBMS들이 클라이언트/서버 컴퓨터 애플리케이션의 출현으로 더욱 발전하고 더 많이 보급됨에 따라서 DMBS공급자들은 에플리케이션 실행시 SQL문을 수행할수 있는 API를 만들었습니다. 그러나 이러한 방법은 너무나 힘들고 호환성의 문제로 사용을 깊이하는 경향이 있었습니다.
그래서 마이크로소프트사가 ODBC드라이브를 제공하게 되었고 DBMS API에 대한 새로운 접근방법을 제시하게 되었습니다. 한마디로 ODBC는 사실상 데이터베이스의 표준 프로토콜이
된것이죠!

ODBC의 구조를 알아보겠습니다.

           어플리케이션
                |
          드라이버 메니져
                |
            드라이버
                |
             DBMS --- 데이터베이스

드라이버 메니져는 ODBC설치 광정의 한 부분으로서 마이크로소프트사에 의해서 DLL형식으로 제공되어집니다.
드라이버 메니져가 하는역활은 ODBC드라이버 로드 / 언로드 시키는 역활을 하게됩니다.

드라이버 - ODBC드라이버는 데이터 소스에 관련된 역활들 중 대부분을 수행하게 되며,
드라이버는 ODBC함수 호출을 구현하고 데이터 소스와 상화작용하게 되는 DLL파일 입니다.
그렇다면 비베에서는 디비와 연동하기위한 2가지 방법을 택하고 있습니다. DSN파일을 생성해서 ODBC드라이버와 함께 데이터 소스와 연동하는 방법이고 다른하나는 다이렉터로 데이터소스와 디비 연동하게 하는방법이 있습니다. 분명히 후자가 더욱 빠르게 디비와 접속이
되겠죠!
데이터 소스 생성 및 구성에 관해서 알아보죠!
제어판에 있는 ODBC드라이버 아이콘을 클릭하세요!

그럼 사용자DSN ,시스템DSN,파일DSN,드라이버,추적,연결풀링,정보라는 서브메뉴가 있을
것입니다.
사용자DSN 은 로컬시스템에 있는 디비와 연동되며 원거리(클라이언트)에서는 이용이 불가능
합니다. 이 데이터는 사용자만이 열람가능합니다.
시스템DSN 은 클라이언트 컴퓨터에서 디비와 연동할수 있도록 해주는 데이터소스 생성 파일이며.. 시스템 DSN은 서브/클라이언트 컴퓨터에서 디비와 연동할수 있도록 해주는 데이터
소스 생성 파일입니다.
파일DSN 은 생성된 데이터 소스 생성파일을 로딩시키는 부분입니다.
드라이버는 각종 디비관련 드라이버를 설정할수있는 부분입니다.
자 이정도면 충분히 용어는 알수있었것입니다. 다른 용어도 많이 있지만 가장많이 사용된
것만 간추려서 설명하였습니다.
백문이 불여일견이라 여러분께 한가지 문제를 내드리고 싶습니다.
LOGOIN 프로그램을 하나만들어 보세요!
제약조건은 ADO디비와 연동을 해야합니다. DSN파일을 이요하지 않고 Connection을 이용해
다이렉트로 연결하십시오..
뒷편에 제가 만든 프로그램을 통해서 설명하도록 하겠습니다.
자 나머지 부분은 소스에 주석을 달아서 설명하겠습니다.
오늘은 첫날이라서 준비가 조금 부족합니다. 그러나 소스파일을 보시면..
상용프로그램 만드는데 도움되실 간단한 팁들이 있고 주석을 달아서 설명하겠습니다.
자 여러분 이젠 소스의 내용을 보시면 이해가 더욱쉽게 될것입니다.
오늘이 첫날이라서 특별히 준비를 못했구요! 팁은 다음 강의때 가르쳐 드릴께요!
여러분이 코드를 변경해서 더 괜찮은 것으로 만들어 보세요!
절대 덩치가 작고 보잘 것 없다고 대충 코딩하면 안됩니다. 아주작은 프로그램이라도
여러 번 코딩도 바꿔보고 로직도 바꿔보면서 해야 실력이 배로 넑게 됩니다.

//=========================================================================

[DB]MSSQL연동하기 
ADO사용시 입니다.

dim connDB as ADODB.connection
dim rsttest as ADODB.recordset
set connDB = new ADODB.connection

connDB.open "Driver={SQL Server}; Server=server이름 ;UID=사용자아이디;PWD=비밀번호;Database=SQL 서버의 DB이름"

set rsttest = new ADODB.recordset

rsttest.open 'SQL문',connDB


//=========================================================================

우선 access2000 mdb 파일을 비베와 연동시키는 기본적인 함수인데.. 초보자님들이 힘들어 하시길래.. 몇글자 적어보았습니다.
이는 ado디비 연결 방법입니다.

Dim Cn As ADODB.Connection '디비 접속 변수
Dim rs As ADODB.Recordset '레코드셋 변수
Dim cnStr As String 'provide변수
'/.. 여기까지는 디비를 연결시키기 위한 변수로 일반에서 정의 합니다.


'/. 여기서부터는 form_load() 부분에 작성합니다.
dim ss as string '디비파일명 변수
cnStr = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source="
' 여기는 저번에 말한 디비드라이버 공급자와 디비 위치를 정의 하는 곳입니다.
ss= app.path & "\data\dtata.mdb"
' 여기는 디비파일명..
Set Cn = New ADODB.Connection
Cn.ConnectionString = cnStr & ss
' 여기서는  Provider와 드라이브명과 디비파일 경로를 합치는 곳입니다. 물론 cnstr="" 이쪽 구분에 모두 작성할수있겠으나
' 이는 폼이 어디에 있던 찾을수있게 하기위해서 입니다.
Cn.Open '위의 내용을 가지고 디비를 연결합니다.
//======================================================================

내용 : 원도우 실행시 자동으로 프로그램 실행할수있는 방법 구현(레지스트 이용)

물론 시작프로그램에 자신의 프로그램을 등록해서 실행하면 된다고 하시는 분이 있을
것이라고 생각되어진데..
이는 현명한 생각은 아닙니다.

우선 최초에 실행되어지는 프로그램은 레지스트 의 어느부분에 저장되어지는가 ?
원도우 레지스트 의
HKEY_LOCAL_MACHINE\software\microsoft\windows\currenversion\run 에 저장되어 진
다.
자! 한번 시작버턴을 누른다음 열기에서 regedit.exe 실행해 보자 그러면 레지스트
리 편집기가 화면에 나올것이고
위의 순서대로 찾아가보자 그러면 당신의 컴퓨터에 전원이 들어와서 원도우가 실행되
면 자동으로 실행되는 프로그램들의
목록을 볼수 있을것이다. 예를 들어서 원앰프 등이 있을수 있는데.. 원앰프를 설치하
면 테스크바 오른쪽에
번개모양의 원앰프를 실행할수 있는 트라이 아이콘이 나오는데.. 이는 원도우가 실행
되면서 자동으로 등록되어진 것이다.
위의 레지스트 경로에가면 이름은:원앰프에이젼트
값은: 원앰프 디렉토리와 실행될 파일명이 나올것입니다.

우리도 이렇게 비베를 통해서 위의 레지스트 경로에 자신이 만든 프로그램 이름과 실
행파일 그리고 경로를 입력해 보자!
--> 첫번째 비쥬얼베이직을 실행한다.
--> 그런다음 모듈을 하나 생성하라!
--> 모듈부분에 아래의 내용을 복사하라.

[선언부분]
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal
hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal
samDesired As Long, phkResult As Long) As Long
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA"
(ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long,
lpType As Long, lpData As Any, lpcbData As Long) As Long
Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA"
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal
lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long,
lpSecurityAttributes As Long, phkResult As Long, lpdwDisposition As Long) As
Long
Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal
hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass
As String, ByVal dwOptions As Long, ByVal samDesired As Long,
lpSecurityAttributes As Long, phkResult As Long, lpdwDisposition As Long) As
Long
Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal
hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType
As Long, lpData As Byte, ByVal cbData As Long) As Long
Declare Function RegSetValueExString Lib "advapi32.dll" Alias "RegSetValueExA"
(ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal
dwType As Long, ByVal lpValue As String, ByVal cbData As Long) As Long
Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA"
(ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal
dwType As Long, lpValue As Long, ByVal cbData As Long) As Long
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_CONFIG = &H80000005
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_DYN_DATA = &H80000006
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_PERFORMANCE_DATA = &H80000004
Public Const HKEY_USERS = &H80000003
Public Const ERROR_SUCCESS = 0&
Const REG_OPTION_NON_VOLATILE = &O0
Const KEY_ALL_CLASSES As Long = &HF0063
Const KEY_ALL_ACCESS = &H3F
Const REG_SZ As Long = 1
Public Const KeyName$ = "Software\microsoft\windows\currentversion"

--> 우선 여기까지는 레지스트를 관리할수 API 선언 부분이다.
--> 그리고 KEYname$ 변수는 레지스트의 경로 부분이다. 그러나 run까지 모두 keyname
변수에 적으면 안된다.
그것은 아래에 가서 설명할것입니다.


[ INSTALLING 라는 서브모듈 을 생성한다. ]
--> 물론 폼에서도 생성할수 있으나 복잡한 코딩을 줄이기 위해 모듈에다 모두 선언하
는 것이 좋을것 같습니다.

Public Sub Installing()
Dim SName$, KName$, vinstelling$
SName = "run"
KName = "프리멜리2000"
vinstelling = App.Path & "\" & App.EXEName '실행디렉토리명과 실행파일명
Dim hNewKey As Long
Dim lRetVal As Long
lRetVal = RegCreateKeyEx(&H80000002, KeyName & "\" & SName$, 0&,
vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0&, hNewKey, lRetVal)
lRetVal = SetValueEx(hNewKey, KName$, REG_SZ, vinstelling$)
RegCloseKey (hNewKey)
End Sub
--> 자 여기서 보면 sname,kname,vinstelling의 변수가 있을것입니다. 그런데 옆에$
가 붙혀있죠
이것은 스트링으로 주는방법입니다. 모르시는 분보다 아는 분이 많의 시겠지만..
초보자를 대상으로 강좌를 하기위해..
그러면 실질적으로 코딩하려며 dim sname as string 이 되겠죠..
sname은 선언부분에 정의되어진 keyname 값의 뒤에 오게 되어집니다. 모두 조합하
면 처음에 말한 레지스트 경로가 되겠죠!
그리고 kname의 변수는 자신이 만드신 프로그램의 이름을 주는 것입니다. 예를 들
어서 자신이 만든 프로그램의 이름을
프리멜리2000이라고 준다면 위와같이 하면 됩니다. 그리고 변경해도 무방하죠! 이
것은 레지스트의 이름 으로 들어가게
되어있습니다.(section) 그리고,
vinstelling 변수는 뒤에 들어갈 실행파일과 경로를 나타내주는 변수 입니다.
(value) 그러면 등록하기위해
레지스트등록 API함수명인 regcreatekeyex를 실행하면 되죠!


Public Function SetValueEx(ByVal hKey As Long, sValueName As String, lType As Long, vValue As Variant) As Long
SetValueEx = RegSetValueExString(hKey, sValueName, 0&, lType, vValue, Len(vValue))
End Function
--> 자 우선 여기까지 프로그래밍한 후에 프로그램을 실행해 보세요..
아참 실행하기전에 exe파일 생성해야 합니다. 그리고 생성되어진 exe파일을 가지
고 실행해야 결과가 나오겠죠..
실행을 하셨다구요. 그러면
레지스트에디트를 실행하고 위에 정의된 경로에 가보세요.. 그러면 이름은 프리멜리2000
값은 경로와 실행파일명을 볼수있을것입니다.

그리고 완전히 확이하기㎸漫?다시 전원을 내린후 다시 원도우를 실행하거나 로그오프를 해보세요..
원도우가 실행되면 자신이 만든 프로그램이 자동 실행되는 것을 볼수있을것입니다.
그런데.. 자신의 프로그램을 원도우실행시 자동으로 실행하기 싫다면 어떻게 해야되나요? 라고 질문하시는 분이 있을것입니다.
그렇다면 아래의 주석을 통해 한번 해보세요..

Public Sub re_Installing()
Dim SName$, KName$, vinstelling$
SName = "run"
KName = "프리멜리2000"
vinstelling = ""
Dim hNewKey As Long
Dim lRetVal As Long
lRetVal = RegCreateKeyEx(&H80000002, KeyName & "\" & SName$, 0&,
vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0&, hNewKey, lRetVal)
lRetVal = SetValueEx(hNewKey, KName$, REG_SZ, vinstelling$)
RegCloseKey (hNewKey)
End Sub
-->다음은 서브함수 installing을 지우고 바로위에 정의되어진 re_installing 을 복사
한후 다시 exe파일을 생성하고
그런다음 로그오프나 원도우를 재실행해 보시면 자신이 만든 프로그램이 원도우 시
작시 자동실행 안돼는 것을 볼수있습니다.
실행파일을 실행한후 다시 레지스트에디트를 실행해 보면 이름만 프리멜리2000으
로 되어있고 실행파일과 경로는 "" 이렇게
되어있죠 즉 색션은 있는데 값이 없는것이죠!
레지스트가 실행되기 위해서는 색션과 값이 모두 있어야 인식해서 실행되어지는 것
을 알수있습니다.
물론 이런기법은 여러 계시판에 찾아봐도 없길래 한번 만들어 본것입니다.
구현되어진 프로그램이 있다면 분명히 소스가 있을것인데.. 서로의 정보를 공유하
기 싫어 하는 사람이 많은가 봅니다.
그러면 실력이 늘지 않는데.. 말이죠!
다음 강좌는 계속해서 올리도록 하겠습니다. 감사!!
//=====================================================================

내용 - 한글/영문 상태 알아보는 간단한 팁을 소개 합니다.
강좌 하는사람 : 부락다 ( 지동길 ) 대구공업대 컴퓨터 정보과 2학년 재학중..
활용방안 : 저는 이곳에 사용하고있습니다. 디비 프로그램을 만들었는데.. text박스
에 글을 적으려고 하면.. 한글인지 영문인지 상태를
항상 테스크바 오른쪽 아래에 있는 한영 상태를 봐야 하는 불편함을 조금
이나마 편리하게 하고자 합니다.

<-- 모듈에 아래와 같이 코딩합니다.
<-- 간단히 설명하고자 하면... declare function은 외부의 dll파일에서 어떠한 기능
을 불러와서 사용하겠다는 의미입니다.
<-- 즉, imm32.dll에 있는 기능중에서 immgetcontext 와 아래의 2개 기능을 불러와서
사용하겠다고 정의하는 것이죠!
<-- 이는 한글인 영문상태를 현재의 원도우에 보여주겠다는 의미(폼에..)가 되겠죠

Declare Function ImmGetContext Lib "imm32.dll" (ByVal hwnd As Long) As Long
Declare Function ImmGetConversionStatus Lib "imm32.dll" (ByVal himc As Long,
lpdw As Long, lpdw2 As Long) As Long
Declare Function ImmSetConversionStatus Lib "imm32.dll" (ByVal himc As Long,
ByVal dw1 As Long, ByVal dw2 As Long) As Long

<-- 한글 입력창입니다.
<-- 간단히 설명하자면 이렇습니다. dwcibversion과 &h1은 한글을 의미합니다.(한글
입력시)
Public Sub HanOn(hwnd As Long)
Dim himc As Long
Dim dwConversion As Long, dwSentence As Long
Dim rc As Long
himc = ImmGetContext(hwnd)
rc = ImmGetConversionStatus(himc, dwConversion, dwSentence)
If rc <> 0 Then
If dwConversion And &H1 <> &H1 Then
dwConversion = dwConversion Or &H1
rc = ImmSetConversionStatus(himc, dwConversion, dwSentence)
End If
End If
End Sub

<-- 영문 입력창입니다.
Public Sub HanOff(hwnd As Long)
Dim himc As Long
Dim dwConversion As Long, dwSentence As Long
Dim rc As Long
himc = ImmGetContext(hwnd)
rc = ImmGetConversionStatus(himc, dwConversion, dwSentence)
If rc <> 0 Then
If dwConversion And &H1 = &H1 Then
dwConversion = dwConversion And &HFFFE
rc = ImmSetConversionStatus(himc, dwConversion, dwSentence)
End If
End If
End Sub

<-- 위의 내용을 모두 모듈에 작성 하셨다구요.. 우와 대단하신데요.. 그럼 [사용방
법]에 대해서 설명하겠습니다.
<-- 폼에 text박스 하나와 label박스 하나 만 올려 주셔요! 와왕 올리셨다구요! 그럼
이젠 코딩에 들어 가야 겠네요
<-- 그런다음에 폼의 속성에 보면 KEYPREVIEW라는 속성이 있는데.. 이것의 설정을
TURE로 속성을 정하면 된다.
<-- 아참! keypreviw라는 속성은 무엇인지 알아야 겠네요.. 폼에 키가 눌러지면 키에
관련된 내용을 보여준다는 것이죠!
<-- 그런다음에는 폼의 keydown이벤트에 이렇게 코딩해 주십시오..

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim dwConversion&, T$
ImmGetConversionStatus ImmGetContext(hWnd), dwConversion, 0
If dwConversion = &H1 Then T = "한글" Else T = "영문"
Label1 = "상태: " & T
End Sub
<-- 위에 label1="상태:" & T라는 것이 있죠!
<-- 한마디로 폼의 위에서 키를 눌러진면.. 이것을 가지고 한글인지 아니면 영문이지
라벨박스에 출력하기 위해서입니다.
<-- 자 이젠 실행해 보는 것이 남아 있군여.. 자 실행하셨다구요. 그럼 TEXT박스에서
한글키를 한번눌러 보세요 그럼 레벨박스에
<-- 한글이 나오죠! 그럼 확인을 해봐야겠죠! 입력해보세요.. 자동으로 한글이 입력되
죠! 그럼 다시 한번더 한글키를 (스페이스바 옆에 있는 키)
<-- 키를 눌러보세요! 레벨박스의 내용이 한글에서 영문으로 바뀌었죠! 그럼 TEXT박스
에 입력을 해보싶시오! 그럼 영문이 입력되죠!
<-- 간단한 팁이긴 합니다. 그러나 사용용도에 따라서는 충분히 활용가치가 있다고 생
각하기에 이렇게 글올려요!
//=====================================================================

내용 - 자 이젠 INI파일을 다루어 볼까요? INI파일을 이용해서 폼을 마음대로 실
행시키기..
비쥬얼베이직으로 만들어진 프로그램은 맨처음 시작하는 폼을 설정해 줘
야 합니다. 즉, FORM1이 기본적인 시작폼이 되는데.
때에 따라서 FORM2를 시작폼으로 사용하고자 할때가 있습니다. 그럼 어떻
게 해야 하나요? 라고 저에게 물어보는 분이 있기에
이렇게 사용합니다. 그러나 사실 이정도는 레지스트를 이용하는것이 좋으
나 우선 INI파일의 사용방법을 소개하고자 이렇게
만들어 보았습니다.

강좌 하는사람 : 부락다 ( 지동길 ) 대구공업대 컴퓨터 정보과 2학년 재학중..
활용방안 : 폼을 INI파일 옵션을 통해서 자기마음대로 선택해서 폼을 실행하기.. 우
왕 말이 어렵다구요! 그럼 한번 해보시면 이해가 갈려나..


<-- 자 모듈에 이렇게 정의합니다.
<-- getprivateprofilestring,writeprivateprofilesstring은 ini파일을 저장하고 읽어
오는 api함수가 되겠군요..

<-- ini 파일핸들부분입니다.
Public Declare Function GetPrivateProfileString Lib "kernel32"
Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal
lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As
String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Public Declare Function WritePrivateProfileString Lib "kernel32"
Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal
lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As
Long



<-- 서브함수로 ini 파일을 읽을때 사용합니다.
<-- ini파일은 섹션과 키 그리고 키값으로 저장되는 대요
<-- 예를 들어서 님께서 가지고 있는 ini파일을 하나 불러와 보세요
<-- 이런식으로 되어있죠!
<-- [FILE]
<-- VALUE=1
<-- 이런식 입니다. 그런데 섹션과 키는 대문자로 되어있죠!
<-- 이렇게 되어야 컴퓨터가 읽어지는 것입니다. 물론 마이크로 소프트웨어의 방식이
긴 하나..
<-- 자 그럼 서브함수에 ucase를 사용한 이유를 아시겠죠! 소문자든 대문자든 무조근
대문자로 저장한다는 함수가 되어지는 것을
<-- 한눈에 알아 볼수있겠네요..
Public Function Readini(Section, Key)
Dim RetVal As String, AppName As String, Worked As Integer
AppName = App.Path & "\setup.ini"
RetVal = String(255, 0)
Worked = GetPrivateProfileString(UCase(Section), UCase(Key), "", RetVal, Len
(RetVal), AppName)
Readini = Replace(Left(RetVal, Worked), Chr(0), "")
End Function


<--서브함수로 ini 파일을 쓸때 사용합니다.
Public Sub Writeini(Section, Key, W_KEY)
Dim Worked As Integer
Dim AppName As String
AppName = App.Path & "\setup.ini"
Worked = WritePrivateProfileString(UCase(Section), UCase(Key), W_KEY,
AppName)
End Sub
<-- 자 이렇게 모듈에 코딩하셨다구요! 정말 대단하시내요!! 그럼 폼에 코딩을 해보자
구요!!
<-- 우선 ini파일을 만들어야 합니다. 메모장을 열어서 글을 하나도 적지않고 그냥
project.vbp가 저장되어질 디렉토리에
<-- 저장하세요! 파일명은 setup.ini파일이 되겠군요.. 메모장으로 저장할때 주의하세
요! setup.ini.txt파일이 생성될수있으니깐요!
<-- 초보자를 위해서 이렇게 생성되면 안되죠! 그럴댄 도스로 잠시 나가서 setup.ini
파일로 변경해야 되겠죠! 주책이야 정말!
<-- 누굴 바보로 아나!! 이런분이 또 있겠군요! 그러나 저의 생각은 실수하실분이 있
을까 생각되어서시리.. ^.^@
<-- 그럼 이젠 실제적인 폼에 코딩을 해볼까용 폼을 두개 만드세요! 그런다음 form1

<-- 체크박스 하나와 command박스 하나를 만드시구요!~


<-- form1의 commad1박스에 이렇게 코딩하세용..
<-- 해석하자면 이렇습니다. 체크박스의 value 값을 저장합니다.
<-- 즉, 체크를 하면 ini파일에 VALUE=1로 저장되고 체크를 안하면 INI파일에 VALUE=0
값으로 저장됩니다.
Private Sub Command1_Click()
If Check1.Value = 1 Then
Call Writeini("File", "Value", Check1.Value)
End If
If Check1.Value = 0 Then
Call Writeini("File", "Value", Check1.Value)
End If
End
End Sub
<-- 이젠 FORM1의 LOAD부분에 코딩입니다.
<-- 해석해 본다면 이렇습니다. INI파일의 키값을 읽어서 값에따라 변화를 주는것입니
다.
<-- INI파일의 VALUE값이 1이면 체크박스에 대입해서 체크박스는 자동으로 체크되어지
구요..
<-- INI파일의 VALUE값이 0이면 체크박스에 대입해서 체크박스는 자도으로 체크되지
않습니다.
<-- 그리고 체크가 되어지면 그냥 폼1을 보여주고 체크가 되어있지 않다면 폼2를 보여
줍니다.
Private Sub Form_Load()
Check1.Value = Readini("File", "Value")
If Form1.Check1 = 1 Then
Form1.Show
End If

If Form1.Check1 = 0 Then
Form1.Hide
Form2.Show
End If
End Sub
<-- 이런식으로 INI파일의 VALUE값을 통해서 폼을 자동으로 선택해서 실행할수 있는것
입니다. 백문이불여일견이라고 했나요! 몇번보는것보다는
<-- 직접코딩해서 실행해 보는것이 좋을것 같내용.. 그려..
<-- 자에제 폼2를 만들어 보자구요!
<-- 폼2에는 COMMAND박스 하나만 만들고 COMMAND_CLICK() 부분에 FORM1.SHOW 를 입력
하세용
<-- 자 그럼 이젠 코딩이 끝났네요.. 실행해 보시구요! 궁금한것 있으면 연락주시어
요!
<-- 폼2에 FORM1을 보인것은 체크박스의 VALUE값을 변경해서 실행해보라고 이렇게 맨
들었어요..
<-- 자이젠 확인 작업을 해보야 겠군요.. 실행을 한후 폼1의 체크박스에 VALUE값을 변
경한후에 SETUP.INI파일을 메모장으로 불러오세요
<-- 그럼 체크했다면 혹은 체크하지 않았다면 서로의 VALUE값이 1과 0으로 저장되었는
것을 알수있겠죠!
<-- 이는 간단한 예제이구요! 이럴 응용하면 좋은 프로그램을 만들수 있다고 생각되어
지내요! 부락다의 생각입니다.
<-- 다음시간에는 레지스트를 이용해서 이런효과를 내어보죠! 레지스트강좌를 들어보
면.. 더욱더 쉽게 구현가능합니다.

//=================================================================

내용 - TEXT박스에 포크스가 있을때는 보라색으로 포크스가 떠나면 흰색으로 변
환하는 팁
이런것을 가지고 팁이라고 하는분이 있을줄 알고있구요! 그러나 분명히
이것은 프로그램 개발업체에서도 사용하는 팁이란것을
강조 합니다.
강좌 하는사람 : 부락다 ( 지동길 ) 대구공업대 컴퓨터 정보과 2학년 재학중..
활용방안 : 저는 이곳에 사용하고있습니다. 디비 프로그램을 만들었는데.. 어떤 텍스
트 박스에 커서가 옮겨졌는지를 알아보기 쉽게 그리고
더욱 친숙한 느낌을 주기위해 WHY?? 상용화된 프로그램은 항상 이런 효과
를 내더라구요! 제가 언젠가 말했죠! 상용소프트웨어의
흉내를 내는 강좌를 하겠다구요!@!

<-- 텍스트 박스에 보면 GOTFOCUS 이벤트가 있죠 여기에는 포크스가 텍스트박스에 옮
겨지면 생기는 것입니다.
<-- 그리구요! &HFFC0C0은 보라색인데.. 색깔을 모르실때는 아시죠! 텍스트 박스에 있
는 배경색을 선택후 복사하면 된다는것을..
Private Sub Text1_GotFocus()
Text1.BackColor = &HFFC0C0
End Sub
<-- 그리구 텍스트 박스에 보면 LOSTFOCUS 이벤트가 있는데.. 이것은 포크스가 다른곳
으로 옮겨지면 일어나는 액션입니다.
Private Sub Text1_LostFocus()
Text1.BackColor = vbWhite
End Sub
<-- 자 위와 같이 코딩을 하셨다면 이젠 폼을 생성해서 TEXT박스를 만들어 볼까용..
<-- 폼에 TEXT박스 2개를 만들어 놓구요.. 위의 내용을 복사해서 각각의 이벤트에 붙
혀 넣구요..

<-- 자 이젠 TEXT박스에서 엔터를 치면 다음 박스로 넘어가는 것을 배워볼까요! 이는
다른 사이트에 가도 볼수있구요!
<-- 흔히 사용되는 팁입니다. 그래도 초보자를 위해서 이렇게 만들어 두었습니다.
<-- 내용은 이렇습니다. KEYPRESS 이벤트에 입력하구요!
<-- KEYASCII=13 이라구 코딩되어있죠! 13은 아스카코드로 엔터키를 의미합니다.
<-- 그럼 분석해 보면 TEXT1박스에서 입력을 마치고 엔터키를 입력해 보세요! 그럼 자
동으로 TEXT2박스로 포크스가 옮겨지죠!
<-- TEXT2.SETFOCUS는 텍스트2로 포크스를 옮겨라는 의미가 되며
<-- 뒤에있는 KEYASCII=0을 입력하지 않고 코딩하면 옮겨질때 띵!! 하고 컴퓨터에서
소리가 나죠! 신경쓰이는 부분이라서
<-- 이렇게 0을 주면 포크스가 옮겨질때 소리를 방지하는 효과를 낸답니다.
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Text2.SetFocus
KeyAscii = 0
End If
<-- 제가 생각해도 유치한 내용이기는 하나 상용소프트웨어 또는 좋은 소프트웨어는
기능도 좋으나 이렇게 사용자를 생각하는 마음또한
<-- 중요하겠죠! 디비 프로그램에 입력할때 사용하면 깔끔한 느낌을 준다고나 할까
요!!
//========================================================================

내용:ini파일로 프로그램실행시.. 폼선택해서 실행하기

레지스트 사용으로 폼을 선택해서 실행하기..
소스는 vb.co.kr에 소스게시판에 hwp파일형식으로 그림과 같이 제공하겠습니다.
먼저 ini파일 작성 하겠습니다.
'ini 파일핸들 (모듈을 생성해서 붙혀 넣어세요)
Public Declare Function GetPrivateProfileString Lib "kernel32"
Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal
lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As
String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Public Declare Function WritePrivateProfileString Lib "kernel32"
Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal
lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As
Long
<-- 여기는 ini파일을 사용하겠다는 의미로 해석하시면 됩니다. 다른 옵션도 있으나
읽고 쓰는 것만 가능하게 한다면 이정도면 되죠!
<-- 그리고 이렇게 두개의 서버함수를 모듈에다 넣어주세요..

Public Function Readini(Section, Key)
Dim RetVal As String, AppName As String, Worked As Integer
AppName = App.Path & "\setup.ini"
RetVal = String(255, 0)
Worked = GetPrivateProfileString(UCase(Section), UCase(Key), "", RetVal, Len
(RetVal), AppName)
Readini = Replace(Left(RetVal, Worked), Chr(0), "")
End Function
<-- 이것은 폼에서 ini파일의 설정을 읽는곳입니다.

Public Sub Writeini(Section, Key, W_KEY)
Dim Worked As Integer
Dim AppName As String
AppName = App.Path & "\setup.ini"
Worked = WritePrivateProfileString(UCase(Section), UCase(Key), W_KEY,
AppName)
End Sub
<-- 이곳은 폼에서 ini파일의 설정을 실제로 ini파일에 설정하는 곳입니다.
<-- 그리고 보시면 ini파일생성은 폼이 있는디렉토리에 setup.ini파일을 생성한다는
의미입니다.
<-- 자이렇게 모듈에 모두 입력하셨다면 이젠 폼에다가 코딩을 해야겠죠!
<-- 저는 제가 작성한 프리멜리2000의 내용을 가지고 설명하고자 합니다.
<-- 이젠 폼을 작성해 보자구여..
<-- 폼은 3개정도 만들어야 하겠죠!
<-- ini파일 옵션을 주는폼, 시작폼, 그리고 ini파일이 실제로 읽고 쓰는것이 되는지
확인 하기위한 폼


<-- 시작폼
<-- 시작폼은 쉐어웨어처럼 동의를 얻어야 프로그램이 시작되는 효과를 내기위서 작성
합니다.
<-- text박스를 하나 올려 놓으시구여 속성에서 multiline의 옵션을 true로 변경하십
시오.
<-- 그리구여 scrollbars의 옵션을 2-수직으로 두세요. 여기는 프로그램 사용에 대한
약관 즉, 동의서라고 생각하시면 됩니다.
<-- 폼에 text1 이라는 서브함수를 만들어야죠!
<-- 물론 text1박스의 text속성에 입력해도 되나 입력하는것이조금 힘들거라 생각때문
에..

Public Sub TEXT() '텍스트박스에 보여줄 메시지 출력
Text1.TEXT = "안녕하세요! 프리멜리2000을 사용해 주셔서 감사합니다." & vbCrLf & _
"" & vbCrLf & _
"이 프로그램은 쉐어웨어 입니다. 정식사용을 위해서는" & vbCrLf & _
"레지스트키를 등록해 주셔야 합니다." & vbCrLf & _
"등록방법은 저에게 구입동의 메일을 보내주시면 레지스트키를 보내드립니다." &
vbCrLf & _
"이 프로그램은 VB.CO.KR에서 강의 자료로 사용을 허가 합니다." & vbCrLf & _
"프로그램은 비쥬벌베이직 서비스팩 3에서 이루어 졌습니다." & vbCrLf & _
"만든사람 : 지동길 별명 : 부락다 " & vbCrLf & _
"경력 : 인맥관리2.0 과 인맥관리2000 등 PIMS 부분의 경험이 풍부" & vbCrLf & _
" 네트워크 체팅프로그램 제작, 메시젼 프로그램 제작" & vbCrLf & _
" 학생취업 프로그램 제작, 숫자야구게임 제작" & vbCrLf & _
" 통신프로그램 야한밤2000 제작(비쥬얼 C++)" & vbCrLf & _
" 약국관리 프로그램 제작중" & vbCrLf & _
"" & vbCrLf & _
"학력 : 경북울진 후포고등학교 줄업" & vbCrLf & _
" 대구공업대 컴퓨터정보과 2학년 제학중" & vbCrLf & _
"연락처 : HP 016-661-4991 메일주소 : hupo61@hanmail.net"
End Sub
<-- 자 이렇게 입력하셨다구요. 그럼 조금 궁금한것이 있을것입니다. vbcrlf 와 뒤에
_ 사용한 이유는?
<-- vbcrlf는 이렇습니다. 미출력 상수입니다. 즉, 뒤의 내용을 보이지 않는다는 내요
이죠!
<-- 예를 들어서 text1박스를 생성하고 폼에 text1.text="부락다 입니다." & vbcrlf
& "정말루" 이렇게 하구 입력해 보세용
<-- 그러면 vbcrlf는 보이지 않고 이상하게 나오는것을 알수있을꺼예요!
<-- 그리고 끝에 _ 사용한것은 다음줄에 입력하겠다는 내용입니다. 작성후 실행해보
면 무슨말인지 이해가 가실것입니다.
<-- 그런데 주의점은 _을 사용할경우 한깐 띄우고 나서 사용해야 한다는 것이죠! 어떤
분은 붙혀사용한후 에러난다구 얘기하시더라구여

Public Sub CHECKING()
If Check1.Value = 1 Then
SaveSetting "프리멜리2000", "setup", "check", ŕ"
End If
If Check1.Value = 0 Then
SaveSetting "프리멜리2000", "setup", "check", Ŕ"
End If
End Sub
<-- 그리구 서브함수 checking 을 작성합니다.
<-- 이곳의 기능은 체크버턴을 클릭하면 레지스트에 값으로 1을 입력하구요 체크를 하
지않는다면 레지스트의 값으로 0을 입력하는 곳입니다.
<-- 즉, 체크를 해야 프로그램이 실행한다는 의미가 됩니다. 동의서에 동의한다는 의
미가 되겠네요.
<-- savesetting에 관한 간단한 설명
<-- 비베6.0은 api함수가 아닌 자체내부함수로 레지스트를 사용할수있도록 함수를 제
공합니다. savesetting이 자체내부함수로 사용됩니다.
<-- 저번에 강의한 내용있죠! 이것은 api함수를 사용해서 자체적으로 생성한 것이
고.. 지금의 것은 내부함수로 입력되는 곳은
<-- 레지스트 HKEY_CURRENCT_USE\software\vb and vba programsetting 에 기본적으로
기록되어 집니다.
<-- 확인을 위해서는 폼을 실행하고 나서 regedit.exe를 이용해서 확인해 보세요. 그
럼 프리멜리2000이라는 섹션과 색션안에 setup이라는 내부색션
<-- 이 생성되고 값은 기본값으로 0이 입력되어 있는것을 볼수있을 것입니다. 그리고
체크버턴을 누르고 다시 regedit.exe파일을 실행하고
<-- 레지스트의 위치에 찾아가 보면 기본값이 1로 기록되어 있는것을 보았을 것입니
다.

<-- 체크버턴을 만듭니다. 그리고 click이벤트에 checking함수를 불러옵니다.
Private Sub Check1_Click() '클릭하면 checing서브 함수 호출
CHECKING
End Sub

<--그리고 command1버턴을 하나 만들어 두세요, 그리고 click이벤트에 이렇게 입력하
세요
Private Sub Command1_Click()
If GetSetting("프리멜리2000", "setup", "check") = ŕ" Then
SaveSetting "프리멜리2000", "setup", "startform", ŕ"
Unload Me
Form2.Show
End If

If GetSetting("프리멜리2000", "setup", "check") = Ŕ" Then
SaveSetting "프리멜리2000", "setup", "startform", Ŕ"
End
End If
End Sub
<-- 자 이젠 getsetting에 관한 설명을 해야겠죠! vb6.0은 내부함수로 레지스트를 건
덜수있다는것은 위에서 설명했죠!
<-- savesetting은 값을 저장하는것이라면 getsetting은 저장한 값을 불러오는 것입니
다. 비교할때 많이 사용하죠!
<-- 내용은 이렇습니다.
<-- 전에 checking 서브함수를 작성하셨죠 그렇다면 저장된결과로 값을 비교합니다.
<-- 만약에 체크를 설정하였다면 프리멜리2000이라는 색션과 setup이라는 내부색션 그
리고 기본값으로 1을 설정합니다.
<-- 이는 동의서에 동의하고 실행버턴을 누르면 다음에는 동의서에 동의하라는 폼
즉, 시작폼이 실행되지 않는다는 의미겠죠!
<-- 체크버턴을 누르고 command1버턴을 크릭하면 startform에 값에 1이 저장되고 체크
를 하지않았다면 startform에 값이 0으로 저장됩니다.


Private Sub Form_Load()
TEXT
CHECKING
If GetSetting("프리멜리2000", "setup", "startform") = ŕ" Then
Unload Me
Form2.Show
End If
End Sub
<-- 자이젠 폼로드 부분에 코딩을 해볼까요
<-- 각각의 서브함수를 불러왔습니다. text,checking 서브함수
<-- 그리고 startform의 값이 1로 저장되어 있는지 레지스트를 검사하고 1로 저장되어
있다면 폼은 사라지고
<-- 다음폼이 보이게 됩니다. 사람의 눈으로는 동의서폼이 보이지 않기 때문에 위에
서 설명한 효과를 낼수있는것이죠!
<-- 실제적으로는 메모리에 상주되어 있되 1로 값이 정해지면 없어지는 것이죠!
<-- 자 이정도가 기본입니다. 다음에는 조금더 힘든 내용을 다루게되는데.. 이정도는
알아야! 그리고 이해해야 좋은 프로그램을 만들수있답니다.
<-- 그래도 힘들면.. vb.co.kr의 소스게시판에 가셔서 강좌-1.zip을 다운받아서 사용
하세요! 그럼 그림과 함께 어떻게 실행되는지
<-- 한눈에 알아볼수 있습니다.
//=====================================================================

Dim Cn As ADODB.Connection '디비 접속 변수
Dim rs As ADODB.Recordset '레코드셋 변수
Dim cnStr As String 'provide변수
Dim nrs() As Integer '각종 변수
Dim ss As String '디비디렉토리 파일명 변수
Dim id As Long 'max변수

Private Sub Command1_Click() '입력버턴..
id = max ' 데이터베이스 증가치를 주기위해서 만들었는 변수 서브 MAX참조
Set rs = New ADODB.Recordset
ssql = ""
ssql = ssql & "INSERT INTO 누구(tid, 이름, 나이, 성별) "
ssql = ssql & "VALUES(" & id & ","
ssql = ssql & "      '" & Trim(UCase(Text1.Text)) & "',"
ssql = ssql & "      '" & Trim(UCase(Text2.Text)) & "',"
ssql = ssql & "      '" & Trim(UCase(Combo1.Text)) & "')"
Cn.Execute ssql '쿼리문을 통해성.. 디비와 연결..
selects '서브함수 selects 리스트뷰박스 리플레쉬 기능..
End Sub

Private Sub Form_Load() '로딩부분..
cnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
ss = App.Path & "\address.mdb"
Set Cn = New ADODB.Connection
Cn.ConnectionString = cnStr & ss ' 우선 Provider는 드라이브명과 디비파일 경로를 선택한다.
Cn.Open '위의 내용을 가지고 디비를 연결시킨다.
Combo1.AddItem "남자"
Combo1.AddItem "여자"
Call max '서브함수 호출..
selects '리플레쉬
End Sub
Private Function selects() ' 리스트박스에 디비의 필드의 내용들을 보여주기위해서
ssql = "select 이름, 나이, 성별, tid from 누구 "
Set rs = New ADODB.Recordset
rs.Open ssql, Cn, adOpenStatic
ReDim nrs(rs.RecordCount) As Integer
Dim i As Integer
Dim listv As ListItem
list.ListItems.Clear
Dim count As Integer
i = 1
Do Until rs.EOF
Set listv = list.ListItems.Add(, , rs(0))
listv.SubItems(1) = rs(1)
listv.SubItems(2) = rs(2)
nrs(i) = rs(3)
i = i + 1
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Function
Public Function exec()
If App.PrevInstance Then
MsgBox "현재 프로그램이 실행중에 있습니다.", vbInformation, "확인"
End If
End Function

Private Function max() '디비에 있는 tid필드를 보고 하나의 값이라도 있다면 tid의 값을증가 없다면 초기치 1로 한다.
ssql = "select max(tid) from 누구"
Set rs = New ADODB.Recordset
rs.Open ssql, Cn
If IsNull(rs(0)) Then
max = 1
Else
max = rs(0) + 1
End If
rs.Close
End Function
//=====================================================================

내용 : 레지스트 다루기(5-1)

프로그램의 설정 사항을 저장하는 방법은 2가지 방법으로 간추려 보면,
ini파일과 레지스트리를 이용하는 방법으로 나눌수 있습니다.
레지스트리란 일종의 설정값을 저장하는 공간이라고 생각하시면 됩니다. 원도우95부터 마이크로소프트에서는 시스템의 등록정보나 각종 프로그램의
설정값등을 데이터베이스화 되어 시스템의 차원에서 관리되어지게되었습니당.
레지스트리의 편집은 별도의 유틸리가 필요없으며.. 원도우에 프로그램이 있다.. 기본적으로 포함된 레지스트리 편집기는 메뉴에 아이콘으로
등록되지 않기 때문에.. 탐색기에서 windows 디렉토리에 regedit.exe 파일을 실행해야 합니당..

(1) 우선 INI파일과 레지스트리의 구조를 알아보도록 하죠!

1. INI파일의 구조

[섹션 1]
엔트리1=값..
엔트리2=값..
엔트리3=값..

[섹션 2]
엔트리1=값..
엔트리2=값..
엔트리3=값..


2. 레지스트리의 구조

섹션1
|_ 섹션1-1
   키1=값..
   키2=값..
|
|_ 섹션1-2
   키1=값..
   키2=값..

이런식으로 구성되어 집니다.

(2) 비쥬얼 베이직 함수를 이용한 레지스트리 관리

1. 레지스트리를 다루는 것은 기존 버젼의 비쥬얼베이직에서는 API를 통해서 가능했으나.. 5.0부터는 아예 비베 내부 함수로 포함하게
   되어 사용자들에게 더욱 쉽게 레지스트리를 건덜수 있게 하였습니다.

   비쥬얼베이직에서 제공하는 표준 레지스트리의 위치는 이렇습니다.
   HKEY_CURRENT_USER/SOFTWARE/VB AND VBA PROGRAM SETTING/

2. 레지스트리를 읽고 쓰는 명령어와 함수는 총4개로 구성되어있어영..

   ----------------------------------------------------------------------
   명령어/함수                    설                  명
   ----------------------------------------------------------------------
   GETSETTING                    레지스트리 설정을 읽어요!
   SAVESETTING                   레지스트리 설정을 저장 혹은 작성합니다.
   GETALLSETTINGS                다중 레지스트리 설정을 읽어요!
   DELETESETTING                 레지스트리 설정을 삭제해요!
   ---------------------------------------------------------------------- 

3. 레지스트리 쓰기에 관해서 알아보도록 하죠!
   레지스트리에 값을 쓰기 위해서 사용하는 명령어는 SAVESETTING 인것은 아시겠죠! 만약 해당 색션이 존재하지 않는다면..
   자동으로 색션을 생성시키며, 이미 생성되어 있는 색션이라면.. 그 색션내의 값을 저장하는 기능을 합니다.
  
   구문 : SAVESETTING <어플리케이션>,<섹션>,<키>,<값>
   실제로 레지스트리의 키 값을 저장하는 위치는 아래와 같아용..
   HEKY_CURRENT_USER
    |_SOFTWARE
      |_VB AND VBA PROGRAM SETTING
        |_어플리 케이션
          |_ 섹션
             |_키=값

4. 레지스트리 읽기에 관해서 알아보도록 하죠!
   레지스트리 일기 위해서 GETSETTING명령어를 사용하는것은 이제 아시겠고, 그런데.. 문제는 GETSETTING과 GETALLSETTINGS 두가지
   명령어가 있는데.. 도대체 뭐하는 거여용 하면서 물어보시는 분이 있을것 같아요!
   GETSETTING명령어는 최종키에 해당하는 값을 얻는 반면에, GETALLSETTINGS명령어는 키가 아닌 섹션을 지정하여 해당 섹션에
   포함된 키들을 대상으로 하게 됩니다.
  
   구문 : 문자열 = GETSETTING( <어플리케이션>,<색션>,<키>,<디폴트 값>)
          만약에 지정한 레지스트리의 키가 존재하지 않을때는 어떻하겠나영.. 디폴트값을 리턴하게 되겠죠!
         
          문자열 배열 = GETALLSETTINGS( <어플리케이션>,<섹션>)
          이런식으로 사용됩니다.

5. 레지스트리 지우는 방법
   레지스트리를 지우기 위해서는 DELETESETTING명령어를 사용하면 됩니다.
  
   구문 : DELETESETTING <어플리케이션>,<섹션>,<키>
  
  
6. 백문이 불여일견이라.. 백번보는것보다는 한번 해보는것이 좋겠죠!
   우선 폼을 하나,체크버턴 하나를 만드십시오..
  
  '/-------------------------------------------------
  '/ 폼로드 이벤트에 아래와 같이 코딩하시구요!
  '/-------------------------------------------------         

  Private sub form_load()
 
  me.left=getsetting(app.title, "postion", "left", me.left)
  me.top=getsetting(app.title, "postion", "top", me.top)
  me.width=getsetting(app.title, "postion", "width", me.width)
  me.height=getsetting(app.title, "postion","height",me.height)
 
  End Sub

'/-------------------------------------------------
'/ 폼언로드 이벤트에 아래와 같이 코딩하시구요!
'/-------------------------------------------------         

Private Sub Form_Unload(Cancel As Integer)

SaveSetting App.Title, "postion", "left", Str(Me.Left)
SaveSetting App.Title, "postion", "top", Str(Me.Top)
SaveSetting App.Title, "postion", "width", Str(Me.Width)
SaveSetting App.Title, "postion", "height", Str(Me.Height)

End Sub

7. 자 이젠.. 실행을 해보고.. 그리고. regedit.exe파일을 통해서 레지스트리의 변화상태를 파악하면.. 쉽게 알수있을것입니다.
   그리고 버턴을 만들어서.. 레지스트리를 지워줄수도 있겠죠!
   지우는 방법은 버턴을 만든후에 버턴클릭이벤트에..
   deletesetting app.title 를 입력해 주시면 쉽게 삭제가 되겠죠! 그리고.. 변경된 내용은 다시한번더 regedit.exe파일을 실행해야
   올바른 결과값을 볼수있습니다.
  
8. 당부사항 : 아주 특별한 기능은 아닙니다. 그러나 여러프로그램을 보시면 알다시피.. 프로그램을 아무른 위치에서 종료하면.. 프로그램이
              최종적으로 끝난위치를 저장해서 다음에 불러올때 최종적으로 끝난위치에 불러 들이죠!
              이런방법은 ini파일로 옛날에는 많이 구현되었습니다. API함수를 사용하기 어려워서이겠죠! 그러나 비베 5.0 이상부터는
              전에 말한것처럼.. 내부명령어(함수)로 들어가 있기 때문에 이런방법을 사용하는것이 훨씬 쉽고 안전하다는 말이죠!
              우왕 설명이 좀 지저분한 내용인것은 아닌지 모르겠습니다.
              그럼 즐프하시기를 기원하면.. 부락다는 물러나겠습니당.. 초보님들은 내용보시고 도움되시면.. 감사의 멜을 보내주시는것은
              어떨징.. 히히..

//==========================================================================

내용 : Winsock 컨트롤의 개념과 이해

(1) Winsock 컨트롤의 프로퍼티와 메서드 그리고 이벤트에 대해서 알아보죠!
   1.Tcp 관련 프로퍼티
     -------------------------------------------------------------------------     프로퍼티                          기                                  능
     -------------------------------------------------------------------------
     localIP              자신의 컴퓨터의 IP를 설정하는 프로퍼티로 읽기쓰기 모두 가능함
     LocalHostName        자신의 컴퓨터의 이름을 설정하는 프로퍼티 입니다.
     RemoteHost           연결하고자 하는(SERVER)측의 컴퓨터 이름, 즉 IP 나 DNS를 설정합니다.
     RemoteHostIP         연결하고자 하는(SERVER)측의 IP를 설정하는 프로퍼티
     Remoteport           연결하고자 하는 컴퓨터의 port값을 설정하는 프로프티 입니다.
     SocketHandle         연결되어 있는 소켓의 핸들값을 표시하는 프로프티 입니다. 이프로프티는 읽기전용입니다.
     ByteRecevied         Getdata로 받은 데이터의 양을 표시하는 프로퍼티입니다. 프로퍼티는 읽기전용으로 RUN TIME시
                          수정이 불가능합니다.
     State                소켓의 연결 상태를 알려주는 프로퍼티 입니다. 읽기전용이구요
     SckConnetionPending  접속을 기다립니다.
     ckConnecting         연결하고 있는 중
     sckConnected         연결된 상태
     sckclosed            소켓이 끊어진 상태
     sckclosing           소켓이 끊어지고 있음
     scklistening         소켓이 대기중
     sckerror             소켓에 에러가 남
     sckopen              소켓이 열린상태
     sckResolvingHost     호스트 이름에서 IP를 얻는중
    -------------------------------------------------------------------------  
    자 여기서 처음으로 접속시 설정해야 할 프로퍼티는 RemoteHost 와 RemotePort 그리고 localprot 프로퍼티 입니다.
    접속하고자 하는 클라이언트에서는 서버에서 열어논 port번호를 RemotePort 에 설정하고 서버의 주소를 RemoteHost 에
    저장합니다. 그리고 서버에서는 클라이언트가 접속할수 있는 포트를 localport에 설정해주어야 합니다.
   
    LocalPort설정을 할경우는 주의점이 있는데.. 이는 port 넘버를 1000 이상으로 지정해줘야 한다는 것입니다.
    이유는 1000번 이하의 포트들은 예약이 되어있는 상태이기 때문입니다. 포트는 1000번 이후부터 설정해줘야 하는것을
    까먹으면 안되요!


   2.tcp 관련 메서드
    -------------------------------------------------------------------------
    메서드                            기                                능
    -------------------------------------------------------------------------
    Listen                서버에서 접속을 기다립니다.
    Connect               클라이언트에서 접속을 요구합니다.
    Accept                접속요구가 있으면 접속을 허락합니다.
    Getdata               데이터를 보냅니다.
    Close                 스켓을 닫습니다.
    -------------------------------------------------------------------------

  3.tcp 관련 이벤트
   --------------------------------------------------------------------------
   이벤트                             기                                능   
   --------------------------------------------------------------------------
   ConnectionRequest      클라이언트에서 connect 메서드로 접속을 요구할 경우 생기는 이벤트 입니다.
   Connect                접속이 완료된 상태에서 일어나는 이벤트 입니다.
   DataArrival            상대측에서 데이터를 전송할 경우 일어나는 이벤트 입니다.
   Error                  소켓에 에러가 생길 경우 발생하는 이벤트 입니다.
   Close                  소켓이 접속 해제될 경우 발생하는 이벤트 입니다.
   --------------------------------------------------------------------------

//=========================================================================

내용:사운드카드 체크함수

Private Sub COMMAND1_Click() '체크버턴

Dim rtn As Integer

rtn = waveOutGetNumDevs() '사운드카드 체크함수..

If rtn = 1 Then '사운드카드가 있다면..
  MsgBox "님의 컴에는 사운드 카드가 있내용.."
Else '사운드카드가 없다면..
  MsgBox "님의 컴에는 사운드 카드가 없내용.."
End If
End Sub

모듈
Declare Function waveOutGetNumDevs Lib "winmm.dll" () As Long

//==========================================================================

내용: 볼룸 조절 보이기

Dim dblReturn As Double
dblReturn = Shell("rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @1", 5)

//==========================================================================

내용: 동일 프로그램 중복방지

 

Public Sub InterruptDuplicateExecution()
  If App.PrevInstance Then
      MsgBox "이 프로그램은 두번 실행될 수 없습니다."
      End
  End If
End Sub 

'음 이렇게 코딩하면.. 님께서 만든 프로그램이 실행중이라면..
동일한 님의 프로그램을 실행하면.. 위와 같은 메시지가 나오겠죠!
특별히 똑같은 작업을 하지 못하게 하는 방법을 사용하실때
도움이 되는 방법이겠내용.. 이것도 역시 허접자료가 될지도.
//==========================================================================

내용 : 비베 함수 정의

◆ Abs 함수
전달된 수치의 절대값을 지정하여 동일한 형식으로 반환합니다.

구문 Abs(number)

필수 항목인 number 인수에는 유효한 숫자 식을 사용합니다. 만약 number가 Null 값을 가지면 Null 값을 반환하며, 초기화되지 않은 변수이면 0을 반환합니다.

참고

절대값이란 부호를 떼어낸 값을 말합니다. 예를 들어, ABS(-1)와 ABS(1)는 모두 1을 반환합니다.

Abs 함수 예제

다음은 숫자의 절대값을 계산하기 위해 Abs 함수를 사용하는 예제입니다.

Dim MyNumber

MyNumber = Abs(50.3)' 50.3을 반환합니다.

MyNumber = Abs(-50.3)' 50.3을 반환합니다.  인수

프로시저에 전달되는 상수, 변수, 또는 식을 의미합니다.

숫자 식

숫자로 평가될 수 있는 식을 의미합니다. 식의 요소는 결과적으로 숫자가 되는 키워드, 변수, 상수, 연산자의 조합을 포함할 수 있습니다.

Null

변수가 무효 데이터를 포함한다는 것을 지시하는 값을 의미합니다. Null을 포함하는 식 사이에서 변수나 작동에 Null을 명시적으로 설정하면 그 결과 Null이 됩니다.

변수

프로그램 실행 중 수정될 수 있는 데이터를 포함할 수 있는 명명된 저장 위치를 의미합니다. 각 변수는 그것의 범위 안에서 유일하게 식별하는 이름을 가집니다. 데이터 형식은 지정될 수도 있고 안될 수도 있습니다.

변수 이름은 영문으로 시작해야 하고, 같은 범위 안에서 유일해야 하며, 255 문자보다 적어야 되며, 포함 구간이나 형식 선언 문자를 포함할 수 없습니다.



- 위로 -

◆ Array 함수
배열이 포함된 Variant를 반환합니다.

구문 Array(arglist)

필수적인 arglist 인수는 Variant에 있는 배열의 요소에 지정된 쉼표로 구분된 값 목록입니다. 지정된 인수가 없으면 길이가 0인 배열을 만듭니다.

참고

배열의 요소를 참조하는 데 사용하는 표시는 변수 이름과 이 이름 뒤에 오는 원하는 요소를 나타내는 색인 번호가 있는 괄호로 되어있습니다. 다음 예에서 첫번째 문은 변수 A를 Variant로 만들고 두 번째 문은 배열을 변수 A에 지정하며, 마지막 문은 두 번째 배열 요소값을 다른 변수에 지정합니다.

Dim A As Variant

A = Array(10,20,30)

B = A(2)

Array 함수로 만든 배열의 하위 제한 범위는 0입니다. 다른 배열 형식과는 달리 Option Base 문에 지정된 하위 제한 범위의 영향을 받지 않습니다.

메모

배열로 선언되지 않은 Variant에도 배열이 포함될 수 있습니다. Variant 변수는 고정 길이 문자열이나 사용자 정의 형식을 제외하면 어떤 형식의 배열이라도 포함할 수 있습니다. 배열을 포함하는 Variant는 요소가 Variant 형식인 배열과 개념은 다르지만 배열 요소를 액세스하는 방식은 같습니다.

Array 함수 예제

다음은 Array 함수로 배열이 포함된 Variant를 반환하는 예입니다.


Dim MyWeek, MyDay

MyWeek = Array("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")

' 하위 제한 범위를 1로 설정하는 값을 반환합니다(Option Base 문 ' 사용).

MyDay = MyWeek(2)' MyDay에는 "Tue"가 들어갑니다.

MyDay = MyWeek(4)' MyDay에는 "Thu"가 들어갑니다.  배열

동일한 고유 데이터 형식을 가진, 연속적으로 인덱스된 구성 요소 집합을 의미합니다. 배열의 각 구성 요소는 고유의 식별 인덱스 번호를 가지고 있습니다. 배열의 한 구성 요소를 변화시켜도 다른 구성 요소는 영향을 받지 않습니다.

Variant 데이터 형식

특수 값인 Empty와 Null뿐만 아니라 숫자, 문자열, 날짜 데이터를 저장할 수 있는 특수 데이터 형식을 의미합니다. 데이터 형식은 16바이트의 수 저장 크기를 가지고 있어 Decimal 범위까지의 데이터를 포함할 수 있거나 22바이트 크기의 문자 저장 크기(양의 문자열 길이)를 가지고 있어 문자 텍스트를 저장할 수 있습니다. VarType 함수는 Decimal에서 어떻게 데이터가 취급되는지를 정의합니다. 만일 일부 다른 데이터 형식처럼 명시적으로 선언하지 않으면 모든 변수는 Decimal 데이터 형식이 됩니다.



한 가지 종류의 수행, 선언, 또는 정의를 표현하는 문장 구성상 완전한 단위를 의미합니다. 문은 일반적으로 한 줄을 차지하지만 사용자가 콜론 (:) 을 사용하여 한 줄에 하나 이상의 문을 포함할 수 있습니다. 사용자는 또한 줄 연속 문자(_)를 사용하여 하나의 논리 줄을 제 2 논리줄에 연결할 수 있습니다.

사용자 정의 형식

Type 문을 사용하여 정의된 데이터 형식을 의미합니다. 사용자 정의 데이터 형식은 하나 이상의 데이터 형식 요소를 포함할 수 있습니다. 사용자 정의 및 다른 데이터 형식의 배열은 Dim 문을 사용하여 만들어집니다. 형식의 배열은 사용자 정의 형식 안에 포함될 수 있습니다.



제품별 정보

Array 함수와 Option Base

도움말에서는 Array 함수 상태가 Option Base 설정에 영향을 받지 않는다고 나와 있습니다. 이것은 옳지 않습니다. 실제 상황은 다음과 같습니다. Array 함수의 이름을 VBA.Array로 정하면 Option Base 설정이 무시됩니다. Array가 부적합하면, Option Base 설정에 따라 배열의 하한선이 결정됩니다.

- 위로 -

◆ Asc 함수
문자열의 첫 글자에 대응하는 문자 코드를 나타내는 Integer 값을 반환합니다.

구문 Asc(string)

필수 항목인 string 인수는 유효한 문자열 식이어야 합니다. string에 해당하는 문자가 없는 경우 런타임 오류가 발생합니다.

참고

DBCS 계열 이외의 시스템에서는 0 55 값을 반환하나, DBCS 계열의 시스템에서는 -32768?

32767 사이의 값을 반환합니다.

메모

AscB 함수는 문자열에 포함된 바이트 데이터를 사용합니다. AscB 함수는 문자 코드의 첫 글자를 반환하는 대신에 첫째 바이트를 반환합니다. AscW 함수는 Asc 함수에서와 같이 Unicode를 지원하지 않는 플랫폼을 제외하고 Unicode 문자 코드를 반환합니다.

Asc 함수 예제

이 예제는 Asc 함수를 사용하여 문자열의 첫째 문자에 따른 문자 코드를 반환합니다.

Dim MyNumber

MyNumber = Asc("A")' 65를 반환합니다.
//=======================================================================

MyNumber = Asc("a")' 97을 반환합니다.

MyNumber = Asc("Apple")' 65를 반환합니다.  문자 코드

ANSI 문자 집합과 같이 설정에서 특정 문자를 나타내는 숫자를 의미합니다.

Integer 데이터 형식

-32,768에서 32,767까지의 범위에서 2바이트 전체 숫자로 저장된 정수 변수를 갖는 데이터 형식을 의미합니다. Integer 데이터 형식은 또한 계산된 값을 나타내는데 사용됩니다. 퍼센트 기호(%)형식 선언 문자는 Visual Basic에서 Integer로 나타냅니다.

문자열 식

계속된 문자의 나열을 계산하는 식을 의미합니다. 문자열 식의 요소는 문자열 문자, 문자열 리터럴, 문자열 상수, 문자열 변수, 문자열 Variant를 반환하는 함수 또는 문자열 Variant (VarType 8)를 반환하는 함수를 포함합니다.

런타임 오류

코드가 실행되는 동안 발생하는 오류를 의미합니다. 런타임 오류는 문이 잘못된 작동을 시도할 때 발생하게 됩니다.

DBCS

1이나 2바이트를 사용하여 문자를 나타내는 문자 집합을 의미하며 256이상의 문자를 표현할 수 있습니다.

Unicode

국제 표준 기구(ISO)의 표준 문자를 의미합니다. Unicode는 16비트(2바이트)의 코딩법을 사용하여 65,536개의 별개 문자 공백을 허용합니다. Unicode는 구두 기호, 수학적 기호, 장식 활자를 포함하며 앞으로 증가될 표기에 대비한 상당한 여유를 가지고 있습니다.



- 위로 -

◆ Atn 함수

특정한 수의 아크탄젠트(arctangent) 값을 지정하는 Double을 반환합니다.

구문 Atn(number)

필수 항목인 number 인수에는 Double이나 유효한 숫자 식을 사용합니다.

참고

Atn 함수는 직각 삼각형의 두 변의 비율(number)을 취하여 그에 대응하는 각도를 라디안 값으로 반환합니다. 여기서 비율은 각을 마주보는 변의 길이를 각에 인접한 변의 길이로 나눈 값을 말합니다.

결과값의 범위는 -pi/2에서 pi/2 라디안 사이입니다.

각도를 라디안으로 환산하려면, 각도에 pi/180를 곱해 줍니다. 라디안을 각도로 환산하려면 180/pi을 곱해 줍니다.

메모

Atn은 삼각함수 Tan의 역함수입니다, Tan은 각도를 인수로 취하여 직각 삼각형의 두 변의 비율을 되돌려 줍니다. 탄젠트(1/tangent)의 단순한 역수인 코탄젠트를 Atn과 혼동하지 마십시오.

Atn 함수 예제

다음은 원주율 값을 계산하기 위해 Atn 함수를 사용하는 예제입니다.

Dim pi

pi = 4 * Atn(1)' 원주율의 값을 계산합니다.
Double 데이터 형식

64비트 숫자로 배정도 부동 소수점을 나타내는 데이터 형식으로 음수는 -1.79769313486232E308에서 -4.94065645841247E-324까지의 범위를 가지고 있고 양수는 4.94065645841247E-324에서 1.79769313486232E308까지의 범위를 가지고 있습니다. Visual Basic에서 숫자 기호 (#) 형식 선언 문자는 Double을 나타냅니다.

숫자 식

숫자로 평가될 수 있는 식을 의미합니다. 식의 요소는 결과적으로 숫자가 되는 키워드, 변수, 상수, 연산자의 조합을 포함할 수 있습니다.



- 위로 -

◆◆ Type Conversion 함수 ◆◆
다음 함수는 식을 특정한 데이터 형식으로 변환합니다.

구문

CBool(expression‎)

CByte(expression‎)

CCur(expression‎)

CDate(expression‎)

CDbl(expression‎)

CDec(expression‎)

CInt(expression‎)

CLng(expression‎)

CSng(expression‎)

CVar(expression‎)

CStr(expression‎)

필수 항목인 expression‎ 인수로는 모든 문자열 식이나 숫자 식을 사용할 수 있습니다.

반환값

함수 이름에 따른 반환 값의 형식은 아래와 같습니다  함수
반환 자료형
expression‎ 인수의 범위

Cbool
Boolean
적절한 문자열 식이나 숫자 식.

Cbyte
Byte
0에서 255까지의 숫자.

Ccur
Currency
-922,337,203,685,477.5808에서 922,337,203,685,477.5807.

Cdate
Date
모든 적절한 날짜 식.

CDbl
Double
음수값인 경우 -1.79769313486232E308에서 -4.94065645841247E-324까지.

//========================================================================

내용:모니터 온/오프 하깅..
그냥 폼에 모두 코딩하세용..

일반
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

   Private Const WM_SYSCOMMAND = &H112
   Private Const SC_MONITORPOWER = &HF170

COMMAND1 코딩..
SendMessage Me.hWnd, WM_SYSCOMMAND, SC_MONITORPOWER, ByVal 0&

COMMAND2 코딩..
'Turn Monitor off: ->
SendMessage Me.hWnd, WM_SYSCOMMAND, SC_MONITORPOWER, ByVal -1&
//========================================================================

내용 : 윈도우즈 종료/재부팅/LOGOFF/절전모드 
허접자료 입니당.. 죄송해영.. 허접자료 올리게 되니..
[API 선언]
Private Declare Function ExitWindowsEx Lib "USER32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Function SetSystemPowerState Lib "kernel32" (ByVal fSuspend As Long, ByVal fForce As Long) As Long

Private Const EWX_LOGOFF = 0
Private Const EWX_SHUTDOWN = 1
Private Const EWX_REBOOT = 2

[사용 방법]
'윈도우 종료
ExitWindowsEx EWX_SHUTDOWN, 0

'윈도우 재부팅
ExitWindowsEx EWX_REBOOT, 0

'다른 사용자로 로그 오프
ExitWindowsEx EWX_LOGOFF, 0

'절전 모드
SetSystemPowerState True, True

'fSuspend : 사용 중지 모드(윈도 95/NT는 지원되지 않는다)
           TRUE : 램의 내용을 보존하면서 시스템을 정지 시킨다.(RAM-alive 기법)
           FALSE : 시스템 상태를 저장하고, 시스템을 정지 시킨다.(hibernate 기법)
'fForce   : 각 응용프로그램과 드라이버로 보낼 공시 메시지의 형태를 지정한다.
           TRUE : 시스템 작동을 즉시 정지 시킨다.
           FALSE : 시스템 작동을 정지 시키는 허가를 요청한다.

//=========================================================================

내용 : 자동업데이트 프로그램원리

 

간단히 인터넷tv 프로그램을 만들어서 올려두었더니 메일로 궁금해 하는 분들이 많아서 간단히 설명을 하고자 이렇게 적게되었습니다.
일단 인터넷tv는 프로그램의 특징 그런것은 없습니다. 그냥 만들어 보았으니깐요!
일단. 서버프로그램과 클라이언트프로그램 그리고 인터넷tv프로그램이 있어야 하겠죠!
클라이언트는 서버와 통신을 해서 날짜를 비교합니다.

서버프로그램 : server.exe 파일로 컴파일 했구요! 비쥬얼베이직 으로 작성되었습니다.
서버에는 이 프로그램만 있으면 됩니다.
그리고 서버에는 특정디렉토리에 있는 파일을 첨부할수있개 했습니다.

그리고 클라이언트에는 client.exe 라는 자동업데이트 프로그램과 project1.exe 라는 인터넷tv가 있습니다.
그럼. 클라이언트 프로그램이 어떻게 서버에 연결되어서 날짜를  비교하고 업데이트 되는지 설명하겠습니다.

일단 클라이언트에서의 실행과정을 설명하겠습니다.
클라이언트는 project1.exe 라는 인터넷tv가 실행이 됩니다. 인터넷tv의 메뉴에 보시면 업데이트라는 메뉴가
있습니다. 그럼.. 어떻게 인터넷tv가 자동으로 업데이트 되는지 설명하도록 하겠습니다.

인터넷tv의 기능은 그냥 인터넷을 통해서 tv를 보는 기능만으로 충분히 자기역활을 합니다.
그러나 client.exe 파일은 서버와 통신을 해서 최근의 파일 즉, project1.exe 파일 혹은 다른파일을 받아오겠죠!

인터넷tv에서 업데이트 메뉴을 실행하면.. 이렇습니다. 팝폴더 라는 업데이트 프로그램을 보시면 자신의 프로그램을 종료하고나서
업데이트를 시킨후에 최근의 업데이트된 프로그램을 자동으로 실행시키는 기능이 있습니다.

이것을 어떻게구현하는가 잘 보십시오.
client.exe가 최초로 실행되면 클라이언트 컴퓨터의 레지스트에 서버의 ip와 클라이언트 날짜(project1.exe)설치된 날짜 가 저장되어집니다.
그리고. 소켓을 통해서 레지스트리에 저장된 서버의 ip로 접속을 합니다. 그러다음 서버의 날짜와 클라이언트의 날짜를 비교합니다.
서버의 날짜와 일치하거나 혹은 클라언트쪽이 날짜가 크다면.. client.exe파일은 종료되고 project1.exe 파일을 다시 실행합니다.
이를 구현하는 방법을 코딩으로 보여드리겠습니다.

private sub update_click() '업데이트 메뉴입니다.
'/업데이트 시작..
Dim A As String
A = App.Path & "\client.exe"
ShellExecute hwnd, "open", A, _
               vbNullString, vbNullString, conSwNormal
End
End Sub

위와 같이 하면 자동으로 client.exe 파일이 실행되겠죠!
그런데 끝에 end 가 있내요! end는 종료하는것이잖아요!
하시는분들이 많아서 상세하게 설명하자면.. 우리는 업데이트된 프로그램을 다시 실행하게 하는 기능까지 추가하기 위해서 겠죠!
그럼 client.exe 파일이 실행되고 나서 project1.exe 파일이 종료됩니다.
client.exe 파일이 서버와 연결되어 최근의 project1.exe 파일을 받아와요! 그런다음 다시 최근의 파일을 실행야겠죠!
그런데.. 여기서 의문점이 생깁니다. 최근의 파일을 받아온다면.. 전에 있던 파일은 어떻게 되나요!!
간단합니다. client.exe파일에서 코딩할때.. 파일을 받기전에 삭제를 합니다. 그리고나서 종료할때

소켓을 닫고. client.exe 파일을 end로 종료하고 (아래와 같이 코딩하면)
Dim A As String
A = App.Path & "\project1.exe"
ShellExecute hwnd, "open", A, _
               vbNullString, vbNullString, conSwNormal
end
업데이트된후에 최근에 서버에서 복사해온것(project1.exe 파일을 실행하게 되는것이죠!)
이정도의 개념만 잡았다면 팝폴더라는 프로그램이나 v3 2000 pro 의 업데이트 프로그램같은것은 쉽게 만들수있을것입니다.
뼈다구도 잘다듬어 지고, 포장도 잘하면.. 쓸만한 프로그램이 되겠죠,..
근데난.. 포장에 많이 신경을 쓰는 편이긴하나.. 워낙 솜씨가 없어서시리..

그럼.. 자동업데이트 프로그램을 만들어 보고자 하신분들에게 많은 도움이 되었으면 좋겠내요!
물론 위와 같은 방법이 있긴하나 길은 하나가 아니라 여러갈래로 나누어지니.. 선택한길로 가세요! 결국 도착점은 같으니깐요!!

이상 한마음소프트에서 지동길 이였습니다.
//========================================================================

내용 : 리스트 뷰에 뿌려진 내용 디비에 저장

 

어떤디비를 불러와서 리스트뷰에 뿌려줍니다.
그런다음..새로운 디비를 생성해서 그쪽에다가.. 리스트뷰에
뿌려준 내용을 저장하는것인데엽..
도움되시길.. 헐..
조인이 된 디비를 리스트뷰에 뿌려주어서.. 조인을 푸는 효과도
되겠네엽..


On Error GoTo error
Dim DB As Database
Dim tb As TableDef
Dim fld1, fld2, fld3, fld4, fld5, fld6, fld7, fld8, fld9, rll As Field
Dim idx As Index
Dim dbfilepath As String

' 디비생성 부분.. dao
If Dir(dbfilepath, vbNormal) <> "" Then
dbfilepath = App.Path & "\save_txt\new.mdb"
Set DB = DBEngine.Workspaces(0).CreateDatabase(dbfilepath, dbLangGeneral, dbEncrypt)
Set tb = DB.CreateTableDef("info")

'필드생성
Set fld1 = tb.CreateField("sname", dbText, 10)
Set fld2 = tb.CreateField("civno", dbText, 30)
Set fld3 = tb.CreateField("year", dbText, 10)
Set fld4 = tb.CreateField("schname", dbText, 20)
Set fld5 = tb.CreateField("sy", dbText, 5)
Set fld6 = tb.CreateField("sb", dbText, 5)
Set fld7 = tb.CreateField("bname", dbText, 10)
Set fld8 = tb.CreateField("sex", dbText, 4)
Set fld9 = tb.CreateField("addr1", dbText, 100)
Set rr = tb.CreateField("tnamea", dbText, 10)

'필드 추가
tb.Fields.Append fld1
tb.Fields.Append fld2
tb.Fields.Append fld3
tb.Fields.Append fld4
tb.Fields.Append fld5
tb.Fields.Append fld6
tb.Fields.Append fld7
tb.Fields.Append fld8
tb.Fields.Append fld9
tb.Fields.Append rr
DB.TableDefs.Append tb
DB.Close
Call Savesa(list, App.Path & "\save_txt\new.mdb")


' 리스트뷰에 뿌려진 내용을 생성한 디비에 쑤셔넣기..
Public Function Savesa(lv As ListView, sPath As String) '리스트뷰 텍스트파일로 저장..헐
Dim subit(1000) As String
Dim subit1(1000) As String
Dim subit2(1000) As String
Dim subit3(1000) As String
Dim subit4(1000) As String
Dim subit5(1000) As String
Dim subit6(1000) As String
Dim subit7(1000) As String
Dim subit8(1000) As String
Dim subit9(1000) As String
Dim f As Integer
Dim i As Integer
Dim j As Integer
Dim x As Integer
Dim ssql As String
On Error Resume Next
Set DBADDR = OpenDatabase(App.Path & "\save_txt\new.MDB", , True)

For i = 1 To lv.ListItems.count
subit(i) = lv.ListItems(i).TEXT
subit1(i) = lv.ListItems(i).SubItems(1)
subit2(i) = lv.ListItems(i).SubItems(2)
subit3(i) = lv.ListItems(i).SubItems(3)
subit4(i) = lv.ListItems(i).SubItems(4)
subit5(i) = lv.ListItems(i).SubItems(5)
subit6(i) = lv.ListItems(i).SubItems(6)
subit7(i) = lv.ListItems(i).SubItems(7)
subit8(i) = lv.ListItems(i).SubItems(8)
subit9(i) = lv.ListItems(i).SubItems(9)

ssql = ""
ssql = "insert into info(sname,civno,year,schname,sy,sb,bname,sex,addr1,tnamea) values('" & subit(i) & "','" & subit1(i) & "','" & subit2(i) & "','" & subit3(i) & "','" & subit4(i) & "','" & subit5(i) & "','" & subit6(i) & "','" & subit7(i) & "','" & subit8(i) & "','" & subit9(i) & "') "
DBADDR.Execute (ssql)
Next
End Function
//=========================================================================

내용 : text파일을 리스트뷰에 뿌려주는 팁입니다.
요즐들어서 리스트뷰에 관련된 내용을 많이 다루네염. 죄송엽..헐
Dim sstring As String
Dim str_caption As String

Private Function selects(list As ListView, sstring As
String)
Dim a As String
Dim b As ListItem
a = Dir(App.Path & "\data\list.dat")

'// 데이터가 없으면..
If a = "" Then
MsgBox "데이터가 없습니다.", vbCritical, "에러"
'GoTo error
Else


'// 데이터가 있다면..
Open App.Path & "\data\list.dat" For Input As #1
   Do Until EOF(1)
   Line Input #1, str_caption
   sstring = str_caption & vbCrLf
  
   Set b = list.ListItems.Add(, , Split(UCase
(sstring), "")(0))
  
   For i = 1 To 1
   b.SubItems(i) = Split(UCase(sstring), "")(i) 
   Next i
  
   Loop
Close
End If

error:
Form1.Show
Exit Function

End Function               _ 리스트뷰명 
                           |
사용방법은  Call selects(List, zstring)
ex)
_ 아이템  ---------- 서브아이템
|         |     |
---------------------
이름   | 나이 | 성별|
---------------------
홍길동 | 24   | 남  | <-- 텍스트 파일의 내용들
---------------------
이런식으로 출력이 되겠죠!!

txt파일의 내용은
홍길동;24;남;
이런식으로 저장하면 되구요!!

리스트뷰에 있는 내용을 텍스트 파일로 저장하는 팁
Public Function SaveLV(lv As ListView, SUBS As
Integer, sPath As String)
  
   Dim subit As Variant
   Dim F As Integer
   Dim i As Integer
   Dim x As Integer
   F = FreeFile
   On Error Resume Next
   Open sPath For Output As #F


   For i = 1 To lv.ListItems.count
   subit = lv.ListItems(i).TEXT & "" & vbTab
   For x = 1 To SUBS
   subit = subit & lv.ListItems(i).SubItems(x) & vbTab
   Next
   Print #F, subit
subit = ""
Next
Close #F
End Function
음.. 역시이것도 리스트박스에 있는 내용들을 txt파일로 저장하는
방법인데..

_ 아이템  ---------- 서브아이템
|         |     |
---------------------
이름   | 나이 | 성별|
---------------------
홍길동 | 24   | 남  | <-- 디비에서 불러온 내용들
---------------------
txt파일의 내용은
홍길동;24;남;
이런식으로 저장이 되겠죠!!
                   
                    |-리스트뷰 이름     |- 저장할 파일 이름
사용방법은 savelv(list, 2, app.path & "\list.txt")
                        |_리스트뷰의 서브아이템 갯수

728x90

+ Recent posts