개념 : TWebBrowser에서 Document 인터페이스를 얻어서 body 부분에 문자를 추가할 수 있다.

var
  HTMLDocument : IHTMLDocument2;
  WebBrowser1  : TWebBrowser


  HTMLDocument := WebBrowser1.Document as IHTMLDocument2;
  HTMLDocument.body.insertAdjacentHTML('BeforeEnd','안녕하세요...<br>');

//참고 게시물
http://www.delmadang.com/cwb-bin/CrazyWWWBoard.exe?db=dmdlec&mode=read&num=1471&page=1&backdepth=1

/////////////////////////////////////////
//델마당 강좌 4000king님 작성 소스
procedure TFormMain.AddChatText(iRoomType:integer;sColor,sChatText:string);
var
sWhere:Olevariant;
sAddText:Olevariant;
begin
sWhere:='beforeEnd';
sAddText:='<font size=2 color='+'#'+sColor+'>'+sChatText+'</font><br>';

if iRoomType=rtChatRoom then begin
WebBrowserChat.OleObject.Document.Body.InsertAdjacentHTML(sWhere, sAddText);
WebBrowserChat.OleObject.Document.Body.scrollTop:=20000; // pixel
inc(ChatTextLineCount);
end else if iRoomType=rtDateRoom then begin
WebBrowserChatDate.OleObject.Document.Body.InsertAdjacentHTML(sWhere, sAddText);
WebBrowserChatDate.OleObject.Document.Body.scrollTop:=20000;
inc(ChatTextLineCount);
end;

if ChatTextLineCount >=1000 then begin
ClearWebbrowserChat(iRoomType);
ChatTextLineCount:=0;
end;
end;
Posted by Gu Youn
,
1. Building Secure Software : How to Avoid Security Problems the Right Way, Addison Wesely,2001

2. Writing Secure Code, Microsort Press, 2001

3. Hack Proofing Your Web Applications, Syngress 2001
Posted by Gu Youn
,
개념 : 1픽셀 점에 clRed(FF)를 그린후 그 픽셀의 데이터 값이 FF인지 FF0000인지 비교한다.
FF이면 BGR이고 FF0000이면 RGB이다.

소스 :
var
BMP : TBitmap;
P : PDWORD;
begin
BMP := TBitmap.Create;
BMP.PixelFormat := pf32bit;
BMP.Width := 1;
BMP.Height := 1;
BMP.Canvas.Pixels[0,0] := clRed;

P := BMP.ScanLine[0];
if P^ = $FF then
   //BGR 지원
else
   //RGB 지원
end;

BMP.Free;

end;
Posted by Gu Youn
,
자세한 사항은 오브젝트 파스칼 문서 참고
주의 : 가변타입을 위한 case에는 end;를 붙이지 않고 record끝에만 end;를 사용한다.
 
TMessageData = record
    case MessageType : integer of
      KOMAROO_MEMO :(MemoInfo : TMemoDataStruct);
  end;
Posted by Gu Youn
,
개념 : Move함수 이용해서 Char배열에 문자열 복사하기

소스 :
FMemo: PChar;
FMemoSize : integer;

TMemoDataStruct = packed record
    FSenderID: String[50];
    MemoContent : array[1..1024] of char;
  end;

  FillChar(memoinfo, sizeof(TMemoDataStruct), #0);
  memoinfo.FSenderID := FSenderID;
  Move(FMemo^,memoinfo.MemoContent,FMemoSize);
Posted by Gu Youn
,
1. 설명
WM_COPYDATA메시지를 이용해 다른 프로그램에 데이터를 전달한다.
단순 스트링 전달과 레코드 전달 예제로 구분했음

2. 소스

--단순 String 전달--

1. lParam에 사용할 데이터 레코드 타입
pCopyDataStruct = ^TCopyDataStruct;
 TCopyDataStruct = record
   dwData: DWORD;
   cbData: DWORD;
   lpData: Pointer;
 end;


2. lParam으로 전달된 데이터 읽기
strReceive := pChar(pCopyDataStruct(lParam)^.lpData);

3. 데이터 보내기
procedure TCommWndThread.SendData(AData: string);
var
  CopyData: TCopyDataStruct;
  nLen: integer;
begin
  nLen := Length(AData) + 1;
  AData := AData + #0;

  with CopyData do
  begin
    cbData := nLen;
    lpData := pChar(AData);
  end;

  SendMessage(FWnd, WM_COPYDATA, 0, LongInt(@CopyData));
end;

--레코드 전달--

1. 전달할 레코드 타입
  pMemoDataStruct = ^TMemoDataStruct;
 TMemoDataStruct = packed record
   FSenderID: String[50];
    FIP: String[20];
   FPort: String[10];
   MemoContent : array[1..1024] of char;
 end;

2. 데이터 보내기
var
 CopyData: TCopyDataStruct;
 nLen: integer;
 memoinfo : TMemoDataStruct;
begin
 FillChar(memoinfo, sizeof(TMemoDataStruct), #0);
 memoinfo.FSenderID := FSenderID;
 memoinfo.FIP := FIP;
 memoinfo.FPort := FPort;

 Move(FMemo^,memoinfo.MemoContent,FMemoSize);

 nLen := SizeOf(memoinfo);

 with CopyData do
 begin
   cbData := nLen;
   lpData := @memoinfo;
 end;
 SendMessage(wnd, WM_COPYDATA, LongInt(msgType), @CopyData);
end;

3. 데이터 받기
var
  memoinfo : TMemoDataStruct;
begin
   memoinfo :=  pMemoDataStruct( PCopyDataStruct(msg.LParam)^.lpData)^;
end;
Posted by Gu Youn
,
1. 설명
C++ 빌더에서는 메시지 맵을 이용하지만 델파이에서는 message라는 키 워드를 이용해서 프로시져를 선언한다.
WM_TEST 메시지가 발생하면 OnWmTest 프로시져가 호출된다.

2. 소스
const
 WM_TEST = WM_USER + 9999;

procedure OnWmTest(var Msg: TMessage); message WM_TEST;

procedure OnWmTest(var Msg: TMessage);
begin
 Application.MessageBox('WM_TEST','',MB_OK);
end;
Posted by Gu Youn
,
개념 : 프로그램 전역으로 뮤텍스를 생성해서 이후에 다시 뮤텍스를 생성하면 에러가 발생하는 것을 이용해서 프로그램을 한번만 실행되게 제어한다.

소스 :

어플리케이션의 메인 유닛에서 다음과 같이 작업한다.
windows유닛 추가

var
  Mutex : THandle;
begin

  Mutex := CreateMutex(nil, True, 'NoDuplicate');
  //GetLastError : 이미 이 프로그램의 뮤텍스가 존재하면 183 리턴
  if (Mutex <> 0 ) and (GetLastError = 0) then
  begin
    //프로그램 처음 시작되는 경우 코드
    Application.CreateForm(TSendMemoForm, SendMemoForm);
    Application.Run;
    if Mutex <> 0 then CloseHandle(Mutex);
  end
  else
  begin
    //이미 프로그램이 실행되있는데 다시 실행하는 경우.
    Application.MessageBox('프로그램이 이미 실행 중입니다.','경고',MB_OK);
  end;
Posted by Gu Youn
,