IT/Delphi2017. 11. 16. 08:39

윈도우10은 최초 예고한 대로 1년에 1~2번 정도 대대적인 업데이트를 실시한다.

그런데 델파이로 개발을 하는 경우 꼭.. 다음과 같은 에러가 발생한다.

 

 

 

찾아보니, 이는 윈도우가 업데이트 될때 윈도우 시스템을 통째로 windows 폴더에서 windows.old로 백업을 뜨는데 원래 부터 있지 않았던 차후 설치된 프로그램에 대해서 파일을 다시 old에서 복사해오는거 같다.

 

그런데..

 

볼랜드하고는 척진 거라도 있는지 찾을 수 없다는 파일은 꼭 빼놓고 가져온다.

그자리에 가져다둔 볼랜드가 문제인건지, 안가지고 가는 MS가 문제인지는 잘 모르겠지만..

 

해결방법은 간단하다. 안가지고 갔으니 다시 가져다 두면 된다. (응??)

 

C:\Windows.old\WINDOWS\Microsoft.NET\Framework\v2.0.50727

 

본인의 경우는 해당위치에서 문제의 파일을 찾을 수 있었다. 만약 여기서 찾지 못한다면 그냥 windows.old폴더에서 Borand.Delphi.Targets 를 그냥 검색해서 찾은 다음 해당파일을 똑같은 경로이긴나 딱 저 winddows.old가 빠진 경로에 붙여넣기 하면 된다.

다만 딱 저파일만 필요한건 아니고 Borland로 시작하는 파일을 전부 복사해야 한다.

 

다만, 지금은 4개이나 버전에 따라 파일 갯수가 달라질 수도 있다.

 

현재 본인의 델파이버전은 2007이니 참고바란다.

Posted by 비와바람
IT/Delphi2015. 1. 26. 15:36

































































































































































































































































































































































































































































































































































































































































































