VB에서는 문자열 값이 수치값인지 확인하는 IsNumeric이라는 함수가 있다.
이런 것을 델파이에서 쓰려면 아래의 함수를 사용하면 간단하게
문자열이 수치값인지 확인할 수 있다.


function IsNum(sStr : string) : boolean;
var
  nErr : integer;
  nRet : integer;
begin
  Val(sStr, nRet, nErr);
  Result := (nErr = 0);
end;


Posted by 띠리

인터넷에서 16진수 문자열을 10진수 수치값으로 바꾸는 것을 찾아봐도 별로 안나왔다.
너무 쉬워서 그런건가? -.-;;
열심히 찾았는데 알고보니 너무 허무함
VB랑 16진수를 10진수로 바꾸는게 똑같네
VB에서는 "&H"를 문자열에 붙이면 되는데
delphi에서는 '$'만 문자열에 분이면 된다.


function HexToInt(sHex:String):Integer;
var
  i:Integer;
  sWork:String;

begin

  Result := 0;
  sWork := UpperCase(sHex);
  for i := 1 to Length(sWork) do 
  begin
   
// 16진수의 문자열인가 체크
     if (Ord(sWork[i]) in [0..47, 58..64, 71..255]) then
      begin
          Result := -1;
          Break;
      end;
  end;
  // 16진수 문자열을 정수형으로 변환
  if
(Result = 0) then Result := StrToInt('$' + sHex);
end;


10진수를 16진수로 바꾸는 것은 간단하게 한 함수로 끝난다.
intToHex

Posted by 띠리
VB에서 호출한 DLL 함수에 넘긴 파라미터의 값이 DLL 함수안에서 바뀌어진 것이
VB에서 넘긴 변수에 적용되게 하려할때, DLL 함수의 Declare에서
인수앞에 반드시 ByRef가 아니라 ByVal이 와야한다.

# VB소스


Declare Function ByRefTest Lib "RefData.dll" (ByVal sData As String) As Integer




# C소스

extern "C" int PASCAL EXPORT ByRefTest (char* pszData)

{

    sprintf(pszData, "DLL TEST");


    return 0;

}









 

Posted by 띠리
◆ VB에서  DLL참조


Option Explicit On


Module mdlMain


    Declare Function APlusB Lib "aigo.dll" (ByVal csLog As String) As Integer


    Public Function dllTest(ByVal nA As String, ByVal nB As String) As Integer


        dllTest = APlusB(nA , nB )


    End Function


End Module



◆ C의 간단 DLL


// aigo.cpp

#include "stdafx.h"

#include "aigo.h"


int WINAPI APlusB(int nA, int nB)
{

    return nA + nB;

}



// aigo.h

#pragma once


#ifndef __AFXWIN_H__

    #error "PCH에 대해 이 파일을 포함하기 전에 'stdafx.h'를 포함합니다."

#endif


#ifndef __AIGO__

#define __AIGO__

    int WINAPI APlusB(int nA, int nB);

#endif




; dLog.def : DLL에 대한 모듈 매개 변수를 정의합니다.


LIBRARY      "aigo"


EXPORTS

    ; 명시적 내보내기를 여기에 사용할 수 있습니다.

    APlusB



C에서 만든 DLL을 VB의 실행 파일이 있는 곳에 두고 실행을 한다.




Posted by 띠리

비주얼베이직에서 MySQL쓰기 초간단 예제
이 소스를 돌리기위해서는 사전에 DSN을 설정해야된다.

DSN설정은 밑의 링크를 참조할 것
http://wwwi.tistory.com/74  MySQL ODBC설정하기

ADO를 쓰기위해서는 프로젝트에서 참조추가를 선택하여 COM 탭에서
Microsoft ActiveX Data Object 2.8 Library를 더블클릭으로 선택해야 된다.

