目次 |
Delphiは、比較的マイナーな言語ではありますが、速度面でC++に引けをとらず、
単独での開発パフォーマンスとしては、効率がとてもよい言語です。
ユーザーインターフェースとなるコンポーネントが整然としており、
インラインアセンブラも使用できます。
また、コンパイル速度が非常に速いのも特徴です。
多次元配列 | 有り |
---|---|
連想配列 | 無し |
関数型 | 有り function |
ポインタ型 | 有り type TPVar = ^TVar; |
抽象ポインタ型 | 有り,Pointer型 |
関数の中に関数を記述 | 可能 |
正規表現 | 標準では無しだがBregExp?などで可能 |
クラス | 有り |
プリプロセッサディレクティブ | 一部有り |
条件分岐 | if |
多岐分岐 | case X of val1: begin end |
列挙型 | type tenum = ( A, B, C, D); |
自作ユニット、コンポーネントなどで構成されます。
単一プロジェクトファイル | (.dpr) |
---|---|
ソースファイル | (.pas) |
コンパイル済みファイル | (.dcu) |
パッケージファイル | (.dpk) |
Delphiの特徴として、集合型があります。
set of で要素を記述します。
引数として渡すときなど、[ ] で囲うことで集合になります。
型が混ざってよい可変のパラメータです。 呼び出すときには、[]で要素をくくります。
確保
GetMem(p,size);
解放
Dispose(p);
ポインタ変数名: ^指す型名;
言語 | 型修飾子 |
---|---|
C | * |
Delphi | ^ |
Cの「*ポインタ変数名」に当たる演算子は、
Delphiでは逆参照と呼び、「ポインタ変数名^」となる。
参照 | 文字 |
C | 前置 | * |
---|---|---|
Delphi | 後置 | ^ |
C | (void*) |
---|---|
Delphi | Pointer |
逆参照はできない。
1 2 |
|
C | (型名)対象 または 型名(対象) |
---|---|
Delphi | (対象 as 型名) または 型名(対象) |
1 2 3 4 5 6 |
|
TWndMethod? : ウィンドウプロシージャの型
1 |
|
オブジェクト定義された関数のアドレスを得るのは簡単ですが、
手続きを直接記述して書かれた関数のアドレスは通常のやり方では取得できません。
of object でタイプ定義するか、
ウィンドウ関数はMakeObjectInstance?(関数名)で取得できます。
1 2 3 4 5 |
|
Delphiの実行ファイルは通常かなりサイズが大きいですが、
小さくすることができます。
「ライブラリの参照」から、
動作させる環境で必要のないものだけを除きます。
(除いた後の動作確認を忘れずに)
そして、プロジェクトオプションの、「実行時のパッケージで再構築」の、
部分に、必要なものだけを記述して再構築します。
(Delphi6Personal)
古いバージョンで作られたパッケージをインストールするときに、
このエラーが出ることがあります。
DsgnIntfは名前が変わって2つになっています。
Delphiは1つのユニットの中に複数のクラス定義をかけます。
private,protected,public,published のアクセス制御があります。
ウィンドウプロシージャを取り替えて自分の関数に切り替えることで
メッセージをトラップします。
スレッドと呼ぶ処理単位を別個に作り、ただ一本の処理ラインではなく、
同時並行的に処理できるラインを追加します。
重い処理などで、処理が帰ってこずにウィンドウが固まってしまうような状態がありますが、
マルチスレッドにすることでインターフェースが固まる事態を避けられます。
アプリケーションの本体の処理を受け持つラインをメインスレッドといいます。
スレッドの処理はExcecuteプロシージャに書きます。
また、メインスレッドが持つオブジェクトにアクセスする部分は、
排他制御が必要で、安全性を保つため
必ずスレッドクラスのSynchronizeメソッドを通じて処理を行います。
Synchronize(関数名);という風になります。
このSynchronizeメソッドは、メインスレッドから呼び出されるようになっています。
つまり、メインスレッドを一時停止させてSynchronizeが呼び出されます。
そのためSynchronizeの間はメインスレッドは停止します。
Synchronizeの処理が大きすぎるとマルチスレッドの恩恵が少なくなるので
Synchronizeはなるべく小さくするようにします。
//ここでスレッドを生成し、処理を実行
1 |
|
スレッドがいつ終わるかはわからないので、
終わったときに処理を呼び出してもらいます。
onTerminate にプロシージャを設定します。
1
2
| - ! |
|
スレッドは、suspend と resume メソッドで一時停止したり、再開したりできます。
参照:http://www.hexe19.net/doxygen/quickstart-delphi.html
通常ウィンドウの外にマウスが出るとリリースになりますが、
マウスがダウンされ、ドラッグされている状態では、リリースは起きません。
ドラッグ状態であればウィンドウ外でもキャプチャが続くという事です。
ウィンドウ外でマウスアップされた時、自動的にリリースされます。
しかしここで、ドラッグの状態からウィンドウの外でマウスアップされたとき、
それまでキャプチャ権限はこちらのウィンドウにあったにも関わらず、
こちらのウィンドウのマウスアップイベントハンドラより先に、
他のウィンドウがイベントを受け取ってしまう事があります。
キャプチャのリリースがハンドリングよりも前に起き、その後に他の
ウィンドウのハンドラが起動し、更にその後に回ってくるということです
(ドラッグ状態→マウスアップ→自動リリース→
他のウィンドウのイベント起動→こちらのイベント起動)
順番が一番最後になってしまうために、そのタイミングでマウスアップメッセージを
送信しても、先に相手が反応して描画などを起こしてしまえば意味が無くなります。
こちらのイベントが起動する前に相手のイベントが起動したらまずい場合には、
対策を考える必要があります。