[2013-07-01] 최근 버전에서는 TMutex 를 이용하여 간단하게 할 수 있다.

#include <System.SyncObjs.hpp>

SECURITY_ATTRIBUTES SecAttr;

char SecDesc[[SECURITY_DESCRIPTOR_MIN_LENGTH];

SecAttr.nLength = sizeof(SecAttr);

SecAttr.bInheritHandle = FALSE;

SecAttr.lpSecurityDescriptor = &SecDesc;

::InitializaSecurityDescriptor(SecAttr.lpSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION);

::SetSecurityDescriptorDacl(SecAttr.lpSecurityDescriptor, TRUE, 0, FALSE);

try {

    TMutex *pMutex = new TMutex(&SecAttr, true, AMutexName, false);

} catch (...) {

    return 0;
}

if (pMutex->WaitFor(100) != wrSignaled)

    return 0;

// TODO: Something

pMutex->Release();

delete pMutex;



'Windows > RAD Studio' 카테고리의 다른 글

[JS] ScrollObject  (0) 2007.09.21
[DEL] Mutex 를 이용한 실행중복 방지  (0) 2007.09.21
[CB] KeyPad Virtual Key Value  (0) 2007.06.09
[DEL] Deprecated Lists  (0) 2007.06.02
[CB] 문자열 변환/검증  (0) 2007.05.30
TEdit 에서 확인된 내용이다.
OnKeyPress 의 Key 값에서 숫자키와 KeyPad 의 숫자와 같은 '숫자 값' 이 전달이 된다.
이걸 믿고 코딩을 했다가 며칠을 헤맸다.

OnKeyUp 의 Key 값. 즉, Virtual Key 값은 다른 것이다.
KeyUp 이벤트에서 if 문으로 int 값으로 범위를 정해 처리를 하게 하였더니
KeyPad 의 숫자키로는 처리가 안된다.
결국 다음 코드로 키 값이 다른걸 알고 처리하였다.

void __fastcall TForm1::Edit1KeyUp( TObject *Sender, TShiftState &State, WORD &Key )
{
    Memo1->Lines->Add( IntToStr( Key ) );
}

MakeObjectInstance -> Classes.MakeObjectInstance
FreeObjectInstance -> Classes.FreeObjectInstance

기존 integer 값 검증 함수다.
bool __fastcall IsInteger( const AnsiString &Value )
{
    try
    {
        StrToInt( Value );
        return true;
    }
    catch ( ... )
    {
        return false;
    }
}
사용예
AnsiString Value = "10000";
int VInt = 0;
if ( IsInteger( Value ) == true )
{
    VInt = StrToInt( Value );
}
숫자 변환함수를 호출하고 true 를 리턴한다.
에러가 발생하면 false 를 리턴한다.
이 방법은 exception 발생에 의한 방법이라 디버깅이 귀찮아 지게 된다.

다음은 검증/변환을 해주는 각종 VCL 함수다.
extern PACKAGE bool __fastcall TryStrToFloat(const AnsiString S, Extended &Value);
extern PACKAGE bool __fastcall TryStrToFloat(const AnsiString S, double &Value);
extern PACKAGE bool __fastcall TryStrToFloat(const AnsiString S, float &Value);
extern PACKAGE bool __fastcall TryStrToInt(const AnsiString S, int &Value);
extern PACKAGE bool __fastcall TryStrToDateTime(const AnsiString S, System::TDateTime &Value);
같은 이름 유형으로 함수가 더 있다.
이 함수들은 서로 다른 델파이 함수를 포장해 논 것이다.
이 외에서 StrToIntDef 등의 변환 오류시 기본값으로 반환하는 함수도 있다.

사용예
AnsiString Value = "1000";
int VInt = 0;
if ( TryStrToInt( Value, VInt ) == true )
{
}

추출값 : 금시세

//---------------------------------------------------------------------------
// 인터페이스를 사용하기 위한 헤더파일
#include <mshtml.h>
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    Caption = "시세추출중";

    // 웹 페이지 로드
    CppWebBrowser1->Navigate( L"사이트주소은폐ㅋㅋ" );
}
//---------------------------------------------------------------------------
AnsiString __fastcall ExtractMoney( AnsiString Value )
{
    // 문자열 파싱

    // 시세 문자열에서 금액 숫자값만 추출, [xx시세00,000원등락수치]
    int begin = Value.Pos( "세" ) + 2;

    // 시세 숫자에서 Comma, Space 제거
    return StringReplace(
        // '세' 와 '원' 사이의 Money 문자열 추출
        Value.SubString( begin, Value.Pos( "원" ) - begin ),
        ",",
        "",
        TReplaceFlags() << rfReplaceAll
    ).Trim();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender,
      LPDISPATCH pDisp, Variant *URL)
{
    WideString Value;

    // CppWebBrowser 의 Document 참조
    IDispatch *Document = CppWebBrowser1->Document;
    IHTMLElement *HTMLElement;
    IHTMLDocument2 *pHTMLDocument;

    // CppWebBrowser->Document 소스 가져오기, Text 형식

    // Document 에서 IHTMLDocument2 인터페이스 가져오기
    if ( Document->QueryInterface( IID_IHTMLDocument2, ( PVOID* )( &pHTMLDocument ) ) == S_OK )
    {
        // IHTMLDocument2 에서 Body 부를 IHTMLElement 인터페이스로 가져오기
        if ( pHTMLDocument->get_body( &HTMLElement ) == S_OK )
        {
            // IHTMLElement (Body) 의 Text 값 추출
            HTMLElement->get_innerText( &Value );

            // IHTMLElement 인터페이스 해제
            HTMLElement->Release();
        }
        // IHTMLDocument2 인터페이스 해제
        pHTMLDocument->Release();
    }

    // TMemo 를 이용하여 시세부분 TStrings 변환, 라인별로 24K,18K,14K 순
    Memo1->Lines->Clear();

    // '순금시세' 부터 '순금매입가' 까지가 금시세다.
    int begin = Value.Pos( "순금시세" );
    Memo1->Lines->Add( Value.SubString( begin, Value.Pos( "순금매입가" ) - begin ) );

    // 각 시세 값을 TEdit 에 대입
    Edit1->Text = ExtractMoney( Memo1->Lines->Strings[0] );
    Edit2->Text = ExtractMoney( Memo1->Lines->Strings[1] );
    Edit3->Text = ExtractMoney( Memo1->Lines->Strings[2] );

    Caption = "시세추출완료";
}
//---------------------------------------------------------------------------

