OSDN Git Service

タグを打ち忘れていたついでに、html版ドキュメントを追加しました。
[ring-lang-081/ring.git] / docs / build / html / _sources / ringqtobjects.txt
1 .. index:: 
2         single: RingQt アプリケーション用のオブジェクトライブラリ; はじめに
3
4 =================================================
5 RingQt アプリケーション用のオブジェクトライブラリ
6 =================================================
7
8 RingQt アプリケーション用のオブジェクトライブラリを学びます。
9
10 Ring には RingQt アプリケーション用のオブジェクトライブラリが付属しています。
11 ウィンドウオブジェクトへのグローバル変数の使用、
12 およびオブジェクト名でイベントをオブジェクトへ接続するのではなく、
13 オブジェクトライブラリは GUI オブジェクトの管理を行います。また、同一クラスから複数ウィンドウを手軽に作成するために、普遍的な API を実装しています。
14 さらにライブラリでは、イベントが発行されたときに実行されるメソッドを手軽に設定する方法があります。
15 同じく子またはサブウィンドウから親または呼び出し元のウィンドウを手軽に使える違和感のないインタフェースを実装しています。
16
17 オブジェクトライブラリは MVC デザインパターンで設計しています。
18
19 オブジェクトライブラリは RingQt へ統合されており RingQt から使えます。
20
21
22 .. index:: 
23         pair: RingQt アプリケーション用のオブジェクトライブラリ; ライブラリの用法
24
25 ライブラリの用法
26 ====================
27
28 * Open_Window(cWindowControllerClassName) 関数で新しいウィンドウを開きます。
29 * 最低でも Controller と View のクラス二本を各ウィンドウごとに作成してください。
30 * WindowsControllerParent クラスから各 Controller クラスを作成します。
31 * WindowsViewParent クラスから各 View クラスを作成します。
32 * Last_Window() 関数は最後に作成されたウィンドウのオブジェクト (Controller オブジェクト) を取得します。
33 * サブウィンドウを呼び出すときは SetParentObject() メソッドの使用、および Self オブジェクトを渡します。
34 * View クラスでは、イベントメソッドを決定するために Method(cMethodName) 関数を使用します。
35 * Method(cMethodName) 関数を実行することで Controller クラスでメソッドを決定します。
36 * 各 Controller クラスはデフォルトで CloseAction() クラスがあり、呼び出すことでウィンドウを閉じます。
37 * ウィンドウごとの Show() メソッドの呼び出しは不要です。 Open_Window() の使用時に呼び出します。
38 * View クラスでは GUI ウィンドウオブジェクトを win 属性で定義します。
39 * Open_WindowNoShow() 関数はウィンドウが表示されるのを回避します。
40 * Open_WindowAndLink() を使うとメソッドからウィンドウへ手軽にアクセスできます。
41
42
43 .. index:: 
44         pair: RingQt アプリケーション用のオブジェクトライブラリ; 用例
45
46 用例
47 ====
48
49 この用例では、二種類のウィンドウを作成します。
50
51 * メインウィンドウにはボタンがあります。ユーザがボタンをクリックしたときにサブウィンドウが開かれます。
52 * ユーザは複数のサブウィンドウを開くためにボタンを何回もクリックできます。
53 * サブウィンドウごとに二つのボタンがあります。
54 * 最初のボタンはサブウィンドウにありメイン、およびサブウィンドウのタイトルのタイトルを変更します。
55 * 次のボタンはサブウィンドウにありサブウィンドウを閉じます。
56
57 .. code-block:: ring
58
59         load "guilib.ring"
60
61         new qApp {
62                 open_window( :MainWindowController )
63                 exec()
64         }
65
66         class MainWindowController from WindowsControllerParent
67                 oView = new MainWindowView
68                 func SubWindowAction
69                         Open_window( :SubWindowController )
70                         Last_Window().SetParentObject(self)
71
72         class MainWindowView from WindowsViewParent
73                 win = new qWidget() {
74                         SetWindowTitle("Main Window")
75                         btnSub = new qPushButton(win) {
76                                 setText("Sub Window")
77                                 setClickEvent( Method( :SubWindowAction ) )
78                         }
79                         resize(400,400)
80                 }
81
82         class SubWindowController from WindowsControllerParent
83                 oView = new SubWindowView
84                 func SetMainWindowTitleAction
85                         Parent().oView.win.SetWindowTitle("Message from the Sub Window")
86                         oView.win.SetWindowTitle("Click Event Done!")
87
88         class SubWindowView from WindowsViewParent
89                 win = new qWidget() {
90                         SetWindowTitle("Sub Window")
91                         btnMsg = new qPushButton(win) {
92                                 setText("Set Main Window Title")
93                                 setClickEvent( Method( :SetMainWindowTitleAction ) )
94                         }
95                         btnClose = new qPushButton(win) {
96                                 Move(200,0)
97                                 setText("Close")
98                                 setClickEvent( Method( :CloseAction ) )
99                         }
100                         resize(400,400)
101                 }
102
103 このスクリーンショットはサブウィンドウを三枚作成しています。
104
105 .. image:: objectslib1.png
106         :alt: オブジェクトライブラリの用例 - スクリーンショット 1
107
108 このスクリーンショットはサブウィンドウごとにボタンをクリックしています。
109
110 .. image:: objectslib2.png
111         :alt: オブジェクトライブラリの用例 - スクリーンショット 2
112
113 .. index:: 
114         pair: RingQt アプリケーション用のオブジェクトライブラリ; Open_WindowAndLink() 関数
115
116 Open_WindowAndLink() 関数
117 =========================
118
119 Open_WindowAndLink() 関数はアプリケーションウィンドウとの間を接続することにより、オブジェクトとの間でメッセージ (メッセージの呼び出し) を渡せます。
120
121 この関数は、ほかのウィンドウの作成で動的オブジェクトを使うために、メタプログラミングによる呼び出し元クラスで動的メソッドの定義で使用します。
122
123 用例 : (フォームデザイナーを使用しています)
124
125 最初のウィンドウ
126
127 (1) https://github.com/ring-lang/ring/blob/master/applications/formdesigner/tests/twowindowspart5/firstwindowView.ring
128
129 (2) https://github.com/ring-lang/ring/blob/master/applications/formdesigner/tests/twowindowspart5/firstwindowController.ring
130
131 次のウィンドウ
132
133 (1) https://github.com/ring-lang/ring/blob/master/applications/formdesigner/tests/twowindowspart5/secondwindowView.ring
134
135 (2) https://github.com/ring-lang/ring/blob/master/applications/formdesigner/tests/twowindowspart5/secondwindowController.ring
136
137 このコードの用例では (FirstWindowController.ring より引用)
138
139 Open_WindowAndLink() は SecondWindowController クラスからオブジェクトを作成します。
140
141 そしてメソッドを追加します : FirstWindowController クラスへ
142 SecondWindow(), IsSecondWindow() メソッドを追加
143
144 さらにメソッドを追加します : SecondWindowController クラスへ
145 FirstWindow(), IsFirstWindow() メソッドを追加
146
147 よって FirstWindowController クラスにある SendMessage() メソッドは
148 SecondWindow() メソッドでオブジェクトにアクセスするために使えます。
149
150 これは Last_Window(), Parent() および
151 SetParentObject() メソッドを使用するより、もっと簡単です。
152
153 .. code-block:: ring
154
155         class firstwindowController from windowsControllerParent
156
157             oView = new firstwindowView
158
159             func OpenSecondWindow
160                 Open_WindowAndLink(:SecondWindowController,self)
161
162             func SendMessage
163                 if IsSecondWindow() 
164                     SecondWindow().setMessage("Message from the first window")
165                 ok
166
167             func setMessage cMessage
168                 oView.Label1.setText(cMessage)
169
170 .. index:: 
171         pair: RingQt アプリケーション用のオブジェクトライブラリ; Open_WindowInPackages() 関数
172
173 Open_WindowInPackages() 関数
174 ============================
175
176 Open_WindowInPackages() 関数は Open_Window() と同じですが、
177 ウィンドウを開く前にインポートを行うパッケージの追加リストを決定します。
178
179 文法:
180
181 .. code-block:: ring
182
183         Open_WindowInPackages(cClassName,aPackagesList)
184
185 用例:
186
187 この用例はフォームデザイナーのソースコードからの引用です。
188 open_windowInPackages() 関数でウィンドウフラグのウィンドウを開きます。
189
190 クラス名 “WindowFlagsController” とパッケージの名前を決定します。
191
192 ウィンドウフラグのウィンドウでは FormDesigner および System.GUI パッケージを使用しています。
193
194 .. code-block:: ring
195
196         open_windowInPackages(:WindowFlagsController,[
197                 "formdesigner",
198                 "System.GUI"
199         ])
200
201 .. index:: 
202         pair: RingQt アプリケーション用のオブジェクトライブラリ; オブジェクトライブラリのソースコード
203
204 オブジェクトライブラリのソースコード
205 ====================================
206
207 ライブラリのソースコードは非常に単純です。ソースコードファイルを確認できます。
208
209 * https://github.com/ring-lang/ring/blob/master/extensions/ringqt/guilib/objectslib/objects.ring
210 * https://github.com/ring-lang/ring/blob/master/extensions/ringqt/guilib/objectslib/subwindows.ring
211 * https://github.com/ring-lang/ring/blob/master/extensions/ringqt/guilib/objectslib/objectslib.ring
212