Q&A

  • COM 의 이벤트를 받고 싶습니다.
COM 개체의 이벤트를 받고 싶습니다. 다른 언어로 작성된 COM 이구요. VB 로 돌려본 결과

COM 에서는 이상 없었습니다. 이벤트 잘 발생시키고 VB 에서도 이벤트 잘 받아오더군요.

델파이가 처음이다 보니 어떤 방식으로 접근해야 할 지 잘 몰라서, 2가지 방법으로 시도해보았습니다.

어떤 방법이 맞는 것인지도 잘 모르겠고, 각각의 문제를 어떻게 해결해야 할 지도 잘 모르겠습니다.

답변부탁드립니다.

1. Import Type Library 에서 CreateUnit 을 클릭한다.

    이 방식으로 하니 _TLB 파일이 생성되더군요.
    그런데, 여기서 어떤 방식으로 COM 에서 발생되는 이벤트를 프로시져와 연결시켜줘야 할 지를
    모르겠습니다.

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    WeatherNotify1 : IWeatherNotify;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// 객체 생성하고 COM 에 값을 설정하여 내부적으로 이벤트 발생 시킨다.
procedure TForm1.Button1Click(Sender: TObject);
begin
  WeatherNotify1 := CoWeatherNotify_.Create;
  WeatherNotify1.WindSpeed := 1000;

end;

end.        

2. Import Type Library 에서 Install 을 클릭한다.

    콤포넌트 생성 되어서 폼위에 컨트롤 올렸습니다.
    컨트롤의 Properties 와 Events 를 살펴본 결과 Event 를 연결하는 곳이 있길래
    특정 이벤트를 OnWarning() 프로시져에 연결시켜줬습니다.
    그런데, 아무런 반응이 없습니다. 즉, 이벤트를 못 받는것 같습니다.

type
  TForm1 = class(TForm)
    WeatherNotify1: TWeatherNotify;
    Button1: TButton;
    procedure OnWarning(ASender: TObject; nWindSpeed: Integer);
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// 이벤트 받는 프로시져입니다.
procedure TForm1.OnWarning(ASender: TObject; nWindSpeed: Integer);
begin
  Application.MessageBox('WARNING','',MB_OKCANCEL)
end;

// 버튼 클릭하면 WeatherNotify 라는 COM 에게 값을 전달해주고 내부적으로 이벤트가 발생됩니다.
procedure TForm1.Button1Click(Sender: TObject);
begin
  WeatherNotify1.WindSpeed := 1000;
end;

end.

======================================================================
참고로 아래는 TLB 내용입니다.
======================================================================


unit WeatherNotify_TLB;

// ************************************************************************ //
// WARNING                                                                    
// -------                                                                    
// The types declared in this file were generated from data read from a      
// Type Library. If this type library is explicitly or indirectly (via        
// another type library referring to this type library) re-imported, or the  
// 'Refresh' command of the Type Library Editor activated while editing the  
// Type Library, the contents of this file will be regenerated and all        
// manual modifications will be lost.                                        
// ************************************************************************ //

// PASTLWTR : 1.2
// File generated on 2004-03-24 오후 4:38:33 from Type Library described below.

// ************************************************************************  //
// Type Lib: D:\Private Project\vbEventTest\WeatherNotify.tlb (1)
// LIBID: {A97AF36A-C1BD-37EA-93CB-F6FF3AFF1AEA}
// LCID: 0
// Helpfile:
// HelpString:
// DepndLst:
//   (1) v2.0 stdole, (C:\WINNT\system32\STDOLE2.TLB)
//   (2) v1.10 mscorlib, (C:\WINNT\Microsoft.NET\Framework\v1.1.4322\mscorlib.tlb)
// Errors:
//   Hint: TypeInfo 'WeatherNotify' changed to 'WeatherNotify_'
//   Error creating palette bitmap of (TWeatherNotify) : Server mscoree.dll contains no icons
// ************************************************************************ //
// *************************************************************************//
// NOTE:                                                                      
// Items guarded by $IFDEF_LIVE_SERVER_AT_DESIGN_TIME are used by properties  
// which return objects that may need to be explicitly created via a function
// call prior to any access via the property. These items have been disabled  
// in order to prevent accidental use from within the object inspector. You  
// may enable them by defining LIVE_SERVER_AT_DESIGN_TIME or by selectively  
// removing them from the $IFDEF blocks. However, such items must still be    
// programmatically created via a method of the appropriate CoClass before    
// they can be used.                                                          
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface

uses Windows, ActiveX, Classes, Graphics, mscorlib_TLB, OleServer, StdVCL, Variants;
  


// *********************************************************************//
// GUIDS declared in the TypeLibrary. Following prefixes are used:        
//   Type Libraries     : LIBID_xxxx                                      
//   CoClasses          : CLASS_xxxx                                      
//   DISPInterfaces     : DIID_xxxx                                      
//   Non-DISP interfaces: IID_xxxx                                        
// *********************************************************************//
const
  // TypeLibrary Major and minor versions
  WeatherNotifyMajorVersion = 1;
  WeatherNotifyMinorVersion = 0;

  LIBID_WeatherNotify: TGUID = '{A97AF36A-C1BD-37EA-93CB-F6FF3AFF1AEA}';

  DIID_ITornadoWatchEvents: TGUID = '{768DB129-3743-3742-9AD2-B00509A29762}';
  IID_IWeatherNotify: TGUID = '{EF89FAA1-C3C2-382B-B2DE-E68C658F2FD7}';
  CLASS_WeatherNotify_: TGUID = '{9BC7F75A-0291-3412-894A-0145BCEF40A4}';
  IID__TornadoWarningDelegate: TGUID = '{921D843D-8B16-32A2-8104-888CD0CD0730}';
  CLASS_TornadoWarningDelegate: TGUID = '{35E61CFA-2DDA-33C6-9FCB-EBEFC5301704}';
type

// *********************************************************************//
// Forward declaration of types defined in TypeLibrary                    
// *********************************************************************//
  ITornadoWatchEvents = dispinterface;
  IWeatherNotify = interface;
  IWeatherNotifyDisp = dispinterface;
  _TornadoWarningDelegate = interface;
  _TornadoWarningDelegateDisp = dispinterface;

// *********************************************************************//
// Declaration of CoClasses defined in Type Library                      
// (NOTE: Here we map each CoClass to its Default Interface)              
// *********************************************************************//
  WeatherNotify_ = IWeatherNotify;
  TornadoWarningDelegate = _TornadoWarningDelegate;


// *********************************************************************//
// DispIntf:  ITornadoWatchEvents
// Flags:     (4096) Dispatchable
// GUID:      {768DB129-3743-3742-9AD2-B00509A29762}
// *********************************************************************//
  ITornadoWatchEvents = dispinterface
    ['{768DB129-3743-3742-9AD2-B00509A29762}']
    procedure OnTornadoWarning(nWindSpeed: Integer); dispid 1610743808;
  end;

// *********************************************************************//
// Interface: IWeatherNotify
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {EF89FAA1-C3C2-382B-B2DE-E68C658F2FD7}
// *********************************************************************//
  IWeatherNotify = interface(IDispatch)
    ['{EF89FAA1-C3C2-382B-B2DE-E68C658F2FD7}']
    function Get_WindSpeed: Integer; safecall;
    procedure Set_WindSpeed(pRetVal: Integer); safecall;
    property WindSpeed: Integer read Get_WindSpeed write Set_WindSpeed;
  end;

// *********************************************************************//
// DispIntf:  IWeatherNotifyDisp
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {EF89FAA1-C3C2-382B-B2DE-E68C658F2FD7}
// *********************************************************************//
  IWeatherNotifyDisp = dispinterface
    ['{EF89FAA1-C3C2-382B-B2DE-E68C658F2FD7}']
    property WindSpeed: Integer dispid 1610743808;
  end;

// *********************************************************************//
// Interface: _TornadoWarningDelegate
// Flags:     (4432) Hidden Dual OleAutomation Dispatchable
// GUID:      {921D843D-8B16-32A2-8104-888CD0CD0730}
// *********************************************************************//
  _TornadoWarningDelegate = interface(IDispatch)
    ['{921D843D-8B16-32A2-8104-888CD0CD0730}']
  end;

// *********************************************************************//
// DispIntf:  _TornadoWarningDelegateDisp
// Flags:     (4432) Hidden Dual OleAutomation Dispatchable
// GUID:      {921D843D-8B16-32A2-8104-888CD0CD0730}
// *********************************************************************//
  _TornadoWarningDelegateDisp = dispinterface
    ['{921D843D-8B16-32A2-8104-888CD0CD0730}']
  end;

