2008年12月21日
[書籍]Delphi 2009 Handbook/Delphi 2009 Development Essentials
Marco CantuさんのDelphi 2009 HandbookがLulu.comから到着。Bob SwartさんのDelphi 2007 for Win32 Development EssentialsとDelphi 2009 Development Essentialsも一緒に買ったのでまとめて積んだ。
2008年12月20日
Delphi 2009/C++Builder 2009 Help Update 1
Delphi 2009/C++Builder 2009のHelp Update 1がリリースされています。
リリースノート: Delphi 2009 および C++Builder 2009 Help Update 1
Dee Ellingさんによれば、CHM/PDF/HTML版がEmbarcadero CodeGear Product Documentation SITE BETAに載るのは来年になるようです。あちらはもうホリデーシーズンですしね。
2011/05/04追記: codegear.comのリンクをembarcadero.comのものに差し替え。
リリースノート: Delphi 2009 および C++Builder 2009 Help Update 1
Dee Ellingさんによれば、CHM/PDF/HTML版がEmbarcadero CodeGear Product Documentation SITE BETAに載るのは来年になるようです。あちらはもうホリデーシーズンですしね。
2011/05/04追記: codegear.comのリンクをembarcadero.comのものに差し替え。
2008年12月19日
2008年12月18日
2008年12月16日
ファイルサイズを取得する(2)
前回のファイルサイズの取得の方法ではNTFSログファイルが一杯になると取得できるファイルサイズがファイルの更新に従って変化しなくなるという不具合を避けることができません。そこでこのKBのworkaroundに従ってWin32APIのGetFileSizeExを使用してファイルサイズを取得する方法です。
function GetFileSizeEx(hFile: THandle; var lpFileSize: LARGE_INTEGER): BOOL; stdcall;
external kernel32 name 'GetFileSizeEx';
function GetFileSize(const Filename: String; var FileSize: Int64): Boolean;
var
Handle: THandle;
LI: LARGE_INTEGER;
begin
Result := False;
FileSize := 0;
Handle := Windows.CreateFile(PChar(Filename),GENERIC_READ,0,nil,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if Handle = INVALID_HANDLE_VALUE then
begin
Exit;
end;
try
if GetFileSizeEx(Handle,LI) = False then
begin
Exit;
end;
finally
Windows.CloseHandle(Handle);
end;
FileSize := LI.LowPart or (Int64(LI.HighPart) shl 32);
Result := True;
end;
GetFileSizeExがオープン済のファイルハンドルを要求するため、CreateFileで一旦ファイルをオープンし、ファイルサイズ取得後にクローズするようにしています。このためアクセス権などの問題からオープンに失敗するようなファイルのサイズを取得することができません。
Delphi 2009/C++Builder 2009 Update 2
Delphi 2009/C++Builder 2009のUpdate 2がリリースされています。Update 2はデータベース関係のアップデートのみとのことです。また事前にUpdate 1を適用しておく必要があります。
リリースノート: Delphi 2009 および C++Builder 2009 Update 2
List of Bug Fixes in Update 2 for Delphi and C++Builder 2009
リリースノート: Delphi 2009 および C++Builder 2009 Update 2
List of Bug Fixes in Update 2 for Delphi and C++Builder 2009
2008年12月13日
InterBase 2007 Service Pack 3リリース
InterBase 2007 SP3 for Windows - Japaneseがダウンロードできるようになっています。
InterBase 2007 Service Pack 3 (8.1.1.333) リリースノート
2008/12/16追記: InterBase 2007 SP3はSP2適用済の環境にのみ適用可能です(SP2の詳細についてはこちら)。
InterBase 2007 Service Pack 3 (8.1.1.333) リリースノート
2008/12/16追記: InterBase 2007 SP3はSP2適用済の環境にのみ適用可能です(SP2の詳細についてはこちら)。
2008年12月11日
スプラッシュフォームを表示する
メインフォームを表示するのに時間がかかる(データベースを参照していたり、大きなファイルを読み込む必要があったり、理由はさまざまでしょうけれども)ようなときに、スプラッシュフォームを表示することでこれをごまかす、じゃなくて目立たなくするという方法があります。
まず表示に時間がかかるメインフォームとしてこのようなものを考えます。
ここでスプラッシュ用のフォームを用意します。必要に応じてプロパティを指定したりLabelやPanelやImageなどを配置してそれなりの体裁を整えていただくとして、ここで必要なイベントハンドラはOnDeactivateです。OnDeactivateイベントハンドラではReleaseメソッドを呼び出してスプラッシュフォーム自身を解放するようにします。
Applicationの初期化後にまずスプラッシュフォームが生成、表示され、メインフォームが生成されて時間がかかる処理が走り、Apprication.Runでメインフォームが表示されてアクティブになることでスプラッシュフォームはインアクティブになり、OnDeactivateイベントが発生してスプラッシュフォームが消滅する、という動作の流れになります。
まず表示に時間がかかるメインフォームとしてこのようなものを考えます。
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
for I := 0 to 99 do
begin
Sleep(100);
end;
end;
起動からメインフォームの表示まで10秒かかります(あたりまえ)。ここでスプラッシュ用のフォームを用意します。必要に応じてプロパティを指定したりLabelやPanelやImageなどを配置してそれなりの体裁を整えていただくとして、ここで必要なイベントハンドラはOnDeactivateです。OnDeactivateイベントハンドラではReleaseメソッドを呼び出してスプラッシュフォーム自身を解放するようにします。
type
TForm2 = class(TForm)
procedure FormDeactivate(Sender: TObject);
end;
procedure TForm2.FormDeactivate(Sender: TObject);
begin
Release;
end;
さらにスプラッシュフォームを表示するためのメソッドを用意します。このスプラッシュフォームには通常の(メッセージループ経由の)メッセージが全く送られない(アプリケーションのメッセージループが動作し始めると直後にOnDeactivateが発生する)ので、Updateメソッドで強制的に表示更新を行う必要があります。procedure ShowSplashForm;
begin
with TForm2.Create(nil) do
begin
Show;
Update;
end;
end;
そしてこのメソッドをプロジェクトソース内のApplication.Initializeの後で呼び出します。begin
Application.Initialize;
ShowSplashForm;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Delphi 2007以降ではWindows Vista対応のためにApplicationとメインフォームの関係を色々と変更したためにbegin
Application.Initialize;
Application.MainFormOnTaskbar := True;
ShowSplashForm;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
とApplication.MainFormOnTaskbarの設定の後にスプラッシュフォームを表示するようにする必要があります(逆にDelphi 2006以前ではTForm2の所属ユニットのinitialization部で十分なのですが)。Applicationの初期化後にまずスプラッシュフォームが生成、表示され、メインフォームが生成されて時間がかかる処理が走り、Apprication.Runでメインフォームが表示されてアクティブになることでスプラッシュフォームはインアクティブになり、OnDeactivateイベントが発生してスプラッシュフォームが消滅する、という動作の流れになります。
2008年12月10日
2008年12月8日
InterBase SMP 2009 Develper Edition 日本語版リリース
InterBase SMP 2009のDeveloper Edition 日本語版がダウンロードできるようになっています。
InterBase SMP 2009 Developer Edition日本語版および追加プラットフォーム版のダウンロード
InterBase SMP 2009 Developer Edition日本語版および追加プラットフォーム版のダウンロード
2008年12月5日
Delphi 2009 Whitepapers
Marco CantuさんによるDelphi 2009 White Paperがリリースされています。
White Paper #1 Unicode: White Paper: Delphi and Unicode
White Paper #2 Language: White Paper: Using New Delphi Coding Styles and Architectures
White Paper #3 The IDE: White Paper: A Tour of Delphi 2009
White Paper #4 The VCL: White Paper: Building User Interfaces with Delphi 2009
White Paper #5 Datasnap 2009: White Paper: The New DataSnap in Delphi 2009
#2の表紙に著者名が入っていないのは単なるミスだそうです。
2008/12/16追記: #3がリリースされています。
2009/01/22追記: #4がリリースされています。
2009/01/28追記: #5がリリースされています。
White Paper #1 Unicode: White Paper: Delphi and Unicode
White Paper #2 Language: White Paper: Using New Delphi Coding Styles and Architectures
White Paper #3 The IDE: White Paper: A Tour of Delphi 2009
White Paper #4 The VCL: White Paper: Building User Interfaces with Delphi 2009
White Paper #5 Datasnap 2009: White Paper: The New DataSnap in Delphi 2009
#2の表紙に著者名が入っていないのは単なるミスだそうです。
2008/12/16追記: #3がリリースされています。
2009/01/22追記: #4がリリースされています。
2009/01/28追記: #5がリリースされています。
2008年12月4日
OpenTools API入門
あとで読む。
Extending Delphi 2009 With OpenTools API: Getting Started
OTA(OpenTools API)はDelphi/C++BuilderのIDEとインタフェースするためのAPIで、wizardやpluginはこれを利用して作成します。
Extending Delphi 2009 With OpenTools API: Getting Started
OTA(OpenTools API)はDelphi/C++BuilderのIDEとインタフェースするためのAPIで、wizardやpluginはこれを利用して作成します。
2008年12月3日
第11回エンバカデロ・デベロッパーキャンプ終了
参加者および関係者の皆さん、おつかれさまでした。
ところで会場に来てたのはMalcolm Grovesさんでしたか。
また後で更新予定…。
2008/12/06追記: ITProにMalcolm Grovesさんのインタビュー記事が。
2008/12/10再追記: セッション資料がダウンロードできるようになっています。
ところで会場に来てたのはMalcolm Grovesさんでしたか。
また後で更新予定…。
2008/12/06追記: ITProにMalcolm Grovesさんのインタビュー記事が。
2008/12/10再追記: セッション資料がダウンロードできるようになっています。
Delphi 2009 Handbook出版
Marco CantuさんのDelphi 2009 HandbookがLulu.comから出版されました。全400ページで、価格は48.50USD(約4500円)ですが、先着60名は40.50USD(これは既に終了)、CodeRage IIIの期間中(2008/12/05まで)は45.50USD(約4200円)のディスカウントが設定されています。
2008/12/04追記: ソースコードがCodeCentralからダウンロードできるようになっています。
2008/12/05再追記: Delphi 2009/C++Builder 2009/RAD Studio 2009登録ユーザはPDF eBook形式のものをCodeGearから入手できるようになりました。
Delphi 2009 Handbook PDF eBook
また「何らかの形で日本語版を出せるように交渉中」という話をデベロッパーキャンプで藤井さんがしていましたので、期待してます。
2009/05/22再追記: Marco Cantuさんによると、Amazon(US)の傘下でプリントオンデマンドを扱うCreateSpaceという会社からも入手可能になったそうです。
Delphi 2009 Handbook on Amazon.com
2011/05/04追記: cc.codegear.comのリンクをcc.embarcadero.comのものに差し替え。
2008/12/04追記: ソースコードがCodeCentralからダウンロードできるようになっています。
2008/12/05再追記: Delphi 2009/C++Builder 2009/RAD Studio 2009登録ユーザはPDF eBook形式のものをCodeGearから入手できるようになりました。
Delphi 2009 Handbook PDF eBook
また「何らかの形で日本語版を出せるように交渉中」という話をデベロッパーキャンプで藤井さんがしていましたので、期待してます。
2009/05/22再追記: Marco Cantuさんによると、Amazon(US)の傘下でプリントオンデマンドを扱うCreateSpaceという会社からも入手可能になったそうです。
Delphi 2009 Handbook on Amazon.com
2011/05/04追記: cc.codegear.comのリンクをcc.embarcadero.comのものに差し替え。
2008年12月1日
IDE Fix Pack 2.1リリース
Andreas HausladenさんのIDE Fix Pack 2007/2009がアップデートしてVersion 2.1になっています。
IDE Fix Pack 2.1 and DFMCheck 1.3
IDE Fix Pack 2.1 and DFMCheck 1.3
2008年11月21日
IDE Fix Pack and VCL Fix Pack
IDE/VCLのBugFixが進まないことにAndreas Hausladenさんが業を煮やしたらしく、IDE/VCLの非公式パッチ集であるIDE Fix Pack 2009とVCL Fix Packをリリースしています。
IDE Fix Pack 2.0 and VCL Fix Pack 1.0 released
IDE Fix PackにはDelphi/C++Builder 2007用もあります。またVCL Fix PackはDelphi 6以降に適用可能なようです(先日の非公式パッチも含まれています)。
IDE Fix Pack 2.0 and VCL Fix Pack 1.0 released
IDE Fix PackにはDelphi/C++Builder 2007用もあります。またVCL Fix PackはDelphi 6以降に適用可能なようです(先日の非公式パッチも含まれています)。
3rdRail and TurboRuby
CodeGear(Embarcadero)から3rdRail 2.0とTurboRubyが発表されています。
Press Release: Embarcadero Ships Latest Edition of 3rdRail™ and Introduces TurboRuby IDEs
気になる3rdRail SKUとTurboRuby SKUの違いですが、FAQ FAQによればRailsフレームワークのサポートの有無(TurboRubyはRailsフレームワークをサポートしない)のようです。
ということは。
あくまで個人的な意見ですが、噂のDelphi/C++BuilderのTurbo SKUも、IDEは同じだけれどもVCLというフレームワームをサポートしない、という路線なのでは?と考えています。
2011/05/04追記: codegear.comのリンクをembarcadero.comのものに差し替え。
Press Release: Embarcadero Ships Latest Edition of 3rdRail™ and Introduces TurboRuby IDEs
気になる3rdRail SKUとTurboRuby SKUの違いですが、
ということは。
あくまで個人的な意見ですが、噂のDelphi/C++BuilderのTurbo SKUも、IDEは同じだけれどもVCLというフレームワームをサポートしない、という路線なのでは?と考えています。
2011/05/04追記: codegear.comのリンクをembarcadero.comのものに差し替え。
2008年11月19日
マニフェストのrequestExecutionLevelに指定できる値
Windows Vista上で管理者権限を要求するアプリケーションを作成するで説明したアプリケーションマニフェスト上のrequestExecutionLevelのlevel属性に指定できる値とその意味は以下のようになっています。
元ねたはAdvanced Windows 第5版 上 p.142
2008/11/20追記: ついでにGetProcessElevation関数(p.146)を移植してみようと思ったけど、Windows 2000ではGetTokenInformationにTokenElevationTypeを渡すとパラメータエラーになることが判明して断念。難しい…。
requireAdministrator- アプリケーションはAdministrator権限で開始されなければならず、それ以外の権限では実行されない。
highestAvailable- アプリケーションはログオンアカウントで要求できる最も高い権限で開始されなければならない。ログオンユーザがAdministratorアカウントならば権限昇格のプロンプトが表示されたうえでAdministrator権限で開始され、標準ユーザアカウントならば(権限昇格のプロンプトの表示なしに)標準の権限で開始される。
asInvoker- アプリケーションは呼び出し元のアプリケーションと同じ権限で開始される。
元ねたはAdvanced Windows 第5版 上 p.142
2008/11/20追記: ついでにGetProcessElevation関数(p.146)を移植してみようと思ったけど、Windows 2000ではGetTokenInformationにTokenElevationTypeを渡すとパラメータエラーになることが判明して断念。難しい…。
2008年11月16日
Delphi 2009/C++Builder 2009非公式パッチ群
DelphiSpeedUpやDDevExtensionsで有名なAndreas HausladenさんがDelphi 2009/C++Builder 2009の非公式パッチを4点公開しています。
QC66892 Form.Hide/Close - Stack tashing bugfix unit 元記事
QC59963 Application De/Activate bugfix unit (2007/2009) 元記事
QC68740 TOpen/SaveDialog focus bugfix unit (2007/2009) 元記事
IDE Fix Pack 1.0 for RAD Studio 2009 元記事
QC66892 Form.Hide/Close - Stack tashing bugfix unit 元記事
QC59963 Application De/Activate bugfix unit (2007/2009) 元記事
QC68740 TOpen/SaveDialog focus bugfix unit (2007/2009) 元記事
IDE Fix Pack 1.0 for RAD Studio 2009 元記事
2008年11月13日
アプリケーションの多重起動を禁止する
プログラムの性質によっては多重起動を禁止したいことがあります。このようなときには同期オブジェクトの一つであるmutexを使用します。
Delphiのプロジェクトソースを開くとこのようになっています。
作成するmutexの名前は任意(上記の例では適当にGUIDを生成して使用しています)ですが、'Global\'と'Local\'で始まるmutex名には特別な意味があるので注意が必要です(詳細はCreateMutex参照)。また同名のmutexが存在するかどうかを調べるのにOpenMutexを使用するとOpenMutexの呼び出しからCreateMutexの呼び出しまでの間が無防備になってしまうため、CreateMutexの第2パラメータbInitialOwnerにFalseを指定して呼び出し後、GetLastErrorの値がERROR_ALREADY_EXISTSかどうかで判定するようにします。
さらにアプリケーションのメインウィンドウを前面に移動し、最小化も解除するようにしてみます。
Delphiのプロジェクトソースを開くとこのようになっています。
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
ここで一意な名前のmutexをプログラム実行中だけ作成(CreateMutex)し、もしその名前のmutexが存在していたらプログラムを終了、存在していなければ実行を継続し、プログラム終了時にはmutexを破棄(CloseHandle)するコードを追加します。program Project1;
uses
Windows,
SysUtils,
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
const
{ Mutex name }
CMutexName: String = '{9D0E11F8-ED24-4D3E-91B1-5E9A9BF8673A}';
var
hMutex: THandle;
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
{ Create mutex }
SetLastError(0);
hMutex := CreateMutex(nil,False,PChar(CMutexName));
if hMutex = 0 then
begin
RaiseLastOSError;
end;
try
if GetLastError = ERROR_ALREADY_EXISTS then
begin
Exit;
end;
Application.CreateForm(TForm1, Form1);
Application.Run;
finally
{ Close mutex }
CloseHandle(hMutex);
end;
end.
これでプログラムの多重起動を禁止することができます。作成するmutexの名前は任意(上記の例では適当にGUIDを生成して使用しています)ですが、'Global\'と'Local\'で始まるmutex名には特別な意味があるので注意が必要です(詳細はCreateMutex参照)。また同名のmutexが存在するかどうかを調べるのにOpenMutexを使用するとOpenMutexの呼び出しからCreateMutexの呼び出しまでの間が無防備になってしまうため、CreateMutexの第2パラメータbInitialOwnerにFalseを指定して呼び出し後、GetLastErrorの値がERROR_ALREADY_EXISTSかどうかで判定するようにします。
さらにアプリケーションのメインウィンドウを前面に移動し、最小化も解除するようにしてみます。
program Project1;
uses
Windows,
SysUtils,
Messages,
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
const
{ Mutex name }
CMutexName: String = '{9D0E11F8-ED24-4D3E-91B1-5E9A9BF8673A}';
var
hMutex: THandle;
Wnd: HWnd;
AppWnd: HWnd;
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
{ Create mutex }
SetLastError(0);
hMutex := CreateMutex(nil,False,PChar(CMutexName));
if hMutex = 0 then
begin
RaiseLastOSError;
end;
try
if GetLastError = ERROR_ALREADY_EXISTS then
begin
{ Search main form }
Wnd := FindWindow(PChar('TForm1'),nil); // Class name of the main form
if Wnd = 0 then
begin
Exit;
end;
{ Bring foreground and activate }
SetForegroundWindow(Wnd);
{ Get window handle of TApplication }
AppWnd := GetWindowLong(Wnd,GWL_HWNDPARENT);
if AppWnd <> 0 then
begin
Wnd := AppWnd;
end;
{ Restore if iconized }
if IsIconic(Wnd) then
begin
SendMessage(Wnd,WM_SYSCOMMAND,SC_RESTORE,-1);
end;
Exit;
end;
Application.CreateForm(TForm1, Form1);
Application.Run;
finally
{ Close mutex }
CloseHandle(hMutex);
end;
end.
Delphiのウィンドウコントロールはクラス名がそのままウィンドウクラス名になるため、FindWindowにはアプリケーションのメインフォームのクラス名を渡します。
登録:
投稿 (Atom)