유니트 찾기
Type Unit
_Stream ADODB_TLB
akTop, akLeft, akRight, akBottom Controls
AnsiLowerCase SysUtils
Application (the variable not a type) Forms
Beep SysUtils or Windows (different functions)
CGID_EXPLORER ShlObj
CN_BASE Controls
CoInitialize ActiveX
CopyFile Windows
CoUnInitialize ActiveX
CreateComObject ComObj
CreateOleObject ComObj
Date SysUtils
DeleteFile SysUtils or Windows (different versions)
DispatchInvokeError ComObj
DWORD Windows
EDatabaseError DB
EncodeDateTime DateUtils
EnumWindows Windows
EOleError ComObj
EOleException ComObj
EOleSysError ComObj
Exception SysUtils
ExtractFileName SysUtils
FileExists SysUtils
FileOpen SysUtils
FILETIME Windows
FindFirst SysUtils
FindFirstFile Windows
FindWindow Windows
FlushFileBuffers Windows
fmOpenRead SysUtils
fmShareDenyWrite SysUtils
Format SysUtils
FormatDateTime SysUtils
FreeAndNil SysUtils
fsBold Graphics
ftWideString DB
ftString DB
GetCurrentProcessId Windows
GetEnvironmentVariable SysUtils or Windows (different versions)
GetFileAttributes Windows
GetFileVersionInfoSize Windows
GetStdHandle Windows
GetTickCount Windows
GetWindowLong Windows
HDC Windows
HFont Windows
HINTERNET WinInet
HKEY_CURRENT_USER Windows
HWND Windows
IHTMLDocument2 MSHTML or MSHTML_TLB
IHTMLElement MSHTML or MSHTML_TLB
IHTMLEventObj MSHTML or MSHTML_TLB
IID_IWebBrowser2 SHDocVw or SHDocVw_TLB
IMessage CDO_TLB
InternetClosehandle WinInet
InternetOpenUrl WinInet
InternetReadFile WinInet
IntToHex SysUtils
IntToStr SysUtils
IOleCommandTarget ActiveX
IOleContainer ActiveX
IPersistStreamInit ActiveX
IsSameDay DateUtils
IStream ActiveX
IWebBrowser2 SHDocVw or SHDocVw_TLB
LockWindowUpdate Windows
Log10 Math
LowerCase SysUtils
LPSTR Windows
MAX_PATH Windows
MessageBox Windows
MessageDlg Dialogs
MB_YESNO, MB_OK etc Windows
MinutesBetween DateUtils
Now SysUtils
OleInitialize ActiveX
OleUninitialize ActiveX
PItemIDList ShlObj
POleCmd ActiveX
POleCmdText ActiveX
PostMessage Windows
PosX StrUtils
QueryHighPerformanceCounter Windows
QueryPerformanceCounter Windows
RandomRange Math
ReverseString StrUtils
RoundTo Math
SendMessage Windows
SetForegroundWindow Windows
ShellExecute ShellAPI
ShellExecuteEx ShellAPI
SHGetFileInfo ShellAPI
SHFILEINFO ShellAPI
ShowMessage Dialogs
Sleep SysUtils
StrAlloc SysUtils
StrPas SysUtils
StrToDate SysUtils
StrToInt SysUtils
StrToIntDef SysUtils
TAdoConnection ADODB
TAdoQuery ADODB
TAlign Controls
TAlignment Classes
TAnchors Controls
TBitmap Graphics
TBlobStream DBTables
TCanvas Graphics
TClientSocket ScktComp
TComboBox StdCtrls
TComponent Classes
TControl Controls or QControls
TCriticalSection SyncObjs
TField DB
TFieldType DB
TFileName SysUtils
TFileStream Classes
TForm Forms
TFrame Forms
TGroupBox StdCtrls
TIID ActiveX
TIniFile IniFiles
TJPEGImage Jpeg
TLabel StdCtrls
TList Classes
TMemo StdCtrls
TMemoryStream Classes
TMouseButton Controls
TNofityEvent Classes
TObjectList Contnrs
TOSVersionInfo Windows
TPanel ExtCtrls
TPoint Types
TProcessEntry32 TlHelp32
TProgressBar ComCtrls or QComCtrls
TRadioButton StdCtrls
TRadioGroup ExtCtrls
TRect Types
TRegistry Registry
Trim SysUtils
TRoundToRange Math
TSearchRec SysUtils
TSize Windows
TSocketAddrIn Winsock
TStaticText StdCtrls
TStream Classes
TStringList Classes
TStrings Classes
TStringStream Classes
TSystemTime Windows
TTable DBTables
TTabSheet ComCtrls
TThread Classes
TTreeNode ComCtrls
TWebBrowser SHDocVw or SHDocVw_TLB
TWinSocketStream ScktComp
TWMCommand Messages
Unassigned Variants
VarArrayCreate Variants
VarArrayOf Variants
VirtualProtect Windows
WaitForSingleObject Windows
WM_MOVE Messages
WM_MOVING Messages
WM_USER Messages
YearOf DateUtils

 

 

 

Posted by 비와바람
IT/Delphi2013. 5. 28. 09:16

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm4 = class(TForm)
    Label1: TLabel;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

function SecondsIdle : DWord;
var
    liInfo : TLastInputInfo;
begin
    liInfo.cbSize := SizeOf(TLastInputInfo);
    GetLastInputInfo(liInfo);

    Result  := (GetTickCount - liInfo.dwTime) div 1000;
end;

procedure TForm4.Timer1Timer(Sender: TObject);
begin
    Label1.Caption := Format('System IDLE Last %d seconds', [SecondsIdle]);
end;

end.

 

Posted by 비와바람
IT/Delphi2013. 4. 3. 09:16

TxQuery는 자체적으로 SQL문을 수행할 수 있는 상용 DataSet 컴포넌트입니다. 다른 데이터셋들로부터 데이터를 가져와 조인을 하여 새로운 결과를 만들어낼 수도 있습니다. 꽤 애용자들이 많았었고, 저도 꼭 필요한 경우가 있어 사용한 적이 있습니다.

