About 다이얼로그 만드는 방법
1. GetFileVersionInfoSize 이용해서 버젼 정보 크기 얻는다.

2. 버젼 정보를 저장할 메모리를 할당한 후에 버젼 정보를 얻는다.
   MemHandle = GlobalAlloc(GMEM_MOVEABLE, VerSize);
   MemPtr = GlobalLock(MemHandle);
   GetFileVersionInfo(Path.c_str(), VerInfo, VerSize, MemPtr);

3. VerQueryValue(MemPtr, "\VarFileInfo\Translation", &BufferPtr,&BufferLength); 함수를 이용해서 각 정보를 얻는다.

-실제 소스-
코드:
    struct TransArray
    {
       WORD LanguageID, CharacterSet;
    };

    DWORD VerInfo, VerSize;  
    HANDLE MemHandle;
    LPVOID MemPtr, BufferPtr;
    UINT BufferLength;
    TransArray *Array;
    char QueryBlock[40];

    // Get the product name and version from the
    // applications version information.
    String Path(Application->ExeName); //프로그램 패스 얻어오기
    VerSize = GetFileVersionInfoSize(Path.c_str(), &VerInfo);//버젼 정보 크기 얻어오기
    if (VerSize > 0) {
        MemHandle = GlobalAlloc(GMEM_MOVEABLE, VerSize);
        MemPtr = GlobalLock(MemHandle);
        GetFileVersionInfo(Path.c_str(), VerInfo, VerSize, MemPtr);
        VerQueryValue(MemPtr, "\VarFileInfo\Translation", &BufferPtr,
                      &BufferLength);
        Array = (TransArray *)BufferPtr;

        // Get the product name.
        wsprintf(QueryBlock, "\StringFileInfo\%04x%04x\ProductName",
                 Array[0].LanguageID, Array[0].CharacterSet);
        VerQueryValue(MemPtr, QueryBlock, &BufferPtr, &BufferLength);
        // Set the product name caption.
        ProductName->Caption = (char *)BufferPtr;

        // Get the product version.
        wsprintf(QueryBlock, "\StringFileInfo\%04x%04x\ProductVersion",
                 Array[0].LanguageID, Array[0].CharacterSet);
        VerQueryValue(MemPtr, QueryBlock, &BufferPtr, &BufferLength);
        // Set the version caption.
        Version->Caption = (char *)BufferPtr;

        GlobalUnlock(MemHandle);
        GlobalFree(MemHandle);
    } else {
        ProductName->Caption = "";
        Version->Caption = "";
    }

    Comments->Caption = "Thank you for trying this fabulous product.n"
                        "We hope that you have enjoyed using it.";

'Computer > C++' 카테고리의 다른 글

BCB 6에 Indy 10 설치 하기 관련...  (0) 2005.11.23
BCB - StrToHex 함수  (0) 2005.11.06
BCB 6에 DSPack 2.3.4 설치  (0) 2005.09.10
카일릭스 설치 및 일반적인 문제점  (0) 2005.07.10
void pointer 샘플  (0) 2005.07.10
TStingList이용해서 텍스트 파일 파싱하기  (0) 2003.11.16
Effective C++ Second Edition  (0) 2003.10.13
Child control 관리  (0) 2003.09.15
C++ 사이트 모음  (0) 2003.04.08
C와 C++의 name mangling  (0) 2003.03.04
Posted by Gu Youn
,
1. 개념 : TStringList의 Delimiter / DelimitedText를 이용

2. 소스
  TStringList* list;

  try
  {
    list = new TStringList;
    list->LoadFromFile("test1.mfc");//파일 이름

    int lines = list->Count;
    Memo1->Lines->Add("lines:"+String(lines));

    for(int i=0; i<lines; i++)
    {
      TStringList *temp = new TStringList;
      temp->Delimiter = 't';
      temp->DelimitedText = list->Strings[i];

      for(int j=0; j < temp->Count; j++)
      {
        //Memo1->Lines->Add(String(i)+","+String(j)+" : "+temp->Strings[j]);
      }
      delete temp;
    }

  }
  __finally
  {
    delete list;
  }

'Computer > C++' 카테고리의 다른 글

