2012年11月16日

フォームを持たないWindowsアプリ

Sat Jan 29 05:18:06 2011
初心に帰って、delphiのプロジェクトにどんなファイルがあるのか、確認してみよう。
バージョンは2007である。

新しくプロジェクトを作る。メニューの「新規作成」「VCLフォームアプリケーション - Delphi for Win32」
を選択して、何もコーディングせずに「実行」する。
コンパイル、ビルドがおこなわれて、exeファイルが作成されて、実行される。
formが表示される。

delphi8から「.net」に対応した。
そしてここからがdelphiの迷走の始まりだった。

2005も.net対応していたが、その後、「Delphi 2007 for Win32」が出た。

プロジェクトを新規作成すると、WindowsXPでは以下のフォルダにファイルができる。

My Documents\RAD Studio\Projects

実行ファイル名は Project1.exe となる。

そしてDelphiを終了すると保存するかときかれ、デフォルトの名前でデフォルトの場所に保存すると、
以下のようなファイルができる。

Project1.exe
Unit1.dcu
_history (フォルダ)
Unit1.dfm
Unit1.pas
Project1.dpr
Project1.dproj
Project1.dproj.local
Project1.identcache
Project1.res

私はこれらのファイルがそれぞれどういうものなのかをよく知らない。
わかっているのは、自分がコーディングしたものが書かれるのが Unit1.pas だということくらいだ。

DelphiのIDEも、デフォルトで表示するのはフォームだけである。

そしてそのフォームをダブルクリックすると、エディタが開く。
タブの名前を見ると「Unit1」となっている。


procedure TForm1.FormCreate(Sender: TObject);
begin

end;

end.

Sat Jan 29 05:38:03 2011
のように表示されて、カーソルはbeginの次の行にある。


procedure TForm1.FormCreate(Sender: TObject);
begin
showmessage('hello');
end;

end.


というように、自分がしたいことを書いていく。
ボタンを押して何かをさせたければ、フォームにボタンをドラッグしてドロップし、そのボタンをダブルクリックする。


procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Caption := 'my form';
end;

こうすると、ボタンを押したらフォームのキャプションすなわちウィンドウの上部に表示されている「Form1」というデフォルトの名前が「my form」と変わる。

のとき、

Form1.

とタイプするとそのプロパティやメソッドがポップアップするので、そこから選んで入力できる。

代入は := である。
引用符はシングルクォーテーションである。
文の終わりは ; である。

Pascalなのだけど、Pascalの文法を勉強する必要は、ほとんどない。
ポインターに関してちょっと調べたくらいかな。

フォームを「デザイン」するのも、子供が積み木遊びやお絵描きをするような感覚で、ごく簡単に直感的にできる。もはや「設計」「デザイン」などと呼ぶのが気恥ずかしいくらいだ。コーディングもそう。「俺はプログラミングをしている」なんてカッコつけて言えるようなものでもない。

不思議なのが、以前にも書いたことだが、MSの「Visual~」はこうではないことだ。

私はDelphiより前にVisual Basicを見た。フォームにボタンを貼り付けてそれをダブルクリックするとエディタが開いてそこに必要なコードを書く、というのはVBが先にやったことで、それを見たときにはとても感動した。

しかし、VCとかVC++は、そうではないのだ。

フォームの設計も、コーディングする必要があった。
APIがあって、GUIがあって、プログラミング言語があり、それがBasicだったりPascalだったりCだったりC++だったり、というのではないのだ。

CやC++は特別なのだ。

それはおいといて。

そうやって、一番頻繁に書き換えるのが Unit1.pas というファイルである。もちろん、この名前は自由に変えることができる。

そして、IDE上では Unit1.pas と、Form1が、F12を押すことで交互に表示される。

フォーム(ウィンドウ)で見た目をデザインし、中身を Unit1.pas で書くのだな、とすぐにわかる。

Sat Jan 29 05:58:24 2011
あと、Unit1.dfm というファイルがあって、これはテキストファイルで、中身をみるとフォームの定義がされているのがわかる。


object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 293
ClientWidth = 426
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 136
Top = 112
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
end


フォームの名前とかサイズとか、ボタンの位置とか。
これを書き換えればフォームのデザインも変わり、フォームのデザインを書き換えればこのファイルが書き換わる。
まあ、誰だってフォームを見ながらデザインしたいよね。

Project1.dpr
Project1.dproj

この二つもテキストで、名前からしてプロジェクトファイルだとわかる。
Windowsのエクスプローラでも種類に「Delphiプロジェクトファイル」と表示される。

しかし、この二つのファイルがそれぞれどういうものなのかはよくわからない。
たしか、どちらをダブルクリックしてもDelphiのIDEが起動する。

確か、Delphi7までは、.dprしかなかったと思う。
そして、

中身を見ると、.dprojのほうはPascalソースである。
uses のところに Unit1.pas と書かれているから、

Project1.dproj → Unit1.pas

という感じで実行されているのだろうなぁ、とわかる。


program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.


アプリケーションを初期化して、フォームを作って、実行しているんだなぁ、と、わかる。

が、ここを書き換えることもほとんどない。

ただ、例の「フォームを表示しないアプリ」を作ろうとして、いじったことがある。

7のファイルを見てみたが、やっぱり .dprしかなく、.dprojは無い。

そして、7の .dpr が今の .dproj のようにPascalソースである。

.dproj ファイルは、IDEのメニューで「プロジェクト」→「ソース表示」で表示できる。

できた。「フォームを持たないWindowsアプリ」、delphi版。

まず、unit1.pas


unit Unit1;

interface

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

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

//var
// Form1: TForm1;
// OldWndProc : TFarProc;
// Msg : TMsg;

implementation

{$R *.dfm}

begin
ShowMessage('hello');
exit;
end.

行頭が // はコメントです。

そして、プロジェクト(Project1.dproj)の方は、


program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
Application.Initialize;
// Application.MainFormOnTaskbar := True;
// Application.CreateForm(TForm1, Form1);
// Application.ShowMainForm := False;
Application.Run;
end.

ソースを見ると、

TForm1 = class(TForm)

とかあるので、厳密にはフォームを使ってはいるのでしょうが、見えないからいいや。
さあ、これでキャプチャ動作を書けばいけるぞ。

2007はアイコンエディタがないんだっけ!
バカか!

usesでいろいろ余計なものを宣言してるな。
後でいらないものを全部消そう。

VC++で作ったやつは40KBしかないのに、delphiの方は400KB以上ある。
これはダメだ。

プロジェクトのオプションで、「パッケージ再構築」のところの
「実行時パッケージを使って構築」をチェックしたら13KBになった。

ああ、でもこれだとランタイムが必要になるのか。
それはダメだ。

>>xxx (上記のある内容を指す)
これはちょっと勘違いで、今も.dprがパスカルソースです。

>>xxx (上記のある内容を指す)
もしかして「実行時」というのはrun timeを訳したのか?

formを表示しないキャプチャをしたかったのだが、

>>xxx (上記のある内容を指す)
のようにするとformを作成しないので、
当然form.createイベントが発生しない。


posted by delsoli at 18:52| delphi | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。