그런데 이 TxQuery가 몇년 전부터 업그레이드가 되지 않고, 홈페이지도 폐쇄되었었습니다. 대단히 유명한 컴포넌트는 아니지만 경우에 따라서는 다른 대안이 없이 꼭 필요한 컴포넌트이기 때문에 많이 아쉬웠었는데요.

조금 전에 서핑하다가 TxQuery가 다시 업그레이드되고 있다는 것을 알게 되었습니다. 유명한 델파이 매니아 중 한 사람인 Chau Chee Yang씨가 2009년 말에 원 개발자인 Alfonso Moreno씨에게 연락하여, 오픈소스화를 허락받았다고 하더군요. 게다가 Chau Chee Yang씨는 유니코드 마이그레이션까지 완료해놓아서 델파이 XE, 2010, 2009 버전까지 지원합니다.

TxQuery의 가장 큰 장점은, 클라이언트로 가져온 여러 데이터셋들로부터 로컬 조인이 가능하다는 것입니다. 예를 들면, 다음과 같이 사용합니다. (헬프에 소개된 샘플 코드인데, 설명을 위해 일부러 모두 코드로 구현한 것이며, 폼디자이너에서 각 데이터셋들을 추가할 수 있습니다)

procedure TForm1.FormCreate(Sender: TObject);
var
  XQuery: TxQuery;
  Item: TXDataSetItem;
  sql: String;
begin
  XQuery := TxQuery.Create(Self);
  XQuery.AddDataSet(Table1, 'Customer');
  XQuery.AddDataSet(Table2, 'Orders');
  XQuery.AddDataSet(Table3, 'Items');
  XQuery.AddDataSet(Table4, 'Parts');

  XQuery.SQL.Text := 'SELECT * FROM customer c INNER JOIN Orders o ' +
    'ON (c.CustNo = o.CustNo) INNER JOIN Items i ' +
    'ON (o.OrderNo = i.OrderNo) INNER JOIN Parts p ' +
    'ON (i.PartNo = p.PartNo);';
  XQuery.Open;
end;

TxQuery는 로컬 조인이 가능하기 때문에, 원래의 데이터베이스가 뭐였는지에 대해 완전히 투명하게 됩니다. 즉, 서로 다른 데이터베이스로부터 가져온 데이터셋들을 조인할 수도 있게 됩니다.

또, SQL을 지원하지 않는 데이터스토어, 예를 들면 버클리DB 등에 대해서도 SQL 쿼리가 가능해지죠. (물론 그러려면 실제 필요한 것보다 훨씬 더 많은 데이터를 로컬로 가져와야 하는 경우가 생기지만, 그래도 가능하기만 하다면, 하고 간절한 경우가 종종 있죠)

현재의 최신 버전은 1월 21일에 공개된 2.1 버전이구요. 구글 코드 사이트에서 다운로드할 수 있습니다.
http://code.google.com/p/txquery/

Posted by 비와바람
IT/Delphi2012. 2. 22. 09:29

델마당의 장성호님의 답변해 주신 글입니다.. (물론 제 질문은 아닙니...)

http://www.delmadang.com/community/bbs_view.asp?bbsNo=17&bbsCat=41&indx=409079&keyword1=Hint&keyword2=시간

------------------------------------------------------------------------------


ListView에서 Row별로  힌트를 다르게 주려고 한다면

MouseMove 이벤트에 처리해야 하는것은 맞습니다.


1. 먼저 OnMouseMove이벤트에서 현재 마우스 위치에 Row 즉 ListItem을 알아야 겠죠?

    그것은 ListView에 GetItemAt 이라는 함수가 있습니다.
 
   procedure TForm3.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
   var
      item: TListItem;
    begin
       item:=ListView1.GetItemAt(X,Y);
       ....
   end;

   문론 GetItemAt으로 item을 구했는데 nil 인경우도 있습니다. 
   이럴경우도 처리해야죠

