GUIアプリケーションを作ってみる2
[1] nabiki_t 06/01/23 19:47
ところで、前の「GUIアプリケーションを作ってみる1」のやり方だと、生成されるコードがC言語になるのが気になるんだが。
それに、ボタンが押されたとか、ウインドウが閉じられた時なんかのイベントはどうやって捕まえるんだ? それに対する処理はどうやって記述するんだ? 説明してないぞ。
あと一応、目次のページ。
[2] 主筆嬢 06/01/23 19:48
イベントの捕まえ方はこの後で説明するつもり。
でもその前に、いくつか考えなきゃいけないことがある。
それは、前に説明したやり方だと、イベントに対する処理をX-Designerが生成したソースに記述しなきゃならないって事。
[3] nabiki_t 06/01/23 19:50
おいおい、それはちょっと困ったことにならないか?
もし、イベント処理を記述した後でGUIのデザインを変更したら、大変なことにならないか?
[4] 主筆嬢 06/01/23 19:51
一応X-Designerは、コードに対して行われた変更を残したまま、GUIの変更部分だけを更新する様に作られているみたい。
でもそれは不安だから、これからX-Designerが生成したコードには手を入れなくても良いようなやり方を考えてみる。
イベントの記述についてはこの後で説明するつもり。
[5] nabiki_t 06/01/23 19:52
あぁそう、じゃ、がんばって。
[6] 主筆嬢 06/01/23 19:53
頑張ってって何? 頑張ってって。 ちょっとは手伝え。
まったく・・・まぁいいか。
で、まずは構造というか方策というか、を考えてみる。
とりあえずX-Designerが生成したコードには変更を加えたくないのだから、X-DesignerにはC++でクラスを生成させて、人間はそのクラスを継承する方法を考えてみる。

X-Designerは、人間が継承するための仮想クラスと、その仮想クラスが持つ仮想メソッドを呼び出すコードを生成し、人間は呼び出される仮想メソッドをオーバーライドすることで、イベント発生時の処理を記述する。
うまくいけば自動的に生成されるコードには一切手を入れる必要が無くなるはず。
[7] nabiki_t 06/01/23 19:55
この絵は、存在する意味があるのか?
[8] 広告 06/01/23 19:55
[9] 主筆嬢 06/01/23 19:57
何もしない奴は黙ってろ。
[10] 主筆嬢 06/01/23 19:59
以上の事を実現しつつ、前と同じように簡単なGUIアプリケーションを作ってみる。
とりあえず今回は、イベント処理は省略。
[11] 主筆嬢 06/01/23 20:01
まずは先と同様、適当なディレクトリをマウントする。

[12] 主筆嬢 06/01/23 20:02
同じく、Motifアプリケーションシェルを作成する。今回は「TestPrj2Shell」という名前にしておいた。

[13] 主筆嬢 06/01/23 20:03
とりあえず、作成された「TestPrj2Shell」のデザイン画面。

そして、前と同じようにメッセージボックスダイアログを追加する。

[14] 主筆嬢 06/01/23 20:05
今度は、TestPrj2Shellウィジットのコアリソースを編集する。
乳白色の領域にあるTestPrj2Shellという奴を選択して、 ボタンを押下する。

[15] 主筆嬢 06/01/23 20:06
これが表示されたコアリソースを編集するダイアログ。

[16] 主筆嬢 06/01/23 20:08
この画面で「コード生成」と書かれたタブを選択する。

[17] 主筆嬢 06/01/23 20:09
「構造」と書かれたプルダウンメニューの中から「C++/Java クラス」というものを選択する。

これを選択することで、TestPrj2Shellウィジット(及びその子供のウィジット)を表すクラスが生成されるようになる。
[18] 主筆嬢 06/01/23 20:11
「クラス名」というところに「CAppShell」、「インスタンス名」というところに「CTP2Shell」と入力する。

この名前は何でもいいんだけど、必ず異なる名前にする必要がある。
「クラス名」というのは、X-Designerが生成するクラスの名前のこと。「インスタンス名」というのは、X-Designerが生成するコード内で、このクラスをnewするときに使用するクラス名のこと。つまり、人間は「インスタンス名」で指定された名前のクラスを作成しなくてはならないということ。
X-Designerが生成するコード。
class CAppShell
{
・・・
};
extern CAppShell *TestPrj2Shell;
int main( int argc, char *argv[] )
{
・・・
TestPrj2Shell = new CTP2Shell();
・・・
}
|
人間が作成するコード。
class CTP2Shell : public CAppShell
{
・・・
};
|
経験からすると、この名前は慎重に考えた方が良いみたい。とりあえず既存の「クラス名」や「インスタンス名」・ウィジット名なんかと重複しないようにした方が良い、ということは確かだね。
[19] 主筆嬢 06/01/23 20:15
コアリソース編集用のダイアログを閉じて、今度はコード生成の設定を行う。

[20] 広告 06/01/23 20:16
[21] 主筆嬢 06/01/23 20:18
これが表示された「コード生成」ダイアログ

[22] 主筆嬢 06/01/23 20:19
「言語」と書かれたプルダウンメニューの中の「C++」を選択する。

[23] 主筆嬢 06/01/23 20:25
上の画面の、「コード」を書かれたところの横にある「オプション...」ボタンを押下して、「C++ コードのオプション」ダイアログを表示させる。