BCB - StrToHex 함수  (0) 2005.11.06
BCB 6에 DSPack 2.3.4 설치  (0) 2005.09.10
카일릭스 설치 및 일반적인 문제점  (0) 2005.07.10
void pointer 샘플  (0) 2005.07.10
파일의 버젼 정보 얻기  (0) 2003.12.14
Effective C++ Second Edition  (0) 2003.10.13
Child control 관리  (0) 2003.09.15
C++ 사이트 모음  (0) 2003.04.08
C와 C++의 name mangling  (0) 2003.03.04
서버 이름을 리스트 박스에 출력하는 샘플(gethostbyaddr() 함수 이용)  (0) 2002.07.12
Posted by Gu Youn
,
사용자 삽입 이미지








1. 제목 / 한국어판 제목:  
         Effective C++
2. 저자/역자:  
         Scott Meyers
3. 출판년도/출판사/한국어판 출판사:
         2001 / Addision Wesely
4. 분야 :
         플랫폼 독립 프로그래밍 / ANSI C++
-----------------------------------------------------------------
작년에 읽다가 다 못봐서 9월 부터 지하철에서 조금씩 읽기 시작함
읽는 것보다는 실제로 코딩을 해봐야 이해가 많이 될거 같음. 나중에 한번 더 읽어봐야 될거 같음.

2003.10.13
Item 11
  클래스 member data로 pointer 등을 사용할 때는 copy Constructor & assignment operator를 정의해야 한다.
2003.10.14
Item 13
  ㄱ. 생성자 안에서 초기화 하는 것보다는 initialization list에서 멤버 변수 초기화 하는 것이 효율적임
  ㄴ. const, reference 형은 initialization list에서 초기화 한다.
  ㄷ. member data(int, double...) 형으로 많은 변수를 초기화 하는 경우에는 생성자 안에서 초기화 한다.
  ㄹ. initialization list에서 초기화 순서는 리스트 상의 순서가 아니라 클래스에서 선언된 순서에 따른다.

2003.10.15
Item 14
  ㄱ. 클래스에 적어도 하나의 virtual function 이 존재하면 virtual destructor를 선언한다.
  ㄴ. vptr(virtual table pointer) / vtbl(virtual table)
  ㄷ. virtual function을 갖는 오브젝트는 Fortran / C에 인자로 전달 할 수 없다.

2003.10.27
Item 15
  operator= 에 대한 정리

Item16
  operator= 구현 방법
  ㄱ. base class의 private member 경우
  ㄴ. default assignment function을 직접 호출 할 수 없는 컴파일러 경우
  ㄷ. derived class에서 copy constructor 구현시 base class의 copy constructor가 호출되게 해야한다.

2003.11.03
Item17
Posted by Gu Youn
,

Child control 관리

Computer/C++ 2003. 9. 15. 10:59
개념 : Form과 같은 parent control에는 ControlCount, Controls 프로퍼티가 있으며 이것을 이용해서 child control을 관리 할 수 있다.

controls : parent가 Form인 것들의 리스트
components : owner가 Form인 것들의 리스트

ClassName, ClassNameIs 함수를 이용하면 오브젝트의 타입 스트링을 얻을 수 있음.

소스 :
1. Controls 사용

  //form 에 있는 control 개수 구하기
  int max = StrToInt(Form1->ControlCount);

  //control 개수 만큼 루프 돌면서 각 컨트롤의 tag 값 비교 및 초기화
  for (int i=0;i<max;i++)
  {
    TControl *ChildControl = Form1->Controls[i];
    int tag = ChildControl->Tag;
    if(tag == 1)
    {
      (dynamic_cast<TLabel*>(ChildControl))->Caption = "a";
    }
    else
    {
      (dynamic_cast<TLabel*>(ChildControl))->Caption = "b";
    }
  }

2. Component 사용
  int max = Form1->ComponentCount;
  TComponent *ChildComponent;

  for (int i=0; i<max ; i++)
  {
    ChildComponent = Form1->Components[i];
    String ClassName = String(ChildComponent->ClassName());
  }
Posted by Gu Youn
,
1. C++ Tutorial
www.cs.uregina.ca/dept/manuals/C++/tutorial.html
Online documentation which accompanies Coronado Enterprises C++ Tutor version 2.2.

 
2. C++ Tutorials: Learn C Language Today
www.gustavo.net/programming/c.shtml
Contains C, C++, and OOP tutorials, software and programming tools, routines and source code.

 
3. DevX -- C++ Zone
www.cplus-zone.com
Specialized part of the Development Exchange containing C++ links, FAQs, discussions, news, and tutorials.

 
4. From the Ground Up: A Guide to C++
http://library.advanced.org/3074
Personalized C++ tutorial in HTML format specifically created for users with knowledge of the Pascal programming language.

 
5. MSDN Online Voices: Deep C++
http://msdn.microsoft.com/voices/deep.asp
Monthly C++ column from Microsoft.

 
6. "Thinking in C++ 2nd Edition" by Bruce Eckel
www.mindview.net/ThinkingInCPP2e.html
Free electronic version of Bruce Eckel's book, "Thinking in C++ 2nd Edition", along with source code.