2. Mouse위치의 Item을 알았으니 ListView의 Hint를 바꿔줘야 겠죠
    다음과 같이 마우스 위치의 ListItem을 구해서 ListView의 Hint를 바꿔줄수 있습니다.
 

procedure TForm3.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  item: TListItem;
begin
  item:=ListView1.GetItemAt(X,Y);

  if Assigned(item)then
  begin
      ListView1.Tag:= item.Index ;
      ListView1.Hint:='ListView Items= '+item.Caption;
  end
......
end;
 

     그런데 Hint를 바꾼다고 해서 바로 변경된 Hint가 보여지는것이 아니죠

3.  Hint를 보여주고/ 말고 하는것은 Application객체가 담당합니다.
     
     대게 Hint가 보여지는것은 마우스위치에 있는 Control이 바뀌었을때 해당Control의 힌트를 보여주죠

      그런데 listview에서 mouse만을 움직였을때는 item만 바뀌지 control을 여전히 같은 listview이기때문에
      hint가 보여지지 않는것입니다.


4. 즉각적으로 Hint를 다시 보여주려면 Application의 Hint관련 함수를 이용하면 됩니다.
 
    // 현재 떠있는 힌트를 닫습니다.
    Application.CancelHint;    
  
    // 넘겨준 TPoint위치에 hint를 보여줍니다.
   Application.ActivateHint( point );

5. 결론적으로 listveiw의 hint를 바꾼뒤에
     위 Application 의 CancelHint  , ActivateHint 를 한번씩 호출해주면 됩니다.
 

procedure TForm3.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  item: TListItem;
begin
  item:=ListView1.GetItemAt(X,Y);

  if Assigned(item)then
  begin
      ListView1.Hint:='ListView Items= '+item.Caption;
      Application.CancelHint;
      Application.ActivateHint(Mouse.CursorPos);
  end;
end;
 

6. 그러데 MouseMove 이벤트가 같은 item위치에서 여러번 발생할수있죠
    마우스위치의 item이 바뀌지 않았는데 반복해서 CancelHint , ActivateHint 를 띄우면
    좀 이상하겠쬬

    그러니 현재 hint로 띄운 item을 기억하고 있을 필요가 있을것입니다.
    
   즉 item이 변경되면 hint를 새로 띄우는것이 아니라
    hint가 변경되면 hint를 새로띄우는것이죠

procedure TForm3.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  item: TListItem;
begin
  item:=ListView1.GetItemAt(X,Y);

  if Assigned(item)then
  begin
    if(item.Index <>ListView1.Tag ) then
    begin
      //item의 index를 ListView.Tag에 기억해두고 tag가 같지 않는경우에만 ...
      ListView1.Tag:= item.Index ;
      ListView1.Hint:='ListView Items= '+item.Caption;
      Application.CancelHint;
      Application.ActivateHint(Mouse.CursorPos);
    end;
  end;

end;   

     뭐 대충 이런식으로 하면 됩니다.

     이 방식으로 listview뿐만 아니라 VCL의 모든 Control에 적용할수 있습니다.
     마우스 위치의 control이 변경되지 않았는데
     hint를 바꾸고 싶을경우에는 

     1)  먼저 hint를 바꾼후에
     2)  Application.CancelHint;
     3)  Application.ActivateHint(Mouse.CursorPos);
       해주면 됩니다.
    
6. 마지막으로  Application 객체에는 hint관련해서 프로퍼티와 함수가 몇가지 더 있습니다.

      Application.Hint;
      Application.HintColor:=clRed;  //힌트 보여지는 Color
      Application.HintPause; //Control위에 마우스가 들어간뒤에 Hint가 보여지기까지 delay
      Application.HintHidePause; //hint가 나타난후에 사라지기까지 시간
      Application.HintShortCuts;
      Application.HintShortPause;