밑의 소스는 테이블을 추가하고 데이터 추가 삭제 변경에 대한 예제이다.

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim AdoCn As ADODB.Connection

        Dim AdoRs As ADODB.Recordset

        Dim fldWork As ADODB.Field

        Dim sSql As String

        Dim sWork As String


        ' MySQL에 접속 [MySQL ODBC 3.51 Driver]

        AdoCn = New ADODB.Connection

        AdoCn.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};" _

                      & "SERVER = localhost;" _

                      & "DATABASE = memo;" _

                      & "UID = muser; PWD = pass; OPTION = 3"


        ' Database open

        AdoCn.Open()


        ' 테이블 만들기

        sSql = "create table tmemo ( "

        sSql = sSql & " memoID int8, "

        sSql = sSql & " fuser char(20), "

        sSql = sSql & " fmemo char(255) "

        sSql = sSql & " ) type = InnoDB; "


        AdoCn.Execute(sSql)


        ' 데이터 추가

        sSql = "INSERT INTO tmemo(memoID, fuser, fmemo) values(1,'김기사','5시까지와~')"

        AdoCn.Execute(sSql)

        sSql = "INSERT INTO tmemo(memoID, fuser, fmemo) values(2,'이사감','나 낙하산')"

        AdoCn.Execute(sSql)

        sSql = "INSERT INTO tmemo(memoID, fuser, fmemo) values(3,'박장난','말장난하냐')"

        AdoCn.Execute(sSql)


        AdoRs = New ADODB.Recordset

        AdoRs.CursorLocation = ADODB.CursorLocationEnum.adUseServer


        ' 레코드셋 설정

        AdoRs.Open("SELECT * FROM tmemo", AdoCn)


        Debug.Print("tmemo 테이블의 레코드수 :" & AdoRs.RecordCount)


        AdoRs.MoveFirst()


        sWork = ""


        ' tmemo 테이블의 필드명 출력

        For Each fldWork In AdoRs.Fields

            sWork = sWork & fldWork.Name & vbTab

        Next

        Debug.Print(sWork)


        ' tmemo 테이블의 필드 데이터 출력

        Do Until AdoRs.EOF


            sWork = ""

            For Each fldWork In AdoRs.Fields

                sWork = sWork & fldWork.Value & vbTab

            Next

            Debug.Print(sWork)


            AdoRs.MoveNext()

        Loop


        AdoRs.Close()


        ' 레코드셋 설정

        AdoRs.Open("select * from tmemo", AdoCn, _

                    ADODB.CursorTypeEnum.adOpenDynamic, _

                    ADODB.LockTypeEnum.adLockOptimistic)


        ' 데이터 추가

        AdoRs.AddNew()

        AdoRs.Fields(0).Value = 4

        AdoRs.Fields(1).Value = "최저가"

        AdoRs.Fields(2).Value = "어디가 제일싸?"

        AdoRs.Update()


        AdoRs.AddNew()

        AdoRs.Fields(0).Value = 5

        AdoRs.Fields(1).Value = "지천명"

        AdoRs.Fields(2).Value = "일신우일신"

        AdoRs.Update()


        AdoRs.Close()



        ' 레코드셋 설정

        AdoRs.Open("select * from tmemo where memoID = 3", AdoCn, _

                    ADODB.CursorTypeEnum.adOpenDynamic, _

                    ADODB.LockTypeEnum.adLockOptimistic)


        ' 데이터 변경

        AdoRs.Fields(1).Value = "박농담"

        AdoRs.Fields(2).Value = "농담만하니?"

        AdoRs.Update()

        AdoRs.Close()



        ' 레코드셋 설정

        AdoRs.Open("select * from tmemo where memoID = 5", AdoCn, _

                    ADODB.CursorTypeEnum.adOpenDynamic, _

                    ADODB.LockTypeEnum.adLockOptimistic)


        ' 데이터 삭제

        AdoRs.Delete()

        AdoRs.Close()



        ' 레코드셋 설정

        AdoRs.Open("SELECT * FROM tmemo", AdoCn)


        Debug.Print("tmemo 테이블의 레코드수 :" & AdoRs.RecordCount)


        AdoRs.MoveFirst()


        sWork = ""


        ' tmemo 테이블의 필드명 출력

        For Each fldWork In AdoRs.Fields

            sWork = sWork & fldWork.Name & vbTab

        Next

        Debug.Print(sWork)


        ' tmemo 테이블의 필드 데이터 출력

        Do Until AdoRs.EOF


            sWork = ""

            For Each fldWork In AdoRs.Fields

                sWork = sWork & fldWork.Value & vbTab

            Next

            Debug.Print(sWork)


            AdoRs.MoveNext()

        Loop


        AdoRs.Close()


        AdoCn.Close()


    End Sub




프로그램을 돌리면 아래와 같은 결과가 나온다.
레코드수를 제대로 못가져온다. -.-;; 왜그런거지?

tmemo 테이블의 레코드수 :-1
memoID fuser fmemo
1 김기사 5시까지와~
2 이사감 나 낙하산
3 박장난 말장난하냐
tmemo 테이블의 레코드수 :-1
memoID fuser fmemo
1 김기사 5시까지와~
2 이사감 나 낙하산
3 박농담 농담만하니?
4 최저가 어디가 제일싸?
Posted by 띠리
나는 VB를 먼저해서 그런지 C의 포인터를 이해하는데 시간이 많이 걸렸던 것같다.
머리가 안좋아서 그런지 포인터를 설명을 들어도 책을 읽어도 이해가 오는데 시간이 많이 걸렸다.
지금도 남에게 포인터를 설명하라고 그러면 그리 속시원하게 알려주지는 못하는 것같다.