// *********************************************************************//
// The Class CoWeatherNotify_ provides a Create and CreateRemote method to          
// create instances of the default interface IWeatherNotify exposed by              
// the CoClass WeatherNotify_. The functions are intended to be used by            
// clients wishing to automate the CoClass objects exposed by the        
// server of this typelibrary.                                            
// *********************************************************************//
  CoWeatherNotify_ = class
    class function Create: IWeatherNotify;
    class function CreateRemote(const MachineName: string): IWeatherNotify;
  end;

  TWeatherNotifyOnTornadoWarning = procedure(ASender: TObject; nWindSpeed: Integer) of object;


// *********************************************************************//
// OLE Server Proxy class declaration
// Server Object    : TWeatherNotify
// Help String      :
// Default Interface: IWeatherNotify
// Def. Intf. DISP? : No
// Event   Interface: ITornadoWatchEvents
// TypeFlags        : (2) CanCreate
// *********************************************************************//
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
  TWeatherNotifyProperties= class;
{$ENDIF}
  TWeatherNotify = class(TOleServer)
  private
    FOnTornadoWarning: TWeatherNotifyOnTornadoWarning;
    FIntf:        IWeatherNotify;
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
    FProps:       TWeatherNotifyProperties;
    function      GetServerProperties: TWeatherNotifyProperties;
{$ENDIF}
    function      GetDefaultInterface: IWeatherNotify;
  protected
    procedure InitServerData; override;
    procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); override;
    function Get_WindSpeed: Integer;
    procedure Set_WindSpeed(pRetVal: Integer);
  public
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy; override;
    procedure Connect; override;
    procedure ConnectTo(svrIntf: IWeatherNotify);
    procedure Disconnect; override;
    property DefaultInterface: IWeatherNotify read GetDefaultInterface;
    property WindSpeed: Integer read Get_WindSpeed write Set_WindSpeed;
  published
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
    property Server: TWeatherNotifyProperties read GetServerProperties;
{$ENDIF}
    property OnTornadoWarning: TWeatherNotifyOnTornadoWarning read FOnTornadoWarning write FOnTornadoWarning;
  end;