7.  hint를 좀더 발전된 형태로 보여주고 싶다면

     THintWindow 를 상속받아서 hint 클래스를 새로만드시구요   
     TMyHintWindow = class(THintwindow) 
   
     다음과 같이 HintWindowClass 에 설정해주시면
     HintWindowClass := TMyHintWindow
     Application객체가 HintWindowClass 에 등록된 class를 생성해서 보여줍니다.

그럼..

Posted by 비와바람
IT/Delphi2011. 3. 15. 14:34

흠... 좋은 팁이란 바로 이런거다...
초보 델피언으로 많은 시간을 허비해야 했던 바로 그 문제의 답이 될 수 있는 팁을 발견했다.

좋은 팁을 올려주신 양병규님께 감사드린다. - 출처 델마당 팁란

http://www.delmadang.com/cwb-bin/CrazyWWWBoard.exe?db=dmdlec3&mode=read&num=3866&page=1&backdepth=1

인용
--------------------------------------------------------------------------------------------------------------------
음...

어떻게 보면 기본인것같은데.. 의외로 많은 분들이 잘 모르시는 것같아서... 이야기해봅니다.

액세스바이올뢔이션 에러가 발생하면 에러난 위치의 주소값을 16진수로 보여줍니다.

그 화면을 본 사용자는 큰일 난줄알고 바로 연락하는 경우가 많은데...

그 화면의 내용을 줄줄줄 다 읽어주기도하고....

보통은 캡쳐해서 보내주기도하는데...

정작 그걸 보는 개발자는 그 숫자가 의미하는게 뭔지도 잘모르고..

그걸 가지고 뭘해야하는지도 잘 모르는 경우가 많습니다.

자... 잔소리 그만하고..... ^^;

...

메모리 주소값을 설명하는것이므로.... 정확한 주소값으로 설명하기위해...첨부한 소스를 가지고 설명하겠습니다.

(참고로 델파이7입니다. 다른 버전에서는 여기서 설명하는 메모리주소값과 다른 주소값이 나올겁니다만... 내용은 동일합니다.)

자...

소스를 열어봅시다.

Form1Create에서는 Label1.Caption 에다가 HInstance를 IntToHex로 보여주게했고...(그냥 참고하라고....)

Button1Click에서는 다음과 같이 코딩해서 액세스바이올뢔이션에러가 뜨게했습니다.



31: procedure TForm1.Button1Click(Sender: TObject);
32: var
33:   P: Pointer;
34:   i: Integer;
35:   S: String;
36: begin
37:
38:   P := Pointer( 99999999 );
39:
40:   i := Integer( P^ );
41:
42:   S := IntToStr( i );
43:
44: end;



자 컴파일해보면 Label1에는 $00400000 라고 써있고...

버튼을 클릭해보면

Access violation at address 0044EBA9 in module 'Project1.exe' read of address 05FF5E0FF

라는 에러가 뜰겁니다.

여기서 말하는 address 0044EBA9  ...

이 주소값으로 소스코드의 어느 유닛 몇번째 라인인지를 알 수 있는데....

그냥은 알수없고....

...

● 프로젝트 옵션을 엽니다. (Shift+Control+F11,  Project->Options)

● Linker 탭을 엽니다.

● Map file 을 젤 밑에꺼 Detailed를 클릭합니다.

● Build Alll

그리고나서 소스코드가 있는 폴더에 보면 Project1.map라는 파일이 만들어져 있을겁니다.

그걸 메모장으로 엽니다.

다른 건 다른 자료들 찾아서 공부해 보시고.... 여기서 설명하는건 맵파일의 젤 아랫부분입니다.

젤 아랫부분에는 다음과 같이 나와있습니다.



Line numbers for Unit1(Unit1.pas) segment .text

   27 0001:0004DB00    28 0001:0004DB18    29 0001:0004DB70    36 0001:0004DB90
   38 0001:0004DBA4    40 0001:0004DBA9    42 0001:0004DBAB    44 0001:0004DBD2
   46 0001:0004DC08    46 0001:0004DC0F