포인터의 설명을 들어도 왜 포인터를 써야하는지에 대해서 이해를 특히 못했던 것같다.
VB에서 프로그램을 짜다보면 종종 인수를 ByRef로 넘길때가 있다.
ByRef가 이해가 간다면 그나마 포인터를 조금이나마 이해하기 쉬울 것같다.
포인터에 대한 자세한 설명은 이곳이 아니고라도 자세하게 써있는 곳이 많이 있으니까
여기에서는 VB의 ByVal, ByRef의 예제와 VC에서의 CString을 인수로 넘길때
포인터를 쓰고 안쓰고에 따라 어떻게 달라지는가에 대한 예제만을 올리고자 한다.
포인터를 ByRef와 비슷하게 동작되어진다.

우선 포인터가 이해가 안가면 우선 이렇게 움직이는구나하고 우선은 넘겨보는 것도
좋은 것같다. 하기야 사람에 따라서 안풀리는 것을 꼭 풀고 넘어가야하는 사람과
풀수있는 것을 먼저 풀고나가느냐는 사람들의 성향이니까 어느것이 좋고 나쁜지는 모르겠다.
나는 어느 쪽인가하면 풀리는 것을 먼저 푸는 편이여서 처음에는 이렇게하면 돌아가는구나하고
포인터를 그리 이해하지 못하고 쓴 적이 있는 것같다.
(어쩜 지금도 제대로 이해 못하고 있으려나... -.-;;;)

◆ VB의 ByVal인수와 ByRef인수

    ' ByVal : 호출된 프로시저나 속성은 호출 코드에서 내부 인수로 사용하는

    ' 변수의 값을 변경할 수 없도록 하는 방식으로 인수가 전달되도록 지정합니다.

    Private Sub subByVal(ByVal sByVal As String)


        sByVal = "ByVal data"


    End Sub



    ' ByRef : 호출된 프로시저가 호출 코드에서 내부 인수로 사용하는

    ' 변수의 값을 변경할 수 있도록 하는 방식으로 인수가 전달되도록 지정합니다.

    Private Sub subByRef(ByRef sByRef As String)


        sByRef = "ByRef data"


    End Sub



    Private Sub subParamTest()


        Dim sParam As String


        sParam = "Parameter"


        subByVal(sParam)


        Call MsgBox("인수가 ByVal 일때 :" & vbCrLf & vbCrLf & _

                    "호출된 함수에서 넘겨진 인수를 바꾸어도 " & vbCrLf & _

                    "호출한 함수에서 인수값이 변하지않음 " & vbCrLf & _

                    "-> " & sParam)


        subByRef(sParam)


        Call MsgBox("인수가 ByRef 일때 :" & vbCrLf & vbCrLf & _

                    "호출된 함수에서 넘겨진 인수를 바꾸면 " & vbCrLf & _

                    "호출한 함수에서 인수값이 변함 " & vbCrLf & _

                    "-> " & sParam)

    End Sub



End Class






◆ VC의 일반 인수와 포인터 인수

void subByRef(CString *pcsMunja)

{

    *pcsMunja = "ByRef data";

}


void subByVal(CString csMunja)

{

    csMunja = "ByVal data";

}


void subParamTest()

{

    CString    csTest = "Parameter";



    subByVal(csTest);


    AfxMessageBox("인수를 그냥 넘겼을때:\n\n"

                  "호출된 함수에서 넘겨진 인수를 바꾸어도\"

                  "호출한 함수에서 인수값이 변하지않음\"

                  "-> " + csTest);


    subByRef(&csTest);


    AfxMessageBox("인수를 포인터로 넘겼을때\\n"

                  "호출된 함수에서 넘겨진 인수를 바꾸면\"

                  "호출한 함수에서 인수값이 변함\"

                  "-> " + csTest);

}







Posted by 띠리
BLOG main image
프로그래밍 공부하면서 써가는 개인 노트 (따라서 여기에 씌여있는 소스의 신빙성을 보장 못함 -.-;;) 이 블로그 보면서 틀린 점이 있으면 꼬옥 알려주세요. by 띠리

공지사항

카테고리

분류 전체보기 (323)
Win32 SDK 초보 (27)
통신관련 (11)
MFC TIP (20)
C/C++ TIP (10)
개발기타 (10)
링크 (2)
견물생심 (24)
이것저것 (8)
용어메모 (3)
데이터베이스 (32)
비주얼 베이직 (10)
하드웨어 (3)
C# (42)
Xcode (3)
델파이 (82)
홈페이지 (5)
MindStorm (0)
낙서 (5)
스크래치 (0)
기타 (6)
아두이노 (1)
라즈베리파이 (2)
안드로이드 (6)
파이썬 (0)
WEB (2)
Total : 987,325
Today : 403 Yesterday : 409