7. C/C++ Users Journal Web Site
www.cuj.com
This monthly magazine is available in-print, and several articles each month are made available on-line.


8. Dr. Dobb's Journal C/C++ Discussion Forum
www.ddj.com/topics/cpp
This site has reasonable activity, with roughly 1 message posted per day.

 
9. PrestoNet C/C++ Discussion Group
www.prestwood.com/forums/c
This site hosts several forums, one of them C++Builder specific. It is fairly active, with a message posted every two or three days.

 
10. Programmer's Archive C++ Discussion Board
http://pa.pulze.com/cppdir/wwwboard
One of many discussion lists created by The Programmer's Archive.

 
11. The Bits C++Builder Discussion List
www.topica.com/lists/cbuilder/subscribe
An extremely active C++Builder discussion list where initial discussions were held on the creation of the C++Builder Developer's Guide.
Posted by Gu Youn
,
C와 C++ name mangling 규칙이 다르므로 C++에서 C 함수를 사용하기 위해서는
아래처럼 extern "C" 를 붙여준다.

ex) extern "C" void cfunc(int);

함수가 여러개일 경우에는
extern "C"
{
   //함수들....
}
Posted by Gu Youn
,

폼에 리스트 박스 하나 추가하고 테스트한다.
gethostbyaddr의 타임아웃 문제는 고려하지 않았다.

WSAData wsadata;

  if(WSAStartup (MAKEWORD(1,1), &wsadata) != 0 )
  {
    ShowMessage("에러");
  }
 
  char ip[16];
  in_addr addr;
  hostent *host = 0;
  String errorcode;
   
  for(int i=0;i<255;i++)
  {

    sprintf(ip,"211.178.64.%d",i);
    addr.S_un.S_addr =  inet_addr(ip);
    host = gethostbyaddr ( (char *)(&addr.S_un.S_addr),        sizeof(addr.S_un.S_addr),        AF_INET);       

    int error = WSAGetLastError(); 


    switch(error)
    {
      case  WSANOTINITIALISED :
        errorcode = "WSANOTINITIALISED";
        break;
      case         WSAENETDOWN :
        errorcode = "WSAENETDOWN";
        break;
      case  WSAHOST_NOT_FOUND :
        errorcode = "WSAHOST_NOT_FOUND";
        break;
      case  WSATRY_AGAIN        :
        errorcode = "WSATRY_AGAIN";
        break;
      case  WSANO_RECOVERY  :
        errorcode = "WSANO_RECOVERY";
        break;
      case  WSANO_DATA :
        errorcode = "WSANO_DATA";
        break;
      case  WSAEINPROGRESS :
        errorcode = "WSAEINPROGRESS";
        break;
      case  WSAEAFNOSUPPORT :
        errorcode = "WSAEAFNOSUPPORT";
        break;
      case  WSAEFAULT        :
        errorcode = "WSAEFAULT";
        break;   
    }

    if(host != NULL)
      ListBox1->Items->Add( host->h_name); 
    else
    {
      ListBox1->Items->Add(errorcode); 
    }   
   
  }

  String msg  = "테스트가 끝났습니다.";
  ShowMessage(msg);

Posted by Gu Youn
,
1. 폼에 DataControls의 DBGrid를 폼에 놓고,그다음 Data Access의 DataSource를 폼에 추가한다.

2. ADO의 ADOConnection 과 ADODataSet을 추가한다.

3. ADOConnection의 ConnectionString을 생성한다.

4. ADODataSet의 connection 프로퍼티를 ADOConnection1로 하고 command text를 편집하고 Active프로퍼티를 true로 설정한다.

5. 그리고 DataSource1의 DataSet 프로퍼티를 ADODataSet1으로 한다.

6. F9를 누르면 그리드에 테이블의 내용이 나오는 프로그램이 실행될것이다.

참고) 프로그램 실행시에 디비 로그인 다이얼로그가 나오면 ADOConnection1의 LoginPrompt 속성을 false로 설정한다.
Posted by Gu Youn
,