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 | 更新情報をチェックする

いろいろ、ウィンドウを持たないプログラム

Wed Mar 3 18:19:44 2010
あるフリーのsyslogサーバを使っていたら、delphi7でできているということだった。
俺も作ってみよう。

Thu Jan 27 06:33:34 2011
どうもお久しぶりです。
b.exeという自分で作った「アプリケーション」が重宝している。

これのショートカットをWindowsのタスクバーの「クイック起動」に作っておき、それをクリックするとそのときのデスクトップをキャプチャし、年月日時刻をファイル名として「マイピクチャ」に保存する。ごく簡単で、しかも誰かの書いたコードを借用して、付け足したのではなく余計な部分を取り除いた。

そしてこれはVisual C++で作った。以前買ったことがあり、それではほとんど何も作らなかったのだが、これだけ作った。

このアプリの何がいいかというと、起動してもフォームを表示せず、なにも操作せずにデスクトップのスクリーンショットを保存して終了することだ。「スクリーンショットを取得しますか?」「名前を指定してください」「保存するフォルダを指定してください」「同じ名前のファイルが存在します。上書きしますか?」「終了してよろしいですか?」などという面倒くさいことを一切きかない。

これを使うのはWEBで何かして問い合わせ番号みたいなものが表示されたときとか、メモしておきたい画面があるときとか、右クリックしてコピーするのが禁止されている写真を保存するときなどに使う。とても便利なので職場でも使おうと思ったが、アイコンが無い。いつもアイコンの変更をして、Windowsがもっているカメラのアイコンに変更しているのだが、面倒だからアイコンを組み込んでしまいたい。Delphiではやり方を知っているが、VC++ではどうするのか。

というわけでVisual C++ Expressをインストールしてみる。
「Visual Studioは無料になった」というニュースを見たおぼえがあったのだが、
それはあくまで評価用に使用できるだけのようだ。

最近はなんでもかんでも、OSからアプリからほとんどカネを払わずにできるようになったが、
それに付随する煩雑な仕事を考えると、数千円、数万円を払ったほうがマシだと思うことがよくある。

それはさておき、アイコンの変更ができない。
私の持っていたvc++はたしか2003とかで、2010で開こうとしたら変換された。

「リソース」というところに普通ならアイコンが作られるようだが、もともと無かったためだろうか、何もない。

あらたにアイコンを追加する方法もよくわからない。

2003を実家へとりに行き、そこでアイコンを登録しようか。

たいしたアプリではないから2010で作り直せばいいのだろうが、どうすればいいかわからない。

「WindowsアプリだがWindowを表示しない」というのはとても重要なことだ。
それはコンソールアプリであるとか、DLLであるとかいうことではない。

スクリーンショットを取るのだから、Windowsアプリでなければならない。
しかし、やることはそのときのデスクトップのショットを取ってファイルとして保存すると決まっているから、
ユーザーの操作が介入する余地はない。したがってアプリケーションのWindowsを表示する必要はない、というか、表示してはならない。

DelphiでWindowを表示しないようにする方法を調べるのが一番早いかな。
キャプチャのしかたはさんざんやったから。

「コンソールアプリケーション」って、コマンドプロンプトが開いてしまう。それはイヤだ。
クリックしたら姿を見せずに実行して欲しい。

「フォームを表示しない」のではなく、そもそもフォームを持たないのである。

とりあえず、

Application::Run(gcnew Form1());

を、

Application::Run();

にしたら、何も表示しなくなった。

さて、それから?

Fri Jan 28 06:25:39 2011
ファイルを保存するのはマイピクチャではなく実行ファイルが存在するフォルダである。
マイピクチャにすると、「マイピクチャはどこか」という判断が必要になる。
それも余計だ。

われながらすばらしい。
アイコンさえ組み込めたら、どこかに公開しよう。

ちなみになんでb.exeかというと、最初につけた名前がa.exeで、その次だからだ。

インストールされていた2005を消して、2007を入れなおす。
時間がかかる・・・

まだやってるよ

7で完成してたな。その後はなんだかわけがわからん。
多分、ヘルスバーグが抜けたのがその頃なんだろう。

と思ったら彼が抜けたのは1995年で、しかも「リストラ」によるものだったらしい。
「裏切り者」とか言ってゴメン。

つまり彼はDelphiのごく初期の開発しかしてなかったということだ。

インストーラ2回動かしたっぽい。

ちょっと時間かかりすぎだな。
OSだってこんなにかかんないよ。

Fri Jan 28 08:09:19 2011
「ウィンドウを持たないプログラム」の続きであるが、「常駐」もやめて欲しい。「サービス」もダメ。必要なときだけ登場し、必要な用事を済ませたら跡形も無く消えて欲しい。
posted by delsoli at 18:46| delphi | 更新情報をチェックする

UWSC

08/10/31(Fri) 22:22
私は基本的になんでもかんでもデスクトップに置く。なのですぐにデスクトップがいっぱいになって、いるのかいらないのかわからないようなファイルだらけになる。

今までは、それをいかに整理するかを考えていたのだが、逆に、その状態自体が情報として有用なのではないかと考えた。

ダウンロードしたファイル、何かのメモ、そういったものをタイムスタンプやファイルの種類などで分類して、後から必要なものを探すのではなく、たまった雑多な情報から、アクセス頻度が高かったり同じ名前のファイルを何度も保存しようとしたりするなら、その人にとってそれが重要であるとして、上位に表示するとか。

08/11/24(Mon) 10:38
エンバカデロに買収されて初めてバージョンアップの案内が来た。私は1、2、5、8、2005、2007を買ってきたお得意様である。
さらにTurboC++forWin3.1, Turbo C for DOSも買っている。それも個人の自己啓発というか勉強というか趣味のために。
だが今回はちょっと買えません。一番安いProfessionalのバージョンアップでも43,470円である。
1,2年のペースでこんな具合に買うのは馬鹿らしい。
パーソナル用のフリーバージョンって、今もあるのかな?

09/08/13(Thu) 22:46
UWSCで、アプリケーションに任意のキー操作をさせるのを見て、いいなと思った。
スクリプトを見るとなんだかdelphiでもできそうなのでやってみたらできた。
やりたいのはメディアセンターを起動して右矢印、エンターを押すこと。
できたのだが、formを表示させずに終了したいのだがそのやり方がわからない。

09/08/15(Sat) 04:27
フォームを表示しないようにするには、プロジェクトのソースに以下を追加する。

Application.ShowMainForm:=False;

そして、unit内で

 close;

を書いておけば、終了する。

もっとスマートなやり方があった気がするのだが・・・
まあいいや。


09/08/15(Sat) 04:28
これにより、UWSCでexe化が必要なものがexe化できた。
まあ、delphiにはシェアウェア代金なんかとは比較にならないくらいカネをだしているわけだが・・・

09/10/09(Fri) 21:27
で、UWSCがdelphiでできているということを知った・・・
posted by delsoli at 18:42| delphi | 更新情報をチェックする
×

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