ここで、「ヘッダファイルをインクルード」と書かれたところに「../TestPrj2_gol.h」と入力する。ここのファイル名は特に何でも構わない。ただ、頭の../は忘れないように。
この設定はX-Designerが生成するコード中に「#include "入力したファイル名"」を追加させるためのもの。
>>18のコードをよく見てもらえば解ると思うけど、X-Designerが生成したコード中に「new CTP2Shell();」という記述がある。
つまり、この時点までに「class CTP2Shell{ ・・・ };」が記述されたファイルをインクルードしていなければならない。
だから、X-Designerには何か一つファイルをインクルードするコードを生成させて、そのファイル内で人間が記述したファイルをインクルードしよう、という考え。
で、何で「../」が必要なのかというと、それはX-Designerは「Sun-sparc-Solaris(これは変更できる)」というフォルダ内にコードを生成するから、人間様が作成したファイルは、相対的に見れば一つ上の階層にある、という形になるため。
以上のことを絵にするとこうなる。

この絵で「TP2Shell.h」が「>>18の人間が作成するコード」で、TestPrj2Shell.ccが「>>18のX-Designerが生成するコード」に該当する。
だから、この関係を見据えた上で「ヘッダファイルをインクルード」の所に「../TestPrj2_gol.h」と入力する。
[24] 主筆嬢 06/01/23 20:27
上の設定をやったら、「C++ コードのオプション」ダイアログは閉じる。
そして「コード生成」ダイアログも閉じる。ただ、ここでは絶対「生成」ボタンは押さないこと。閉じるには「適用」を押して「閉じる」ボタンを押すこと。
今の段階でコードを生成すると、TestPrj2ディレクトリにコードが撒き散らされることになる。
そうじゃなくて、X-Designerにはコンパイル時にコードを生成するようにしてもらいたいから、ここではコード生成は行わない。
[25] 主筆嬢 06/01/23 20:28
X-Designerの画面も閉じて、メインの画面に戻る。

ここで必要なファイルを作成して、コードを記述する。
とりあえず私が作成した三つのファイルを公開する。
TP2Shell.h
TP2Shell.cc
TestPrj2_gol.h
[26] nabiki_t 06/01/23 19:30
ところで、一つ質問したいんだが・・・
TestPrj2_gol.hのgolってなんだ? ゴルァの略か?
[27] 主筆嬢 06/01/23 20:31
そんなわけない。
それはGlobalを略してgloとしたかったんだけど、打ち間違えてgolとしてしまった上に画面をキャプチャしちゃったから、そのまま作業を進めただけ。
細かいことは気にするな。
[28] nabiki_t 06/01/23 19:32
相変わらず強引な奴だ。
[29] 広告 06/01/23 20:34
[30] 主筆嬢 06/01/23 20:38
暇人は放っておいて、次に進む。
この後はMakefileを作ってコンパイルするだけ。
とりあえず「新規ウィザード」でMakefileを作成する過程を示しておく。














[31] 主筆嬢 06/01/23 20:40
Makefileを生成した後の画面。

[32] 主筆嬢 06/01/23 20:43
この後が厭なんだけど、なんかこの、生成されたMakefileを人間が手で修正しなきゃいけないみたい。
なぜかというと、このままではコンパイルが通らないから。だから次の点を修正する。
まず、XDROOTという変数を設定しているところを削除する。これはX-Designerが生成したコードが参照するクラスライブラリのヘッダファイルとライブラリのパスを設定する奴なんだけど、なぜか知らないけどこれが間違っててコンパイルが通らない。だから全部手動で設定することにする。
次に、BASICOPTSに設定している値(XDROOTの何行か上の方にある)に、"-I/opt/SUNWspro/prod/src/xdclass/h"を追加する。
OBJS_TestPrj2に設定している値に"/opt/SUNWspro/prod/src/xdclass/lib/libxdclass.a"を追加。
「# リンクまたはアーカイブ」と書かれている行の次の行にある、$(OBJS_TestPrj2)を$(TARGETDIR_TestPrj2)/$(XD_OBJS_FILE_TestPrj2_TestPrj2Shell_xd)の後に持ってくる。
この変更でコンパイルできるようになるはず。
一応、変更後のMakefileを公開しておく。
[33] 主筆嬢 06/01/23 20:45
本来なら機械生成されたMakefileを手で修正するのはナンセンスな気がするんだけど、これはどうしようもないみたい。
そもそも、ファイルが追加・削除されたときには>>30の作業をもう一度やるか、そうでなければ手作業で変更するしかない。
だから、これ以後Makefileは全部人間が面倒を見るものだと思って諦めるしかないみたい。
[34] 主筆嬢 06/01/23 20:46
上の作業で作成したMakefileを使ってコンパイルする。

コンパイルに成功すれば、こういう画面になる。
[35] 主筆嬢 06/01/23 20:47
Sun-sparc-SolarisというディレクトリにTestPrj2という実行形式のファイルが作成された。

これを実行すると、こういう画面が表示される。

今はまだ何も出来ないから、これはこのまま閉じるしかない。
[36] nabiki_t 06/01/23 19:49
これだけの作業をやって、表示できるのがたったこれだけか。
まぁ、Motifのコードを全部手作業で記述する労力に比べればなんでもないが。それでもVBみたいな奴と比較すると、げんなりするな。
[37] 主筆嬢 06/01/23 20:52
仕方ないじゃん。これはそう言うもんなんだし。
あと、一部は再掲になるけど、このページで作成したプログラムを全部公開しておく。
Makefile
TP2Shell.h
TP2Shell.cc
TestPrj2_gol.h
TestPrj2Shell.xd
なんの意味もないプログラムだけど、何かの参考にでもなれば。
それと、今後はこのプログラムをたたき台に、イベントの追加やその他諸々を解説していく予定。まぁ、気力があればの話だけど。
[38] 匿名希望 06/01/23 20:55
目次はこちら・・・
あ゛〜 今回は長かったな。
|