Line numbers for Project1(C:\Documents and Settings\양병규\바탕 화면\새 폴더\Project1.dpr) segment .text

    9 0001:0004DE18    10 0001:0004DE28    11 0001:0004DE34    12 0001:0004DE4C
   13 0001:0004DE58

Bound resource files

c:\program files\borland\delphi7\Lib\Buttons.res
c:\program files\borland\delphi7\Lib\ExtDlgs.res
c:\program files\borland\delphi7\Lib\Controls.res
Unit1.dfm
Project1.res
Project1.drf


Program entry point at 0001:0004DE18



이 중에서도 젤 윗 라인을 보면

Line numbers for Unit1(Unit1.pas) segment .text 라고 되어있는데...

말 그대로 소스코드의 라인들의 주소값들이 나와있습니다.

27 0001:0004DB00 이거는

27라인의 0001번째 글자부터의 소스코드가 0004DB00번지로 만들어졌다....라는 뜻입니다.

...

자... 에러가 난 주소가 얼마였져?

$0044EBA9 였군요....

이 주소 값에서 HInstance인 $00400000를 뺍니다.

그리고 PE포맷의 헤더등 불필요한 앞부분 사이즈인 $1000 도 뺍니다.

그러면

$0004DBA9 가 됩니다.

Line numbers for Unit1(Unit1.pas)에서 이 주소 $0004DBA9를 찾아봅시다.

몇라인인가요?

40 0001:0004DBA9 이라고 되어있습니다.

고로 에러가 난 부분은 Unit1의 40라인 0001번째 글자부터...입니다.

그 부분의 소스는

 i := Integer( P^ );

입니다.

XP, 2000에서 HInstance는 항상 $00400000 이고,

델파이로 만들어진 EXE의 PE헤더정보는 항상 $1000 바이트입니다. 그러므로....

에러가 난 주소는 = 에러화면에 나온 주소 - $00401000 하면 됩니다.


이렇게 찾으시면 되는데...........

map파일이 있어야하므로 프로그램을 배포하기 전에 맵파일을 만들어두셔야합니다.

혹은 안만들었어도 나중에 만들면 되는데...

단, 소스코드가 최종 컴파일됐을때의 모양 그대로 있어야겠지요....

그리고,

맵에 라인별 주소값은 컴파일 할 당시 실제로 컴파일한 유닛들만 나옵니다.

그러므로 Graphics.pas와 같이 Lib 경로에 Dcu만 있고 pas는 없는 유닛들은 포함되지 않습니다. 바꿔말하면 Graphics.pas 도 맵에 라인별 주소값을 남기려면 그 유닛도 컴파일이 되도록.. 프로젝트 경로에 같이 두던가 Lib에 Graphics.pas를 넣던가하면 됩니다.

끝.
Posted by 비와바람
IT/Delphi2009. 11. 23. 10:47


Delphi 2007에서는 Tee Chart와 QuickReport가 연동되지 않는다.

퀵리포트를 pro버전 사면 되는거 같긴 한데, 확실치는 않고..

그래서 델마당에 문의한 결과, metaFile로 받아서 이미지로 출력하는 방법을 얻어냈다.

(대단하신 분이다.. ^^)

그걸 내 입맛에 맞게 조금 수정했다.

procedure TfrmChartPrt.qrpChartLandScapeBeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
var
    mtMeta      : TMetaFile;
    alAlign : TAlign;
begin
    alAlign := gchtChart.Align;  //속성백업
    gchtChart.Align := alnone;  //속성을 초기화 한다.

    gchtChart.Width    := qimgLandScape.Width;
    gchtChart.Height   := qimgLandScape.Height;

    mtMeta  := gchtChart.TeeCreateMetafile(TRUE, gchtChart.GetRectangle);

    qimgLandScape.Picture.Metafile.Assign(mtMeta);

    gchtChart.Align := alAlign;  //백업된 속성을 복구한다.