'Windows > RAD Studio' 카테고리의 다른 글

[CB] KeyPad Virtual Key Value  (0) 2007.06.09
[DEL] Deprecated Lists  (0) 2007.06.02
[CB] 문자열 변환/검증  (0) 2007.05.30
[CB] TQuickRep 출력순서  (1) 2007.05.13
[CB] 쓰레드끼리는 마구 침범할 수 없다.  (0) 2007.04.15

퀵리포트에서 다른 컨트롤의 OnPrint 에서 QRImage 의 그림을 불러오면
다음번 출력에 그 내용이 적용이되고,
Detail 에 컨트롤이 올려진 순서대로 컨트롤의 출력이 이루어진다.
즉 어떤 컨트롤의 값에 의해 그림을 출력하고자 하면 그 컨트롤을 먼저 올려놓고,
QRImage 를 올려놓던가 아니면 올려진 QRImage 를 잘라내기 후 다시 붙여넣기 하여,
출력 순서를 뒤로 미뤄야한다.
그렇지 않으면 그림이 한 Detail 씩 밀려서 출력이 된다.


아래는 실제 사례다.

퀵리포트를 이용한 제품목록 출력중이다.
TQRImage 1개, TQRDBText 1개 를 올려놓고
TQRDBText 의 OnPrint 를 작성한다.

void __fastcall TFrmPrintCataList::QRDBText1Print(TObject *sender,
      AnsiString &Value)
{
    SET_IMAGE( QRImage1, Value.Trim() )
}

SET_IMAGE 는 QRImage1->Picture->LoadFromFile( FilePath + Value + ".JPG" ) 의 처리를
오류 처리화 함께 한 매크로 함수다.

위의 코드는 QRDBText 를 출력할 때 그 값에 해당하는 이미지를 불러와 출력하는 것이다.

잘 동작을 하여 모든 출력 양식에 적용을 하였다.
갑자기 하나씩 밀려 출력되는 것이다.
Prepare() 함수를 적용하여 그런가 생각해 봤지만 갑자기 드는 의문에
QRImage1 을 잘라냈다가 다시 붙여넣었다.
그랬더니 잘 출력되는 것이다.

기억하자!

어플리케이션에서 쓰레드를 하나 생성을 했다.
이 쓰레드는 메인폼에 접근을 하는 작업을 한다.

이럴 경우, 보통의 코드처럼 작성할 경우 에러를 유발한다.
런타임에러이고, 랜덤적으로 발생하여 알기 어렵다.

이때에는 Synchronize 함수를 이용하여 다른 쓰레드(메인 쓰레드)에 접근한다.
이는 쓰레드 자신이 필요한 작업이지만, 다른 쓰레드의 역할은 그 쓰레드가 하게 하는 함수이다.

'Windows > RAD Studio' 카테고리의 다른 글

[CB] KeyPad Virtual Key Value  (0) 2007.06.09
[DEL] Deprecated Lists  (0) 2007.06.02
[CB] 문자열 변환/검증  (0) 2007.05.30
[CB] TCppWebBrowser 를 이용한 웹페이지 값 추출  (0) 2007.05.25
[CB] TQuickRep 출력순서  (1) 2007.05.13

+ Recent posts