{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
// *********************************************************************//
// OLE Server Properties Proxy Class
// Server Object    : TWeatherNotify
// (This object is used by the IDE's Property Inspector to allow editing
//  of the properties of this server)
// *********************************************************************//
TWeatherNotifyProperties = class(TPersistent)
  private
    FServer:    TWeatherNotify;
    function    GetDefaultInterface: IWeatherNotify;
    constructor Create(AServer: TWeatherNotify);
  protected
    function Get_WindSpeed: Integer;
    procedure Set_WindSpeed(pRetVal: Integer);
  public
    property DefaultInterface: IWeatherNotify read GetDefaultInterface;
  published
    property WindSpeed: Integer read Get_WindSpeed write Set_WindSpeed;
  end;
{$ENDIF}


// *********************************************************************//
// The Class CoTornadoWarningDelegate provides a Create and CreateRemote method to          
// create instances of the default interface _TornadoWarningDelegate exposed by              
// the CoClass TornadoWarningDelegate. The functions are intended to be used by            
// clients wishing to automate the CoClass objects exposed by the        
// server of this typelibrary.                                            
// *********************************************************************//
  CoTornadoWarningDelegate = class
    class function Create: _TornadoWarningDelegate;
    class function CreateRemote(const MachineName: string): _TornadoWarningDelegate;
  end;

procedure Register;

resourcestring
  dtlServerPage = 'Standard';

  dtlOcxPage = 'Standard';

implementation

uses ComObj;

class function CoWeatherNotify_.Create: IWeatherNotify;
begin
  Result := CreateComObject(CLASS_WeatherNotify_) as IWeatherNotify;
end;

class function CoWeatherNotify_.CreateRemote(const MachineName: string): IWeatherNotify;
begin
  Result := CreateRemoteComObject(MachineName, CLASS_WeatherNotify_) as IWeatherNotify;
end;

procedure TWeatherNotify.InitServerData;
const
  CServerData: TServerData = (
    ClassID:   '{9BC7F75A-0291-3412-894A-0145BCEF40A4}';
    IntfIID:   '{EF89FAA1-C3C2-382B-B2DE-E68C658F2FD7}';
    EventIID:  '{768DB129-3743-3742-9AD2-B00509A29762}';
    LicenseKey: nil;
    Version: 500);
begin
  ServerData := @CServerData;
end;

procedure TWeatherNotify.Connect;
var
  punk: IUnknown;
begin
  if FIntf = nil then
  begin
    punk := GetServer;
    ConnectEvents(punk);
    Fintf:= punk as IWeatherNotify;
  end;
end;

procedure TWeatherNotify.ConnectTo(svrIntf: IWeatherNotify);
begin
  Disconnect;
  FIntf := svrIntf;
  ConnectEvents(FIntf);
end;

procedure TWeatherNotify.DisConnect;
begin
  if Fintf <> nil then
  begin
    DisconnectEvents(FIntf);
    FIntf := nil;
  end;
end;

function TWeatherNotify.GetDefaultInterface: IWeatherNotify;
begin
  if FIntf = nil then
    Connect;
  Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation');
  Result := FIntf;
end;

constructor TWeatherNotify.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
  FProps := TWeatherNotifyProperties.Create(Self);
{$ENDIF}
end;

destructor TWeatherNotify.Destroy;
begin
{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
  FProps.Free;
{$ENDIF}
  inherited Destroy;
end;

{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
function TWeatherNotify.GetServerProperties: TWeatherNotifyProperties;
begin
  Result := FProps;
end;
{$ENDIF}

procedure TWeatherNotify.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
begin
  case DispID of
    -1: Exit;  // DISPID_UNKNOWN
(*{The DispID for this method is DISPID_UNKNOWN!?. }
    -1: if Assigned(FOnTornadoWarning) then
         FOnTornadoWarning(Self, Params[0] {Integer});
*)
  end; {case DispID}
end;

function TWeatherNotify.Get_WindSpeed: Integer;
begin
    Result := DefaultInterface.WindSpeed;
end;

procedure TWeatherNotify.Set_WindSpeed(pRetVal: Integer);
begin
  DefaultInterface.Set_WindSpeed(pRetVal);
end;

{$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
constructor TWeatherNotifyProperties.Create(AServer: TWeatherNotify);
begin
  inherited Create;
  FServer := AServer;
end;

function TWeatherNotifyProperties.GetDefaultInterface: IWeatherNotify;
begin
  Result := FServer.DefaultInterface;
end;

function TWeatherNotifyProperties.Get_WindSpeed: Integer;
begin
    Result := DefaultInterface.WindSpeed;
end;

procedure TWeatherNotifyProperties.Set_WindSpeed(pRetVal: Integer);
begin
  DefaultInterface.Set_WindSpeed(pRetVal);
end;

{$ENDIF}

class function CoTornadoWarningDelegate.Create: _TornadoWarningDelegate;
begin
  Result := CreateComObject(CLASS_TornadoWarningDelegate) as _TornadoWarningDelegate;
end;

class function CoTornadoWarningDelegate.CreateRemote(const MachineName: string): _TornadoWarningDelegate;
begin
  Result := CreateRemoteComObject(MachineName, CLASS_TornadoWarningDelegate) as _TornadoWarningDelegate;
end;

procedure Register;
begin
  RegisterComponents(dtlServerPage, [TWeatherNotify]);
end;

end.
3  COMMENTS
  • Profile
    권영길 2004.03.25 02:15
    http://www.techvanguards.com/products/eventsinkimp/
    여기서 제공되는 툴을 써서 이벤트관련 TLB를 생성하세요.
    TLB외에 이벤트관련 유닛이 하나 더 생깁니다.
    그것으로 이벤트를 정의하고 사용하시면 됩니다.
    즉 VB의 withevents와 같은 이벤트를 사용할 수 있습니다.


  • Profile
    박대원 2004.03.25 03:34
    답변 감사합니다.

    EventSinkImp 라는 프로그램을 설치하고 TypeLibrary 에서 Import 해줬습니다.

    그랬더니 이벤트 관련 TLB 생성은 되더군요.

    새 프로젝트 생성하고 관련 TLB 파일들을 프로젝트에 추가해줬습니다.

    그리고 바로 컴파일 했더니, 이벤트 과련 TLB 에서 에러가 나더군요

    방식이 틀려서 그런가요?

    제 환경을 설명드리자면

    Delphi7 이고, COM 은 .NET 으로 작성된 DLL 이며 이를 CCW 를 이용하여

    타입라이브러리 생성하고 레지스트리 등록하고 있습니다.

    다시 한번 답변 부탁 드립니다.
  • Profile
    권영길 2004.03.25 04:45
    제가 자세한건 살펴볼수 없으나 EventSinkImp에서 생성해주는 유닛을 사용할 경우 대략의 스토리는 이렇습니다.
    생성된 xxxEvents 유닛을 uses절에 포함합니다.
    그 안에 이벤트 관련 class을 create하고(A)
    또 CoXXX라고 하는 COM객체를 create합니다.(B)
    이벤트 함수를 선언하고(vb의 WithEvents와 비슷함)
    A.connect(B)를 하셔야 해당 이벤트에서 받을 수 있습니다.
    이렇게 쓰시면 될거 같은데 함 try해 보시죠.
    지금 님의 코드를 살필만큼 짬을 못내서 죄송...

    VB에서 된다고 하니까 .NET이 주는거랑은 상관없을거 같긴한데 .NET은 써보질 않았습니다.
    델파이의 COM에 관한 자료는 Delphi COM Programming에 잘 나와있습니다.


    • 김현철
    • 2004.03.26 05:44
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 너구리
      2004.03.26 18:51
      데이타셋의 구성을 이용해서 뿌려주니깐 TField쪽을 보셔야 할거 같은데요.. 저도 저런 현상을 본적...
    • 김현철
      2004.03.26 22:35
      db의 값이 0입니다.... TField의 자료형도 real타입으로 해 봤는데도... 결과가 같습니다.. 임시로 lable...
    • 류동완
    • 2004.03.26 05:13
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 장덕곤
      2004.03.26 07:39
      에스큐엘 익스플로러에서  잡혀져 있는 알리어스를 더블클릭하신후 sql 란에서 select * from...
    • 너구리
    • 2004.03.26 03:14
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2004.03.26 10:11
      안녕하세요. 최용일입니다. 둘 다 메소드를 재정의 할 때 쓰입니다. override는 똑같은형태의 메소드...
    • 너구리
      2004.03.26 18:41
      그렇다면 reintroduce를 쓰면 overroad는 안써도 되나요?? 헬프에 보니깐 overroad와 reintroduce를 같...
    • 최용일
      2004.03.26 20:33
      안녕하세요. 최용일입니다. override와 overload는 다른 것입니다. overload는 같은 이름을 가지며 ...
    • KDDG_BaSTaD
      2004.03.26 23:45
    • 왕초보
    • 2004.03.26 02:22
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 한주영
      2004.03.26 18:37
      멀티유저환경이라면 위험한 방법입니다. Select max(num) from.. 으로 들어가는 방법역시 위험합니다. ...
    • 너구리
      2004.03.26 02:43
      num 이란것이 PK라면 recordCount보다는 select max(num) from table_name 이렇게 구해 오셔야 될겁...
    • 왕초보
      2004.03.26 21:28
      답변감사합니다. max값 구해서 한다면.. 아래처럼 하니까 type mismatch 에러가 생기는데요.. 에구.. 코...
    • 돌아버려
      2004.03.26 02:39
      컬럼 type을 autoincrement로 설정하시면... 레코드 추가 할때 자동증가 되는걸로 기억하는데요.^^; ...
    • Galaxy
    • 2004.03.26 00:17
    • 3 COMMENTS
    • /
    • 0 LIKES
    • KDDG_Cali
      2004.03.26 00:47
      .DB 는 원래 database 화일 .PX 는 Primary key 화일 .MB 는 BLOB 필드가 있는경우에 생성되는 화일로 알...
    • 강동균
      2004.03.26 01:21
      전에 저도 궁금하여 김영대님께 여쭈었더니 다음과 같이 보내주시더군요. 몰라도 되구요.  참...
    • Galaxy
      2004.03.26 02:05
    • 메디컴
    • 2004.03.25 23:29
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김병윤
      2004.03.26 02:19
      아래 소스처럼 바꿔 보셨어요? procedure TForm1.SpeedButton2Click(Sender: TObject); var  &...
    • 너구리
      2004.03.25 22:04
      DB Class에서는 클래스만 구현해주고. 각각의 유닛에서 객체를 만들어서 사용해야 겠지요.. Form1 과...
    • 연기훈
      2004.03.25 22:19
      네.. 폼에서 클래서 정의 및 생성하고 사용합니다.. DB module에서 Query, DataSouce 컴포넌트를 공유...
    • 너구리
      2004.03.25 22:38
      DB Class파일하고 적용된 부분을 보여주세요.. 그리고 에러 메세지도....모여주시면 답을 드리는데 도움...
    • 왕초보
    • 2004.03.25 21:04
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 꿈의대화
      2004.03.25 23:46
      .
    • 왕초보
      2004.03.26 00:23
      답변 감사합니다. shellApi를 통해서 하면 될 것 같다고 하신 김문수라는 분이 계시네요. 근데 제가 워...
    • KDDG_Apine
      2004.03.26 05:59
      안녕하세요.. 제가 알고 있기로는 인디에 있는 mailClient로 smtp의 서버 주소 그리고 포트  ...
    • KDDG_BaSTaD
      2004.03.26 20:41
      ==> 안녕하세요 BaSTaD 입니다. 전송이 중간에 취소되거나 연결이 종료될때 Exception 이 발생하...
    • 채태숙
      2004.03.25 20:18
      select aaa[--필드명], count(*) from table1 group by aaa having count(aaa) > 1 이렇게 하시...
    • 박수영
      2004.03.25 19:46
      Key값이 아니라면 select하는 것이 가장 정확하지 않을까요???
    • 연기훈
      2004.03.25 19:09
      하나의 중복 값만 찾으면 되는건지...? group by 로 그룹 잡고 count 해주면 중복 데이타 수랑 다나오자...
    • Galaxy
      2004.03.26 00:10
    • 너구리
      2004.03.25 20:30
      저 한테 있기는 한데 델파이 6버젼이 있기는 한데.. 버젼이 맞을지..그리고 FreeWare라면 드릴께요.. ...
    • 박대원
    • 2004.03.25 02:02
    • 3 COMMENTS
    • /
    • 1 LIKES
    • 권영길
      2004.03.25 02:15
      http://www.techvanguards.com/products/eventsinkimp/ 여기서 제공되는 툴을 써서 이벤트관련 TLB를 생성...
    • 박대원
      2004.03.25 03:34
      답변 감사합니다. EventSinkImp 라는 프로그램을 설치하고 TypeLibrary 에서 Import 해줬습니다. 그...
    • 권영길
      2004.03.25 04:45
      제가 자세한건 살펴볼수 없으나 EventSinkImp에서 생성해주는 유닛을 사용할 경우 대략의 스토리는 이렇습...
    • 1학년
    • 2004.03.25 01:04
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 박수영
      2004.03.25 01:26
      우선 출력할 부분이 열자리면 열자리만큼을 스패이스로 채운뒤에 숫자의 길이만큼 for i := lengt...
    • 김승재
    • 2004.03.25 00:47
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 최성준
      2004.03.25 01:16
      질문1 : 델파이 project - options에서 forms tab에서        &n...
    • 별볼일없는
      2004.03.25 01:10
      저두 초보지만 아주 초보적인 질문이네요.. ㅋㅋ 1번건은 메인 메뉴에 porject 에서 options 들어...
    • 김승재
      2004.03.25 18:26
      ㅎㅎ
    • 서기원
      2004.03.30 02:22
      벌써 답을 찾으셨을 것 같긴 한데... ActiveX의 Destory 메소드에서 처리하시면 될겁니다. 그럼..
    • 김기원
      2004.03.25 01:17
      QRCompositeReport 를 사용해보세요... QuickRep 를 한 폼에 두개 만드시고 각각 QuickRep에 Grid1의 내용...
    • 장덕곤
      2004.03.26 07:43
      이방법도 있을거같네요 프린터버튼을 클릭할때 따로 SQL을 작성해서 돌리는 겁니다 sql은 select * from...
    • 송종환
    • 2004.03.25 00:21
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이강승
    • 2004.03.25 00:06
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 너구리
      2004.03.25 02:52
      그런데 프로그램 업데이트를 하면 파일을 카피하더라도 이미 실행중인 프로그램하고 이름이 같을텐데.. ...
    • KDDG_Cali
      2004.03.25 00:18
      폼의 FormPaint 부분에서 처리하심이..... 그럼.. GG KDDG_
    • 이강승
      2004.03.25 00:47
      답변감사합니다. 하지만 심각한 에러가 발생하더군요 ;; 다음의 방법으로도 가능하네요. 조잡한 방법같은...
    • 김기원
      2004.03.25 01:40
      FormCreate 이벤트에서 PostMessage 를 이용 해보세요...