end;

Posted by 비와바람
IT/Delphi2009. 9. 23. 13:26
str := StringReplace(`ysd001F / ysd1001_F / ysd002F`, `F`, ``, [rfReplaceAll]); 
Posted by 비와바람
IT/Delphi2009. 8. 28. 14:43

VCL에서 ShowMessage나 MessageDlg는 모두
TForm을 상속받은 TMessageForm을 생성해서 ShowModal로 띄워 주는것입니다.


TMessageForm클래스를 개발자에게 노출되어 있지는 않지만
CreateMessageDialog 라는 함수를 통해 생성할수 있습니다.

CreateMessageDialog 라는 함수를 이용하여 다음과 같이 다양하게 MessageBox의 기능을 변경해 보았습니다.

님께서 원하시는것은 아래에 있는것중 MessageDlgEx 일듯 하네요

//============================================================================

//메세지박스의 Title을 변경
procedure ShowMessageEx(const sTitle:String;const sMsg:String);
begin
  with CreateMessageDialog(sMsg, mtCustom, [mbOK]) do
    try
      Caption:=sTitle;
      HelpContext := 0;
      Position := poScreenCenter;
      ShowModal;
    finally
      Free;
    end;
end;

//메세지박스의 SystemMenu를 없앰
procedure ShowMessageEx2(const sMsg:String);
begin
  with CreateMessageDialog(sMsg, mtCustom, [mbOK]) do
    try
      BorderIcons:=[];
      HelpContext := 0;
      Position := poScreenCenter;
      ShowModal;
    finally
      Free;
    end;
end;

//MessageDlg함수의  SystemMenu없앰
function MessageDlgEx(const Msg: string; DlgType: TMsgDlgType;
  Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
begin
 with CreateMessageDialog(Msg, DlgType, Buttons) do
    try
      HelpContext := 0;
      HelpFile := '';
      Position := poScreenCenter;
      BorderIcons:=[];
     Result :=  ShowModal;
    finally
      Free;
    end;
end;

//사용예..
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessageEx('타이틀','메세지 입니다. 타이틀이 바뀌었나요?');
  //-----------------------
  ShowMessageEx2('X 아이콘이 안보이죠?');

  if MessageDlgEx('수정하시겠습니까?',mtConfirmation, [mbYes, mbNo], 0) = mrNo then  Exit;

end;

델마당에서..

http://www.delmadang.com/community/bbs_view.asp?bbsNo=17&bbsCat=0&st=&keyword=&indx=415548&keyword1=&keyword2=&page=1

Posted by 비와바람
IT/Delphi2009. 8. 17. 09:12

1. 주석을 단 사람으로 이니셜을 쓰지 말자.

이게 이니셜을 쓰는 사람도 있고, 자기 아이디를 쓰는 사람도 있고 천차만별이다. 그런데, 가끔 보다보면 이게 이니셜등인지, 아니면 잘못친건지 구분이 안되는 인간들이 있다는 문제가...

가장 좋은게 자기 이름이다..


2. 가능하면 주석과 같이 작성한 일자도 기록하자.

특히 대단위 업데이트 작업을 하다보면 주석에 날짜를 넣는게 좋을때가 꽤 있다..


3. 소스 복사시 주석의 작성자 이니셜과 날짜는 없애라.

이거.. 꽤 문제가 생길때가 있다. 내가 한 3년전에 해놓은 건데, 누가 그걸 통째로.. 주석까지 카피를 해서 작업했는데, 그게 문제가 생겼다면... 괜하 나한테 와서 뭐라 그런다. -.-;
내가 한게 아니란 말이지...

설명이야 그냥 써도 상관없겠지만, 원작자, 작성일자등은 그냥 없애라...

Copy Right가 아니라 Copy Left다.. -.-;;

Posted by 비와바람