OSDN Git Service

・presentaion : 日本語訳の追加 (odp/pdf)
[ring-lang-081/ring.git] / docs / ja-jp / source / whatisnew5.txt
1 .. index:: 
2         single: Ring 1.5 の変更履歴; はじめに
3
4 =======================
5 Ring 1.5 の変更履歴
6 =======================
7
8 Ring 1.5 公開版の新機能と変更点を学びます。
9
10 .. index:: 
11         pair: Ring 1.5 の変更履歴; 新機能と変更リスト
12
13 新機能と変更リスト
14 ==================
15
16 Ring 1.5 の新機能!
17
18 * Video-Music-Player アプリケーション
19 * Windows StartUp Manager アプリケーション
20 * Calculator アプリケーション
21 * Ring ノートパッドの改善
22 * StdLib の改善
23 * WebLib の改善
24 * RingQt の改善
25 * オブジェクトライブラリの改善
26 * RingFreeGLUT 拡張機能
27 * RingOpenGL 拡張機能
28 * 拡張機能用のコード生成器の改善
29 * 拡張機能用のドキュメント生成器の改善
30 * Ring 仮想計算機 - トレース関数
31 * トレースライブラリとインタラクティブデバッガ
32 * より柔軟性のあるシンタックス
33 * 型ヒントライブラリ
34 * 品質の改善
35
36 .. index:: 
37         pair: Ring 1.5 の変更履歴; Video-Music-Player アプリケーション
38
39 Video-Music-Player アプリケーション
40 ===================================
41
42 Video-Music-Player アプリケーションを Applications フォルダへ追加しました。
43
44 スクリーンショット:
45
46 .. image:: videomusicplayer.jpg
47         :alt: Video Music Player
48
49 .. index:: 
50         pair: Ring 1.5 の変更履歴; Windows StartUp Manager アプリケーション
51
52 Windows StartUp Manager アプリケーション
53 ========================================
54
55 Windows StartUp Manager アプリケーション
56
57 URL : https://github.com/ring-lang/WinStartupManager
58
59 スクリーンショット:
60
61 .. image:: winstartupman.jpg
62         :alt: Windows Startup Manager
63
64 .. index:: 
65         pair: Ring 1.5 の変更履歴; Calculator アプリケーション
66
67 Calculator アプリケーション
68 ===========================
69
70 Calculator アプリケーションを Applications フォルダへ追加しました。
71
72 スクリーンショット:
73
74 .. image:: calcapp.jpg
75         :alt: Calculator アプリケーション
76
77
78 .. index:: 
79         pair: Ring 1.5 の変更履歴; Ring ノートパッドの改善
80
81 Ring ノートパッドの改善
82 =======================
83
84 ① Ring ノートパッドは新しいスタイル、およびメインファイルツールバーを搭載するために更新しました。
85
86 メインファイルツールバーの考えは、プロジェクトに複数のソースコードのファイルがある場合に
87 プロジェクトのメインファイルを決定することです。
88
89 この機能を使うとプロジェクトでほかのファイルを開いているときに、
90 プロジェクトを実行するためにメインファイルを切り替えることなくプロジェクト (メインファイル) を実行できます。
91
92 この機能を使うには、プロジェクトのメインファイルを開きます。
93
94 現在のソースコードファイルをメインファイルとして設定するには Ctrl+Shift+M を押してください。
95
96 プロジェクトで別のソースコードファイルを開いて修正します。
97
98 プロジェクト (メインファイル) を実行したいときは Ctrl+Shift+F5 (GUI) または Ctrl+Shift+D (コンソール) を押してください。
99
100 スクリーンショット:
101
102 .. image:: rnote15shot1.png
103         :alt: Ring Notepad
104
105
106 .. image:: rnote15shot2.png
107         :alt: Ring Notepad
108
109
110 .. image:: rnote15shot3.png
111         :alt: Ring Notepad
112
113 ② 改行の正確な表示、および “Clear” ボタンを実装するために実行結果ウィンドウを更新しました。
114
115 スクリーンショット: 
116
117 .. image:: rnote15output.png
118         :alt: 実行結果ウィンドウ
119
120 ③ バックグラウンド処理で関数、クラスのリストを準備している間に、
121 大規模ファイルをすばやく開いて切り替えることができるようにするために Ring ノートパッドを更新しました。
122
123 スクリーンショット: 
124
125 .. image:: rnote15events.png
126         :alt: Ring ノートパッド - 大規模ファイル
127
128
129 .. index:: 
130         pair: Ring 1.5 の変更履歴; StdLib の改善
131
132 StdLib の改善
133 =============
134
135 新しい関数
136
137 * Print2Str()
138 * ListAllFiles()
139 * SystemCmd()
140
141 ① 新しい関数 Print2Str() を StdLib へ追加しました。
142
143 用例:
144
145 .. code-block:: ring
146
147         load "stdlib.ring"
148
149         world = "World!"
150         mystring = print2str("Hello, #{world} \nIn Year \n#{2000+17} \n")
151
152         see mystring + nl
153
154 実行結果:
155
156 .. code-block:: ring
157
158         Hello, World!
159         In Year
160         2017
161
162 ② 新しい関数 ListAllFiles() を StdLib へ追加しました。
163
164 この関数を使うとフォルダにあるファイルのグループ、およびそのサブフォルダを手軽に処理できます。
165
166 用例:
167
168 .. code-block:: ring
169
170             load "stdlib.ring"
171             aList = ListAllFiles("c:/ring/ringlibs","ring") # *.ring のみ
172             aList = sort(aList)
173             see aList
174
175 用例:
176
177 .. code-block:: ring
178
179             load "stdlib.ring"
180             see listallfiles("b:/ring/ringlibs/weblib","") # 全ファイル
181
182
183 ③ 新しい関数 SystemCmd() を StdLib へ追加しました。
184
185 この関数は System() 関数と同じくシステムコマンドを実行できますが、
186 実行結果は文字列で返されます。
187
188 用例:
189
190 .. code-block:: ring
191
192         cYou = SystemCmd("whoami")
193         See "SystemCmd: whoami ====="+ nl + cYou +nl
194
195 実行結果:
196
197 .. code-block:: ring
198
199         SystemCmd: whoami =====
200         desktop-umberto\umberto
201
202 .. index:: 
203         pair: Ring 1.5 の変更履歴; WebLib の改善
204
205 WebLib の改善
206 =============
207
208 HTMLPage クラスを搭載するために WebLib を更新しました。
209
210 このクラスは標準出力を経由せずに HTML ドキュメントを作成します。
211
212 ウェブアプリケーションだけで WebLib を使うときの代用になります。
213
214 また、コンソール、 GUI、モバイル用のアプリケーションでも使えます。
215
216 用例:
217
218 .. code-block:: ring
219
220         load "stdlib.ring"
221         load "weblib.ring"
222
223         import System.Web
224
225         func main
226
227                 mypage = new HtmlPage {
228                         h1 { text("Customers Report") }
229                         Table
230                         {
231                                   style = stylewidth("100%") + stylegradient(4)
232                                   TR
233                                   {
234                                         TD { WIDTH="10%" text("Customers Count : " )  }
235                                         TD { text (100) }
236                                   }
237                         }
238         
239                         Table
240                         {
241                                   style = stylewidth("100%") + stylegradient(26)
242                                   TR
243                                   {
244                                         style = stylewidth("100%") + stylegradient(24)
245                                         TD { text("Name " )  }
246                                         TD { text("Age" ) }
247                                         TD { text("Country" ) }
248                                         TD { text("Job" ) }     
249                                         TD { text("Company" ) }
250                                   }
251                                   for x =  1 to 100
252                                         TR
253                                         {
254                                                 TD { text("Test" )  }
255                                                 TD { text("30" ) }
256                                                 TD { text("Egypt" ) }
257                                                 TD { text("Sales" ) }   
258                                                 TD { text("Future" ) }
259                                         }
260                                   next
261                         }
262
263                 }
264
265                 write("report.html",mypage.output())
266
267 このクラスにより WebLib と GUILib で手軽にレポートを作成できます。
268
269 用例:
270
271 .. code-block:: ring
272
273         load "stdlib.ring"
274         load "weblib.ring"
275         load "guilib.ring"
276
277         import System.Web
278         import System.GUI
279
280         new qApp {
281                 open_window(:CustomersReportController)
282                 exec()
283         }
284
285         class CustomersReportController
286
287                 oView = new CustomersReportView
288
289                 func Start
290                         CreateReport()
291
292                 func CreateReport
293                         mypage = new HtmlPage {
294                                 h1 { text("Customers Report") }
295                                 Table
296                                 {
297                                         style = stylewidth("100%") + stylegradient(4)
298                                         TR
299                                         {
300                                                 TD { WIDTH="10%" 
301                                                         text("Customers Count : " )  }
302                                                 TD { text (100) }
303                                         }
304                                 }
305                                 Table
306                                 {
307                                         style = stylewidth("100%") + stylegradient(26)
308                                         TR
309                                         {
310                                                 style = stylewidth("100%") +
311                                                         stylegradient(24)
312                                                 TD { text("Name " )  }
313                                                 TD { text("Age" ) }
314                                                 TD { text("Country" ) }
315                                                 TD { text("Job" ) }     
316                                                 TD { text("Company" ) }
317                                         }
318                                         for x =  1 to 100
319                                                 TR
320                                                 {
321                                                         TD { text("Test" )  }
322                                                         TD { text("30" ) }
323                                                         TD { text("Egypt" ) }
324                                                         TD { text("Sales" ) }   
325                                                         TD { text("Future" ) }
326                                                 }
327                                         next
328                                 }
329                         }
330                         write("report.html",mypage.output())
331
332                 func PrintEvent
333                         printer1 = new qPrinter(0) {
334                                 setoutputformat(1)
335                                 setoutputfilename("report.pdf")
336                         }
337                         oView {
338                                 web.print(printer1)
339                                 web.show()
340                         }
341                         system ("report.pdf")
342
343         class CustomersReportView
344
345                         win = new window() {
346                                         setwindowtitle("Report Window")
347                                         setgeometry(100,100,500,500)
348                                         web = new webview(win) {
349                                                 setgeometry(100,100,1000,500)
350                                                 loadpage(new qurl("file:///"+
351                                                 currentdir()+"/report.html"))
352                                         }
353                                         new pushbutton(win) {
354                                                         setGeometry(100,20,100,30)
355                                                         settext("Print")
356                                                         setclickevent(Method(:PrintEvent))
357                                         }
358                                         showMaximized()
359                                 }
360
361 スクリーンショット:
362
363 .. image:: ring15reportshot.png
364         :alt: 顧客報告書
365
366
367 .. index:: 
368         pair: Ring 1.5 の変更履歴; RingQt の改善
369
370 RingQt の改善
371 =============
372
373 新しいクラスを RingQt へ追加しました:
374
375 * QStringRef
376 * QMutex
377 * QMutexLocker
378 * QBuffer
379 * QBluetoothAddress
380 * QBluetoothDeviceDiscoveryAgent
381 * QBluetoothDeviceInfo
382 * QBluetoothHostInfo
383 * QBluetoothLocalDevice
384 * QBluetoothServer
385 * QBluetoothServiceDiscoveryAgent
386 * QBluetoothServiceInfo
387 * QBluetoothSocket
388 * QBluetoothTransferManager
389 * QBluetoothTransferReply
390 * QBluetoothTransferRequest
391 * QBluetoothUuid
392
393 用例:
394
395 .. code-block:: ring
396
397         ### ウェブサイト - vpic.nhtsa.dot.gov - へ VIN (Vehicle Id Number : 車両識別番号) を提出します。
398         ### 返された XML データを解析します。
399         ### 車両情報の結果を表示します
400
401         load "libcurl.ring"
402         load "guilib.ring"
403         load "stdlib.ring"
404
405         curl = curl_easy_init()
406
407         # request = "3G1JC5248YS251015?format=xml"  ### VIN - シボレー
408           request = "3GYFK62847G247323?format=xml"  ### VIN - キャデラック
409
410         call_type   = "decodevinvalues/"
411         url         = "https://vpic.nhtsa.dot.gov/api/vehicles/"
412         url_request = url + call_type + request
413
414                 See "URL Request: "+ url_request +nl
415
416         curl_easy_setopt(curl, curlopt_url, url_request)
417         response = curl_easy_perform_silent(curl);
418                 
419                 See nl +"Response Raw: "+ response +nl +nl
420
421         curl_easy_cleanup(curl)
422
423         xml = new qxmlstreamreader()
424         xml.adddata_2(response)
425
426         x = new qstringref()
427         while not xml.atend()
428                    if xml.error()
429                                    see xml.errorstring() see nl
430                                    exit loop
431                    ok
432
433                    x = xml.text()
434                    if not x.length() = 0
435                                    see "Length: " see x.length() +" --- "
436                                    see "Value: " see x.tostring() see nl
437                    ok
438
439                    xml.readnext()
440         end
441
442         get x
443
444         ###------------------------------------------
445         ### 実行結果:
446         #
447         # ==>Value: 115
448         # ==>Value: Results returned successfully
449         # ==>Value: VIN(s): 3G1JC5248YS251015
450         # ==>Value: 3G1JC5248YS251015
451         # ==>Value: Sedan/Saloon
452         # ==>Value: 4
453         # ==>Value: 2200.0
454         # ==>Value: 134.25223700841
455         # ==>Value: 2.2
456         # ==>Value: 4
457         # ==>Value: LN2
458         # ==>Value: CHEVROLET
459         # ==>Value: GENERAL MOTORS LLC
460         # ==>Value: Cavalier
461         # ==>Value: 2000
462         # ==>Value: Ramos Arzipe
463         # ==>Value: PASSENGER CAR
464         # ==>Value: 4
465         # ==>Value: In-Line
466         # ==>Value: 1st Row (Driver & Passenger)
467         # ==>Value: Sequential Fuel Injection (SFI)
468         # ==>Value: Mexico
469         # ==>Value: NA
470         # ==>Value: Manual
471         # ==>Value: Body Type: Sedan, 4-6 Window, Notchback (GM codes: 19, 69)
472         # ==>Value:  Name Plate: Chevrolet, Pontiac
473         # ==>Value: 0 - VIN decoded clean. Check Digit (9th position) is correct
474         # ==>Value: LAN
475         # ==>Value: 984
476         #
477         ###-----------------------------------------
478
479 .. index:: 
480         pair: Ring 1.5 の変更履歴; オブジェクトライブラリの改善
481
482 オブジェクトライブラリの改善
483 ============================
484
485 オブジェクトライブラリに Open_WindowInPackages() 関数を追加しました。
486
487 Open_WindowInPackages() 関数は Open_Window() と同じですが、
488 ウィンドウを開く前にインポートを行うパッケージの
489 追加リストを決定します。
490
491 文法:
492
493 .. code-block:: ring
494
495         Open_WindowInPackages(cClassName,aPackagesList)
496
497 用例:
498
499 この用例はフォームデザイナーのソースコードから引用したものです。
500 open_windowInPackages() 関数でウィンドウフラグのウィンドウを開きます。
501
502 クラス名 “WindowFlagsController” とパッケージ名を決定します。
503
504 ウィンドウフラグのウィンドウでは FormDesigner および System.GUI パッケージを使用しています。
505
506 .. code-block:: ring
507
508         open_windowInPackages(:WindowFlagsController,[
509                 "formdesigner",
510                 "System.GUI"
511         ])
512
513
514 .. index:: 
515         pair: Ring 1.5 の変更履歴; RingFreeGLUT 拡張機能
516
517 RingFreeGLUT 拡張機能
518 =====================
519
520 Ring 1.5 には FreeGLUT ライブラリへ対応するために RingFreeGLUT 拡張機能があります。
521
522 用例:
523
524 .. code-block:: ring
525
526         /*
527                 このサンプルは C チュートリアルを元にしています。
528                 出典元 : http://www.lighthouse3d.com/tutorials/glut-tutorial/
529         */
530
531         load "freeglut.ring"
532         load "opengl21lib.ring"
533
534
535         // カメラ方向の回転角度
536         angle = 0.0
537
538         // 実際のベクトルはカメラ方向を表しています。
539         lx=0.0 lz=-1.0
540
541         // カメラの XZ 位置
542         x=0.0  z=5.0
543
544         // キーの状態
545         // キーを押していない時の変数は 0 です。
546         deltaAngle = 0.0
547         deltaMove = 0
548         xOrigin = -1
549
550         // メニューを定義するための定数
551         C_RED  = 1
552         C_GREEN = 2
553         C_BLUE = 3
554         C_ORANGE = 4
555
556         C_FILL = 5
557         C_LINE = 6
558
559         // ポップアップメニューの定義
560         fillMenu=NULL
561         fontMenu=NULL
562         mainMenu=NULL
563         colorMenu=NULL
564
565         // 鼻の配色
566         red = 1.0
567         blue=0.5
568         green=0.5
569
570         // 雪だるまの大きさ
571         scale = 1.0
572
573         // メニューの状態
574         menuFlag = 0
575
576         // デフォルトのフォント
577         font = GLUT_BITMAP_TIMES_ROMAN_24
578
579         C_INT_GLUT_BITMAP_8_BY_13 = 7
580         C_INT_GLUT_BITMAP_9_BY_15 = 8
581         C_INT_GLUT_BITMAP_TIMES_ROMAN_10  = 9
582         C_INT_GLUT_BITMAP_TIMES_ROMAN_24  = 10
583         C_INT_GLUT_BITMAP_HELVETICA_10  = 11
584         C_INT_GLUT_BITMAP_HELVETICA_12  = 12
585         C_INT_GLUT_BITMAP_HELVETICA_18  = 13
586
587         // ウィンドウの幅と高さ
588         h = 0
589         w = 0
590
591         // 一秒あたりのフレーム数を計算するための変数
592         frame=0
593         time=0
594         timebase=0
595         s = ""
596
597         func changeSize
598                 w = glutEventWidth()
599                 h = glutEventHeight()
600
601                 // ウィンドウの大きさが小さすぎる場合に、ゼロ除算エラーになるのを防ぎます。
602                 // (幅 0 のウィンドウは作成できません)
603                 if h = 0
604                         h = 1
605                 ok
606
607                 ratio =  w * 1.0 / h
608
609                 // 投射行列の使用
610                 glMatrixMode(GL_PROJECTION)
611
612                 // 行列のリセット
613                 glLoadIdentity()
614
615                 // ウィンドウ全体のビューポートを設定します。
616                 glViewport(0, 0, w, h)
617
618                 // 正しい遠近法の設定。
619                 gluPerspective(45.0, ratio, 0.1, 100.0)
620
621                 // Modelview の復帰
622                 glMatrixMode(GL_MODELVIEW)
623
624         func drawSnowMan
625
626                 glScalef(scale, scale, scale)
627                 glColor3f(1.0, 1.0, 1.0)
628
629         // 体の描画
630                 glTranslatef(0.0 ,0.75, 0.0)
631                 glutSolidSphere(0.75,20,20)
632
633         // 頭の描画
634                 glTranslatef(0.0, 1.0, 0.0)
635                 glutSolidSphere(0.25,20,20)
636
637         // 目の描画
638                 glPushMatrix()
639                 glColor3f(0.0,0.0,0.0)
640                 glTranslatef(0.05, 0.10, 0.18)
641                 glutSolidSphere(0.05,10,10)
642                 glTranslatef(-0.1, 0.0, 0.0)
643                 glutSolidSphere(0.05,10,10)
644                 glPopMatrix()
645
646         // 鼻の描画
647                 glColor3f(red, green, blue)
648                 glRotatef(0.0,1.0, 0.0, 0.0)
649                 glutSolidCone(0.08,0.5,10,2)
650
651                 glColor3f(1.0, 1.0, 1.0)
652
653         func renderBitmapString x,y,z,font,string
654                 glRasterPos3f(x, y,z)
655                 for c in string
656                         glutBitmapCharacter(font,ascii(c))
657                 next
658
659         func renderStrokeFontString x,y,z,font,string
660                 glPushMatrix()
661                 glTranslatef(x, y,z)
662                 glScalef(0.002, 0.002, 0.002)
663                 for c in string
664                         glutStrokeCharacter(font, Ascii(c));
665                 next
666                 glPopMatrix()
667
668
669         func restorePerspectiveProjection
670
671                 glMatrixMode(GL_PROJECTION)
672                 // 以前の投射行列へ復帰
673                 glPopMatrix()
674
675                 // modelview モードへ復帰
676                 glMatrixMode(GL_MODELVIEW)
677
678
679         func setOrthographicProjection
680
681                 // 投射モードの切り替え
682                 glMatrixMode(GL_PROJECTION)
683
684                 // 透視図の設定を有する
685                 // 以前の行列を保存します。
686                 glPushMatrix()
687
688                 // 行列のリセット
689                 glLoadIdentity()
690
691                 // 2D 正投射の設定
692                 gluOrtho2D(0, w, h, 0)
693
694                 // modelview モードへ復帰切り替え
695                 glMatrixMode(GL_MODELVIEW)
696
697
698
699         func computePos deltaMove
700
701                 x += deltaMove * lx * 0.1
702                 z += deltaMove * lz * 0.1
703
704
705         func renderScene
706
707                 if  deltaMove
708                         computePos(deltaMove)
709                 ok
710
711                 // 配色と深度バッファの消去
712                 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
713
714                 // 変換のリセット
715                 glLoadIdentity()
716
717                 // カメラの設定
718                 gluLookAt(      x, 1.0, z,
719                                 x+lx, 1.0,  z+lz,
720                                 0.0, 1.0,  0.0)
721
722                 // 地面の描画
723
724                 glColor3f(0.9, 0.9, 0.9)
725                 glBegin(GL_QUADS)
726                         glVertex3f(-100.0, 0.0, -100.0)
727                         glVertex3f(-100.0, 0.0,  100.0)
728                         glVertex3f( 100.0, 0.0,  100.0)
729                         glVertex3f( 100.0, 0.0, -100.0)
730                 glEnd()
731
732         // 9 体の雪だるまを描画
733                 for i = -3 to -1
734                         for j = -3 to -1
735                                 glPushMatrix()
736                                 glTranslatef(i*10.0, 0.0, j * 10.0)
737                                 drawSnowMan()
738                                 number = (i+3)*3+(j+3)
739                                 renderBitmapString(0.0, 0.5, 0.0,font ,""+number)
740                                 glPopMatrix()
741                         next
742                 next
743
744                 // 一秒あたりのフレーム数を計算するためのコード
745                 frame++
746
747                 time=glutGet(GLUT_ELAPSED_TIME)
748                 if time - timebase > 1000 
749                         s = "RingFreeGLUT - FPS: " + (frame*1000.0/(time-timebase))
750                         timebase = time
751                         frame = 0
752                 ok
753
754                 // ビットマップフォントで文字列 (fps) を表示するためのコード
755                 setOrthographicProjection()
756
757                 glPushMatrix()
758                 glLoadIdentity()
759                 renderBitmapString(5,30,0,GLUT_BITMAP_HELVETICA_18,s)
760                 glPopMatrix()
761
762                 restorePerspectiveProjection()
763
764                 glutSwapBuffers()
765
766
767         // -----------------------------------
768         //             キーボード
769         // -----------------------------------
770
771         func processNormalKeys
772                 key = glutEventKey()
773                 xx = glutEventX()
774                 yy = glutEventY() 
775
776                 switch key
777                         on 27
778                                 glutDestroyMenu(mainMenu)
779                                 glutDestroyMenu(fillMenu)
780                                 glutDestroyMenu(colorMenu)
781                                 glutDestroyMenu(fontMenu)
782                                 Shutdown()
783                 off
784
785
786         func pressKey 
787
788                 key = glutEventKey()
789                 xx = glutEventX()
790                 yy = glutEventY()
791
792                 switch key
793                         on GLUT_KEY_UP 
794                                  deltaMove = 0.5
795                         on GLUT_KEY_DOWN 
796                                 deltaMove = -0.5
797                 off
798
799
800         func releaseKey
801
802                 key = glutEventKey()
803
804                 switch key
805                         on GLUT_KEY_UP 
806                                 deltaMove = 0 
807                         on GLUT_KEY_DOWN
808                                 deltaMove = 0  
809                 off
810
811
812         // -----------------------------------
813         //             マウス
814         // -----------------------------------
815
816         func mouseMove
817                 xx = glutEventX()
818                 yy = glutEventY()
819
820                 // これは左ボタンを押したときのみ true になります。
821                 if xOrigin >= 0
822
823                         // deltaAngle の更新
824                         deltaAngle = (xx - xOrigin) * 0.001
825
826                         // カメラの方向を更新
827                         lx = sin(angle + deltaAngle)
828                         lz = -cos(angle + deltaAngle)
829                 ok
830
831
832         func mouseButton
833
834                 button = glutEventButton()
835                 state = glutEventState()
836                 xx = glutEventX()
837                 yy = glutEventY()
838
839                 // これは左ボタンを押したときのみ true になります。
840                 if button = GLUT_LEFT_BUTTON
841                         // ボタンを離したとき
842                         if state = GLUT_UP
843                                 angle += deltaAngle
844                                 xOrigin = -1
845                         else  
846                                 // state = GLUT_DOWN
847                                 xOrigin = xx
848                         ok
849                 ok
850
851
852         // -----------------------------------
853         //             メニュー
854         // -----------------------------------
855
856         func processMenuStatus
857
858                 status = glutEventStatus()
859
860                 if status = GLUT_MENU_IN_USE
861                         menuFlag = 1
862                 else
863                         menuFlag = 0
864                 ok
865
866
867         func processMainMenu 
868
869                 // ここにはなにもありません。
870                 // 動作は全てサブメニューから行います。
871
872
873         func processFillMenu
874
875                 option = glutEventValue()
876
877                 switch option
878
879                         on C_FILL
880                                 glPolygonMode(GL_FRONT, GL_FILL)
881                         on C_LINE
882                                  glPolygonMode(GL_FRONT, GL_LINE)
883                 off
884
885
886         func processFontMenu 
887
888                 option = glutEventValue()
889
890                 switch (option) {
891                         on C_INT_GLUT_BITMAP_8_BY_13
892                                 font = GLUT_BITMAP_8_BY_13
893                         on C_INT_GLUT_BITMAP_9_BY_15
894                                 font = GLUT_BITMAP_9_BY_15
895                         on C_INT_GLUT_BITMAP_TIMES_ROMAN_10
896                                 font = GLUT_BITMAP_TIMES_ROMAN_10
897                         on C_INT_GLUT_BITMAP_TIMES_ROMAN_24
898                                 font = GLUT_BITMAP_TIMES_ROMAN_24
899                         on C_INT_GLUT_BITMAP_HELVETICA_10
900                                 font = GLUT_BITMAP_HELVETICA_10
901                         on C_INT_GLUT_BITMAP_HELVETICA_12
902                                 font = GLUT_BITMAP_HELVETICA_12
903                         on C_INT_GLUT_BITMAP_HELVETICA_18
904                                 font = GLUT_BITMAP_HELVETICA_18
905                 off
906          
907         func processColorMenu
908
909                 option = glutEventValue()
910
911                 switch option 
912                         on C_RED 
913                                 red = 1.0
914                                 green = 0.0
915                                 blue = 0.0
916                         on C_GREEN 
917                                 red = 0.0
918                                 green = 1.0
919                                 blue = 0.0
920                         on C_BLUE 
921                                 red = 0.0
922                                 green = 0.0
923                                 blue = 1.0
924                         on C_ORANGE 
925                                 red = 1.0
926                                 green = 0.5
927                                 blue = 0.5
928                 off
929
930
931         func createPopupMenus
932
933                 fontMenu = glutCreateMenu(:processFontMenu)
934
935                 glutAddMenuEntry("BITMAP_8_BY_13 ",C_INT_GLUT_BITMAP_8_BY_13 )
936                 glutAddMenuEntry("BITMAP_9_BY_15",C_INT_GLUT_BITMAP_9_BY_15 )
937                 glutAddMenuEntry("BITMAP_TIMES_ROMAN_10 ",C_INT_GLUT_BITMAP_TIMES_ROMAN_10  )
938                 glutAddMenuEntry("BITMAP_TIMES_ROMAN_24",C_INT_GLUT_BITMAP_TIMES_ROMAN_24  )
939                 glutAddMenuEntry("BITMAP_HELVETICA_10 ",C_INT_GLUT_BITMAP_HELVETICA_10  )
940                 glutAddMenuEntry("BITMAP_HELVETICA_12",C_INT_GLUT_BITMAP_HELVETICA_12  )
941                 glutAddMenuEntry("BITMAP_HELVETICA_18",C_INT_GLUT_BITMAP_HELVETICA_18  )
942
943                 fillMenu = glutCreateMenu(:processFillMenu)
944
945                 glutAddMenuEntry("Fill",C_FILL)
946                 glutAddMenuEntry("Line",C_LINE)
947
948                 colorMenu = glutCreateMenu(:processColorMenu)
949                 glutAddMenuEntry("Red",C_RED);
950                 glutAddMenuEntry("Blue",C_BLUE);
951                 glutAddMenuEntry("Green",C_GREEN);
952                 glutAddMenuEntry("Orange",C_ORANGE);
953
954                 mainMenu = glutCreateMenu(:processMainMenu)
955
956                 glutAddSubMenu("Polygon Mode", fillMenu)
957                 glutAddSubMenu("Color", colorMenu)
958                 glutAddSubMenu("Font",fontMenu)
959                  // 右ボタンでメニューへ接続
960                 glutAttachMenu(GLUT_RIGHT_BUTTON)
961
962                 // これでアクティブなメニューであるかどうか検知できるようにします。
963                 glutMenuStatusFunc(:processMenuStatus)
964
965
966         // -----------------------------------
967         //             メイン
968         // -----------------------------------
969
970         func main
971
972                 // GLUT の初期化とウィンドウの作成
973                 glutInit()
974                 glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA)
975                 glutInitWindowPosition(100,100)
976                 glutInitWindowSize(320,320)
977                 glutCreateWindow("RingFreeGLUT - Test - 9 SnowMan")
978
979                 // コールバックの登録
980                 glutDisplayFunc(:renderScene)
981                 glutReshapeFunc(:changeSize)
982                 glutIdleFunc(:renderScene)
983
984                 glutIgnoreKeyRepeat(1)
985                 glutKeyboardFunc(:processNormalKeys)
986                 glutSpecialFunc(:pressKey)
987                 glutSpecialUpFunc(:releaseKey)
988
989                  // ここには二つの新しい関数があります。
990                 glutMouseFunc(:mouseButton)
991                 glutMotionFunc(:mouseMove)
992
993                 // OpenGL の初期化
994                 glEnable(GL_DEPTH_TEST)
995                 glEnable(GL_CULL_FACE)
996
997                 // メニューの初期化
998                 createPopupMenus()
999
1000                 // GLUT のイベント処理サイクルへ入ります。
1001                 glutMainLoop()
1002
1003
1004 スクリーンショット:
1005
1006 .. image:: ring15freeglut.png
1007         :alt: RingFreeGLUT
1008
1009
1010 .. image:: ring15freeglut2.png
1011         :alt: RingFreeGLUT
1012
1013 .. index:: 
1014         pair: Ring 1.5 の変更履歴; RingOpenGL 拡張機能
1015
1016 RingOpenGL 拡張機能
1017 ===================
1018
1019 Ring 1.5 の RingOpenGL は下記のバージョンに対応しています。
1020
1021 * OpenGL 1.1
1022 * OpenGL 1.2
1023 * OpenGL 1.3
1024 * OpenGL 1.4
1025 * OpenGL 1.5
1026 * OpenGL 2.0
1027 * OpenGL 2.1
1028 * OpenGL 3.0
1029 * OpenGL 3.2
1030 * OpenGL 3.3
1031 * OpenGL 4.0
1032 * OpenGL 4.1
1033 * OpenGL 4.2
1034 * OpenGL 4.3
1035 * OpenGL 4.4
1036 * OpenGL 4.5
1037 * OpenGL 4.6
1038
1039 用例:
1040
1041 .. code-block:: ring
1042
1043         /*
1044                 このサンプルは C チュートリアルを元にしています。
1045                 出典元 : 
1046                         http://www.wikihow.com/Make-a-Cube-in-OpenGL
1047         */
1048
1049         load "freeglut.ring"
1050         load "opengl21lib.ring"
1051
1052         // ----------------------------------------------------------
1053         // グローバル変数
1054         // ----------------------------------------------------------
1055         rotate_y=0 
1056         rotate_x=0
1057          
1058         // ----------------------------------------------------------
1059         // display() コールバック関数
1060         // ----------------------------------------------------------
1061         func display
1062          
1063           //  画面と Z バッファの消去
1064           glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
1065          
1066           // 変換のリセット
1067           glLoadIdentity()
1068          
1069           // rotate_x および rotate_y のユーザによる変更をリセットします。
1070           glRotatef( rotate_x, 1.0, 0.0, 0.0 )
1071           glRotatef( rotate_y, 0.0, 1.0, 0.0 )
1072          
1073           // 多色面 - 前
1074           glBegin(GL_POLYGON)
1075          
1076           glColor3f( 1.0, 0.0, 0.0 )     glVertex3f(  0.5, -0.5, -0.5 )      # P1 は赤
1077           glColor3f( 0.0, 1.0, 0.0 )     glVertex3f(  0.5,  0.5, -0.5 )      # P2 は緑
1078           glColor3f( 0.0, 0.0, 1.0 )     glVertex3f( -0.5,  0.5, -0.5 )      # P3 は青
1079           glColor3f( 1.0, 0.0, 1.0 )     glVertex3f( -0.5, -0.5, -0.5 )      # P4 は紫
1080          
1081           glEnd()
1082          
1083           // 白面 - 後
1084           glBegin(GL_POLYGON)
1085           glColor3f(   1.0,  1.0, 1.0 )
1086           glVertex3f(  0.5, -0.5, 0.5 )
1087           glVertex3f(  0.5,  0.5, 0.5 )
1088           glVertex3f( -0.5,  0.5, 0.5 )
1089           glVertex3f( -0.5, -0.5, 0.5 )
1090           glEnd()
1091          
1092           // 紫面 - 右
1093           glBegin(GL_POLYGON)
1094           glColor3f(  1.0,  0.0,  1.0 )
1095           glVertex3f( 0.5, -0.5, -0.5 )
1096           glVertex3f( 0.5,  0.5, -0.5 )
1097           glVertex3f( 0.5,  0.5,  0.5 )
1098           glVertex3f( 0.5, -0.5,  0.5 )
1099           glEnd()
1100          
1101           // 緑面 - 左
1102           glBegin(GL_POLYGON)
1103           glColor3f(   0.0,  1.0,  0.0 )
1104           glVertex3f( -0.5, -0.5,  0.5 )
1105           glVertex3f( -0.5,  0.5,  0.5 )
1106           glVertex3f( -0.5,  0.5, -0.5 )
1107           glVertex3f( -0.5, -0.5, -0.5 )
1108           glEnd()
1109          
1110           // 青面 - 上
1111           glBegin(GL_POLYGON)
1112           glColor3f(   0.0,  0.0,  1.0 )
1113           glVertex3f(  0.5,  0.5,  0.5 )
1114           glVertex3f(  0.5,  0.5, -0.5 )
1115           glVertex3f( -0.5,  0.5, -0.5 )
1116           glVertex3f( -0.5,  0.5,  0.5 )
1117           glEnd()
1118          
1119           // 赤面 - 下
1120           glBegin(GL_POLYGON)
1121           glColor3f(   1.0,  0.0,  0.0 )
1122           glVertex3f(  0.5, -0.5, -0.5 )
1123           glVertex3f(  0.5, -0.5,  0.5 )
1124           glVertex3f( -0.5, -0.5,  0.5 )
1125           glVertex3f( -0.5, -0.5, -0.5 )
1126           glEnd()
1127          
1128           glFlush()
1129           glutSwapBuffers()
1130          
1131          
1132         // ----------------------------------------------------------
1133         // specialKeys() コールバック関数
1134         // ----------------------------------------------------------
1135         func specialKeys
1136
1137                 key = glutEventKey()
1138          
1139           //  右矢印 - 回転を五度増分します。
1140                 switch Key
1141
1142                 on GLUT_KEY_RIGHT
1143                         rotate_y += 5
1144          
1145                 //  左矢印 - 回転を五度減分します。
1146                 on GLUT_KEY_LEFT
1147                         rotate_y -= 5
1148          
1149                 on GLUT_KEY_UP
1150                         rotate_x += 5
1151          
1152                 on GLUT_KEY_DOWN
1153                         rotate_x -= 5
1154          
1155                 off
1156
1157           //  更新の要求
1158           glutPostRedisplay()
1159          
1160
1161          
1162         // ----------------------------------------------------------
1163         // main() 関数
1164         // ----------------------------------------------------------
1165         func main
1166          
1167           //  GLUT の初期化とユーザ仮引数の処理
1168           glutInit()
1169          
1170           //  トゥルーカラーのウィンドウのためにZ-バッファによるダブルバッファを要求します。
1171           glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
1172          
1173           // ウィンドウの作成
1174           glutCreateWindow("Awesome Cube")
1175          
1176           //  Z-バッファの深度テストを有効にします。
1177           glEnable(GL_DEPTH_TEST)
1178          
1179           // コールバック関数
1180           glutDisplayFunc(:display)
1181           glutSpecialFunc(:specialKeys)
1182          
1183           // GLUT へイベントの制御を渡します。
1184           glutMainLoop()
1185          
1186           // OS へ戻ります。
1187
1188
1189 スクリーンショット:
1190
1191 .. image:: ring15opengl.png
1192         :alt: RingOpenGL
1193
1194 .. index:: 
1195         pair: Ring 1.5 の変更履歴; 拡張機能用のコード生成器の改善
1196
1197 拡張機能用のコード生成器の改善
1198 ==============================
1199
1200 \<constant> 型へ対応しました。
1201 また、数値以外にも定数を扱うことができます。例えば: 文字列とポインタです。
1202
1203 ポインタのときはポインタ型を決定できます。
1204 この機能は <constant> ~ </constant> の前に使えます。
1205
1206 .. code-block:: ring
1207
1208         $nDefaultConstantType = C_CONSTANT_TYPE_POINTER
1209         $cDefaultConstantPointerType = "void *"
1210
1211 この用例は RingFreeGLUT 拡張機能からの引用です。
1212
1213 .. code-block:: ring
1214
1215         <runcode>
1216                 $nDefaultConstantType = C_CONSTANT_TYPE_POINTER 
1217                 $cDefaultConstantPointerType = "void"
1218         </runcode>
1219         <constant>
1220                 GLUT_STROKE_ROMAN  
1221                 GLUT_STROKE_MONO_ROMAN
1222                 GLUT_BITMAP_9_BY_15   
1223                 GLUT_BITMAP_8_BY_13   
1224                 GLUT_BITMAP_TIMES_ROMAN_10
1225                 GLUT_BITMAP_TIMES_ROMAN_24 
1226                 GLUT_BITMAP_HELVETICA_10   
1227                 GLUT_BITMAP_HELVETICA_12   
1228                 GLUT_BITMAP_HELVETICA_18   
1229         </constant>
1230
1231 .. index:: 
1232         pair: Ring 1.5 の変更履歴; 拡張機能用のドキュメント生成器の改善
1233
1234 拡張機能用のドキュメント生成器の改善
1235 ====================================
1236
1237 生成した定数のリストをドキュメントへ出力できるようになりました。
1238
1239 以前の公開版では関数プロトタイプのみありましたが、
1240 今回は定数のリストもあります。
1241
1242 .. index:: 
1243         pair: Ring 1.5 の変更履歴; Ring VM - トレース関数
1244
1245 Ring VM - トレース関数
1246 ======================
1247
1248 Ring 1.5 では Ring VM に次の関数追加しました。
1249
1250 * RingVM_SetTrace(cCode)
1251 * RingVM_TraceData() --> aDataList
1252 * RingVM_TraceEvent() --> nTraceEvent
1253 * RingVM_TraceFunc() --> cCode
1254 * RingVM_ScopesCount() --> nScopes
1255 * RingVM_EvalInScope(nScope,cCode) 
1256 * RingVM_PassError()
1257 * RingVM_HideErrorMsg(lStatus)
1258 * RingVM_CallFunc(cFuncName)
1259
1260 用例:
1261
1262 .. code-block:: ring
1263
1264         load "tracelib.ring"
1265
1266         ringvm_settrace("mytrace()")
1267
1268         see "Hello, world!" + nl
1269         see "Welcome" + nl
1270         see "How are you?" +nl
1271         mytest()
1272         new myclass { mymethod() }
1273
1274         func mytest
1275                 see "Message from mytest" + nl
1276
1277         func mytrace
1278                 see "====== The Trace function is Active ======" + nl +
1279                         "Trace Function Name : " + ringvm_TraceFunc() + nl +
1280                         "Trace Event : " 
1281                 switch ringvm_TraceEvent()
1282                         on TRACEEVENT_NEWLINE           see "New Line" 
1283                         on TRACEEVENT_NEWFUNC           see "New Function"
1284                         on TRACEEVENT_RETURN            see "Return"
1285                         on TRACEEVENT_ERROR             see "Error"
1286                         on TRACEEVENT_BEFORECFUNC       see "Before C Function"
1287                         on TRACEEVENT_AFTERCFUNC        see "After C Function"
1288                 off
1289                 see nl +
1290                         "Line Number : " + ringvm_tracedata()[TRACEDATA_LINENUMBER] + nl +
1291                         "File Name   : " + ringvm_tracedata()[TRACEDATA_FILENAME] + nl +
1292                         "Function Name : " + ringvm_tracedata()[TRACEDATA_FUNCNAME] + nl +
1293                         "Method or Function : " 
1294                         if ringvm_tracedata()[TRACEDATA_METHODORFUNC] =
1295                                          TRACEDATA_METHODORFUNC_METHOD
1296                                 see "Method"
1297                         else
1298                                 if ringvm_tracedata()[TRACEDATA_FUNCNAME] = NULL
1299                                         see "Command"
1300                                 else
1301                                         see "Function"
1302                                 ok
1303                         ok              
1304                         see nl + Copy("=",42) + nl
1305
1306         class myclass
1307                 func mymethod
1308                         see "Message from mymethod" + nl
1309
1310 実行結果:
1311
1312 .. code-block:: none
1313
1314         ====== The Trace function is Active ======
1315         Trace Function Name : mytrace()
1316         Trace Event : After C Function
1317         Line Number : 3
1318         File Name   : test1.ring
1319         Function Name : ringvm_settrace
1320         Method or Function : Function
1321         ==========================================
1322         ====== The Trace function is Active ======
1323         Trace Function Name : mytrace()
1324         Trace Event : New Line
1325         Line Number : 5
1326         File Name   : test1.ring
1327         Function Name :
1328         Method or Function : Command
1329         ==========================================
1330         Hello, world!
1331         ====== The Trace function is Active ======
1332         Trace Function Name : mytrace()
1333         Trace Event : New Line
1334         Line Number : 6
1335         File Name   : test1.ring
1336         Function Name :
1337         Method or Function : Command
1338         ==========================================
1339         Welcome
1340         ====== The Trace function is Active ======
1341         Trace Function Name : mytrace()
1342         Trace Event : New Line
1343         Line Number : 7
1344         File Name   : test1.ring
1345         Function Name :
1346         Method or Function : Command
1347         ==========================================
1348         How are you?
1349         ====== The Trace function is Active ======
1350         Trace Function Name : mytrace()
1351         Trace Event : New Line
1352         Line Number : 8
1353         File Name   : test1.ring
1354         Function Name :
1355         Method or Function : Command
1356         ==========================================
1357         ====== The Trace function is Active ======
1358         Trace Function Name : mytrace()
1359         Trace Event : New Function
1360         Line Number : 8
1361         File Name   : test1.ring
1362         Function Name : mytest
1363         Method or Function : Function
1364         ==========================================
1365         ====== The Trace function is Active ======
1366         Trace Function Name : mytrace()
1367         Trace Event : New Line
1368         Line Number : 12
1369         File Name   : test1.ring
1370         Function Name : mytest
1371         Method or Function : Function
1372         ==========================================
1373         Message from mytest
1374         ====== The Trace function is Active ======
1375         Trace Function Name : mytrace()
1376         Trace Event : New Line
1377         Line Number : 14
1378         File Name   : test1.ring
1379         Function Name : mytest
1380         Method or Function : Function
1381         ==========================================
1382         ====== The Trace function is Active ======
1383         Trace Function Name : mytrace()
1384         Trace Event : Return
1385         Line Number : 8
1386         File Name   : test1.ring
1387         Function Name :
1388         Method or Function : Command
1389         ==========================================
1390         ====== The Trace function is Active ======
1391         Trace Function Name : mytrace()
1392         Trace Event : New Line
1393         Line Number : 9
1394         File Name   : test1.ring
1395         Function Name :
1396         Method or Function : Command
1397         ==========================================
1398         ====== The Trace function is Active ======
1399         Trace Function Name : mytrace()
1400         Trace Event : New Line
1401         Line Number : 43
1402         File Name   : test1.ring
1403         Function Name :
1404         Method or Function : Command
1405         ==========================================
1406         ====== The Trace function is Active ======
1407         Trace Function Name : mytrace()
1408         Trace Event : Before C Function
1409         Line Number : 9
1410         File Name   : test1.ring
1411         Function Name : ismethod
1412         Method or Function : Function
1413         ==========================================
1414         ====== The Trace function is Active ======
1415         Trace Function Name : mytrace()
1416         Trace Event : After C Function
1417         Line Number : 9
1418         File Name   : test1.ring
1419         Function Name : ismethod
1420         Method or Function : Function
1421         ==========================================
1422         ====== The Trace function is Active ======
1423         Trace Function Name : mytrace()
1424         Trace Event : New Function
1425         Line Number : 9
1426         File Name   : test1.ring
1427         Function Name : mymethod
1428         Method or Function : Method
1429         ==========================================
1430         ====== The Trace function is Active ======
1431         Trace Function Name : mytrace()
1432         Trace Event : New Line
1433         Line Number : 44
1434         File Name   : test1.ring
1435         Function Name : mymethod
1436         Method or Function : Method
1437         ==========================================
1438         Message from mymethod
1439         ====== The Trace function is Active ======
1440         Trace Function Name : mytrace()
1441         Trace Event : Return
1442         Line Number : 9
1443         File Name   : test1.ring
1444         Function Name :
1445         Method or Function : Command
1446         ==========================================
1447         ====== The Trace function is Active ======
1448         Trace Function Name : mytrace()
1449         Trace Event : Before C Function
1450         Line Number : 9
1451         File Name   : test1.ring
1452         Function Name : ismethod
1453         Method or Function : Function
1454         ==========================================
1455         ====== The Trace function is Active ======
1456         Trace Function Name : mytrace()
1457         Trace Event : After C Function
1458         Line Number : 9
1459         File Name   : test1.ring
1460         Function Name : ismethod
1461         Method or Function : Function
1462         ==========================================
1463         ====== The Trace function is Active ======
1464         Trace Function Name : mytrace()
1465         Trace Event : Before C Function
1466         Line Number : 9
1467         File Name   : test1.ring
1468         Function Name : ismethod
1469         Method or Function : Function
1470         ==========================================
1471         ====== The Trace function is Active ======
1472         Trace Function Name : mytrace()
1473         Trace Event : After C Function
1474         Line Number : 9
1475         File Name   : test1.ring
1476         Function Name : ismethod
1477         Method or Function : Function
1478         ==========================================
1479         ====== The Trace function is Active ======
1480         Trace Function Name : mytrace()
1481         Trace Event : New Line
1482         Line Number : 11
1483         File Name   : test1.ring
1484         Function Name :
1485         Method or Function : Command
1486         ==========================================
1487
1488
1489
1490 .. index:: 
1491         pair: Ring 1.5 の変更履歴; トレースライブラリとインタラクティブデバッガ
1492
1493 トレースライブラリとインタラクティブデバッガ
1494 ============================================
1495
1496 Ring 1.5 にはトレースライブラリとインタラクティブデバッガがあります。
1497
1498 このライブラリはイベントのトレース、プログラムを一行ずつ実行、
1499 エラー発生またはブレークポイントに到達したときインタラクティブデバッガを開くことができます。
1500
1501 用例:
1502
1503 この用例はブレークポイントをインタラクティブデバッガで開きます!
1504
1505 .. code-block:: ring
1506
1507         load "tracelib.ring"
1508
1509         test1()
1510
1511         func test1
1512                 x = 10
1513                 see :test1 + nl
1514                 t = 12
1515                 BreakPoint()
1516                 see "After breakpoint!" +nl
1517                 see "t = " + t + nl
1518                 see "End of program!" + nl
1519
1520
1521 スクリーンショット:
1522
1523 ブレークポイントに関してはインタラクティブデバッガがあります!
1524
1525 .. image:: debugshot1.png
1526         :alt: インタラクティブデバッガ
1527
1528 変数の値を表示できます。
1529
1530 .. image:: debugshot2.png
1531         :alt: インタラクティブデバッガ
1532
1533 変数値の変更後に実行を継続できます。
1534
1535 .. image:: debugshot3.png
1536         :alt: インタラクティブデバッガ
1537
1538 実行結果ウィンドウでもインタラクティブデバッガを実行できます。
1539
1540 .. image:: debugshot4.png
1541         :alt: インタラクティブデバッガ
1542
1543 .. index:: 
1544         pair: Ring 1.5 の変更履歴; シンタックスの柔軟性を向上
1545
1546 シンタックスの柔軟性を向上
1547 ==========================
1548
1549 クラス、パッケージ、関数で括弧 { } を使うには
1550
1551 用例:
1552
1553 .. code-block:: ring
1554
1555         load "stdlib.ring"
1556
1557         import mypackage
1558
1559         new myclass {
1560                 myfunc() 
1561         }
1562
1563         package mypackage 
1564         {
1565                 class myclass 
1566                 {
1567                         func myfunc 
1568                         {
1569                                 print("Hello, World!\n")
1570                         }
1571                 }
1572         }
1573
1574 クラス、パッケージ、関数の後に‘end’キーワードを使うには
1575
1576 用例:
1577
1578 .. code-block:: ring
1579
1580         import mypackage
1581
1582         new myclass {
1583                 myfunc() 
1584         }
1585
1586         package mypackage 
1587                 class myclass 
1588                         def myfunc 
1589                                 put "Hello, World!"
1590                         end
1591                 end
1592         end
1593
1594 クラス、パッケージ、関数の後に‘endpackage’/’endclass’/’endfunc’キーワードを使うには
1595
1596 用例:
1597
1598 .. code-block:: ring
1599
1600         import mypackage
1601
1602         new myclass { myfunc() }
1603
1604         package mypackage
1605                 class myclass
1606                         func myfunc                     
1607                                 see "welcome"  + nl
1608                         endfunc
1609                 endclass
1610         endpackage
1611
1612
1613 .. index:: 
1614         pair: Ring 1.5 の変更履歴; 型ヒントライブラリ
1615
1616 型ヒントライブラリ
1617 ==================
1618
1619 Ring 1.5 から型ヒントライブラリがあります。
1620
1621 このライブラリにより、ソースコードへ型情報を追加できます。
1622 このようなツールで非常に便利です。
1623
1624
1625 * コードエディタ
1626 * 静的解析
1627
1628
1629 用例:
1630
1631 .. code-block:: ring
1632
1633         load "typehints.ring"
1634
1635         see sum(3,4) + nl ;
1636         see sayHello("Mahmoud");
1637
1638         int func sum(int x,int y) {
1639                 return x+y ;
1640         }
1641
1642         string func sayHello(string name) {
1643                 return "Hello " + name ;
1644         }
1645
1646 ライブラリは非常に強力であり、自動的にユーザ型 (クラス) へ対応します!
1647
1648 用例:
1649
1650 .. code-block:: ring
1651
1652         load "typehints.ring"
1653
1654         import mypackage 
1655
1656         test()  { main([:one,:two,:three]) }
1657
1658         myclass func test() {
1659                 see "Testing User Types!" + nl
1660                 return new myclass
1661         }
1662
1663         package mypackage {
1664                 public class myclass {
1665                         public static void func main(list args) {
1666                                 see "welcome" + nl
1667                                 see args
1668                         }
1669                 }
1670         }
1671
1672 また、コードの内側で型を使用することもできます (関数プロトタイプだけに限定されません)。
1673
1674 用例:
1675
1676 .. code-block:: ring
1677
1678         load "typehints.ring"
1679
1680         int     sum = sum(3,4)
1681         string  msg = sayHello("Mahmoud")
1682
1683         see "Sum = " + sum + nl + msg + nl
1684
1685
1686         int func sum(int x,int y) {
1687                 return x+y ;
1688         }
1689
1690         string func sayHello(string name) {
1691                 return "Hello " + name ;
1692         }
1693
1694 規則:
1695
1696 * 関数プロトタイプ : 型を使うには、引数の前後を ‘(‘ と ‘)’ で必ず囲んでください。
1697 * 関数のコード : 型を使うには、必ず変数の値を設定してください (代入)。
1698
1699
1700 .. note:: Ring は動的言語であり、コンパイラによる型検査は行われません。
1701
1702 .. index:: 
1703         pair: Ring 1.5 の変更履歴; 品質の改善
1704
1705 品質の改善
1706 ==========
1707
1708 日々の実務プロジェクトで Ring を利用した成果により
1709
1710 Ring 1.5 では、安定性と生産性が向上しました!
1711
1712 明確な目標と実用性で求められるものを機能を追加していきます。
1713
1714 また、取扱説明書の改訂も行いました。
1715
1716 .. index:: 
1717         pair: Ring 1.5 の変更履歴; Ring 1.5.1 の変更履歴
1718
1719 Ring 1.5.1 の変更履歴
1720 =========================
1721
1722 * 取扱説明書の改訂
1723 * StdLib - Factorial() 関数の更新
1724 * Ring 仮想計算機 - クラス範囲でスタックの消去処理に関するコードの改善。
1725 * サンプル : 3D Cube (OpenGL) + GameLib (RingAllegro) によるテクスチャ画像
1726
1727 ソースコード:
1728
1729 .. code-block:: ring
1730
1731         load "gamelib.ring"
1732         load "opengl21lib.ring"
1733
1734         func main
1735
1736                 new GraphicsApp {
1737                         start()
1738                 }
1739
1740
1741         class GraphicsApp from GraphicsAppBase
1742
1743                 TITLE = "Ring Cube"
1744
1745                 bitmap texture
1746
1747                 xrot = 0.0
1748                 yrot = 0.0
1749                 zrot = 0.0
1750
1751                 func loadresources
1752
1753                         bitmap = al_load_bitmap("ring.bmp")
1754                         texture = al_get_opengl_texture(bitmap)
1755
1756                 func destroyResources
1757
1758                         al_destroy_bitmap(bitmap)
1759
1760                 func drawScene
1761
1762                         w = 800 h = 600
1763                         ratio =  w / h
1764
1765                         glViewport(0, 0, w, h)
1766                         glMatrixMode(GL_PROJECTION)
1767                         glLoadIdentity()
1768
1769                         gluPerspective(45,ratio,1,100)
1770                         glMatrixMode(GL_MODELVIEW)
1771                         glLoadIdentity()
1772
1773                         glEnable(GL_TEXTURE_2D)                                                 
1774                         glShadeModel(GL_SMOOTH)                                                 
1775                         glClearColor(0.0, 0.0, 0.0, 0.5)
1776                         glClearDepth(1.0)                       
1777                         glEnable(GL_DEPTH_TEST) 
1778                         glEnable(GL_CULL_FACE)
1779                         glDepthFunc(GL_LEQUAL)
1780                         glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
1781
1782                         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
1783                         glLoadIdentity();                                                                       
1784                         glTranslatef(0.0,0.0,-5.0);
1785
1786                         glRotatef(xrot,1.0,0.0,0.0);
1787                         glRotatef(yrot,0.0,1.0,0.0);
1788                         glRotatef(zrot,0.0,0.0,1.0);
1789
1790                         glBindTexture(GL_TEXTURE_2D, texture)
1791
1792                         glBegin(GL_QUADS)
1793                                 // 前面
1794                                 glTexCoord2f(0.0, 0.0) glVertex3f(-1.0, -1.0,  1.0)
1795                                 glTexCoord2f(1.0, 0.0) glVertex3f( 1.0, -1.0,  1.0)
1796                                 glTexCoord2f(1.0, 1.0) glVertex3f( 1.0,  1.0,  1.0)
1797                                 glTexCoord2f(0.0, 1.0) glVertex3f(-1.0,  1.0,  1.0)
1798                                 // 背面
1799                                 glTexCoord2f(1.0, 0.0) glVertex3f(-1.0, -1.0, -1.0)
1800                                 glTexCoord2f(1.0, 1.0) glVertex3f(-1.0,  1.0, -1.0)
1801                                 glTexCoord2f(0.0, 1.0) glVertex3f( 1.0,  1.0, -1.0)
1802                                 glTexCoord2f(0.0, 0.0) glVertex3f( 1.0, -1.0, -1.0)
1803                                 // 上面
1804                                 glTexCoord2f(0.0, 1.0) glVertex3f(-1.0,  1.0, -1.0)
1805                                 glTexCoord2f(0.0, 0.0) glVertex3f(-1.0,  1.0,  1.0)
1806                                 glTexCoord2f(1.0, 0.0) glVertex3f( 1.0,  1.0,  1.0)
1807                                 glTexCoord2f(1.0, 1.0) glVertex3f( 1.0,  1.0, -1.0)
1808                                 // 下面
1809                                 glTexCoord2f(1.0, 1.0) glVertex3f(-1.0, -1.0, -1.0)
1810                                 glTexCoord2f(0.0, 1.0) glVertex3f( 1.0, -1.0, -1.0)
1811                                 glTexCoord2f(0.0, 0.0) glVertex3f( 1.0, -1.0,  1.0)
1812                                 glTexCoord2f(1.0, 0.0) glVertex3f(-1.0, -1.0,  1.0)
1813                                 // 右面
1814                                 glTexCoord2f(1.0, 0.0) glVertex3f( 1.0, -1.0, -1.0)
1815                                 glTexCoord2f(1.0, 1.0) glVertex3f( 1.0,  1.0, -1.0)
1816                                 glTexCoord2f(0.0, 1.0) glVertex3f( 1.0,  1.0,  1.0)
1817                                 glTexCoord2f(0.0, 0.0) glVertex3f( 1.0, -1.0,  1.0)
1818                                 // 左面
1819                                 glTexCoord2f(0.0, 0.0) glVertex3f(-1.0, -1.0, -1.0)
1820                                 glTexCoord2f(1.0, 0.0) glVertex3f(-1.0, -1.0,  1.0)
1821                                 glTexCoord2f(1.0, 1.0) glVertex3f(-1.0,  1.0,  1.0)
1822                                 glTexCoord2f(0.0, 1.0) glVertex3f(-1.0,  1.0, -1.0)
1823                         glEnd()
1824
1825                         xrot += 0.3
1826                         yrot += 0.2
1827                         zrot += 0.4
1828
1829
1830         class GraphicsAppBase
1831
1832                 display event_queue ev timeout 
1833                 timer  redraw   = true
1834
1835                 FPS             = 60 
1836
1837                 SCREEN_W        = 800
1838                 SCREEN_H        = 600
1839
1840                 KEY_UP          = 1
1841                 KEY_DOWN        = 2
1842                 KEY_LEFT        = 3
1843                 KEY_RIGHT       = 4
1844
1845                 Key = [false,false,false,false]
1846
1847                 TITLE = "Graphics Application"
1848
1849                 func start
1850
1851                         SetUp()
1852                         loadResources()
1853                         eventsLoop()
1854                         destroy()
1855
1856                 func setup
1857
1858                         al_init()
1859                         al_init_image_addon()
1860                         al_set_new_display_flags(ALLEGRO_OPENGL) 
1861                         display = al_create_display(SCREEN_W,SCREEN_H)
1862                         al_set_Window_title(display,TITLE)
1863                         al_clear_to_color(al_map_rgb(0,0,0))
1864                         event_queue = al_create_event_queue()
1865                         al_register_event_source(event_queue, 
1866                                 al_get_display_event_source(display))
1867                         ev = al_new_allegro_event()
1868                         timeout = al_new_allegro_timeout()
1869                         al_init_timeout(timeout, 0.06)
1870                         timer = al_create_timer(1.0 / FPS)
1871                         al_register_event_source(event_queue, 
1872                                 al_get_timer_event_source(timer))
1873                         al_start_timer(timer)
1874                         al_install_mouse()
1875                         al_register_event_source(event_queue, 
1876                                 al_get_mouse_event_source())
1877                         al_install_keyboard()
1878                         al_register_event_source(event_queue, 
1879                                 al_get_keyboard_event_source())
1880
1881                 func eventsLoop
1882
1883                         while true
1884                                 al_wait_for_event_until(event_queue, ev, timeout)
1885                                 switch al_get_allegro_event_type(ev)
1886                                 on ALLEGRO_EVENT_DISPLAY_CLOSE
1887                                         exit
1888                                 on ALLEGRO_EVENT_TIMER
1889                                         redraw = true
1890                                 on ALLEGRO_EVENT_MOUSE_AXES
1891                                         mouse_x = al_get_allegro_event_mouse_x(ev)
1892                                         mouse_y = al_get_allegro_event_mouse_y(ev)
1893                                 on ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY
1894                                         mouse_x = al_get_allegro_event_mouse_x(ev)
1895                                         mouse_y = al_get_allegro_event_mouse_y(ev)
1896                                 on ALLEGRO_EVENT_MOUSE_BUTTON_UP
1897                                         exit
1898                                 on ALLEGRO_EVENT_KEY_DOWN
1899                                         switch al_get_allegro_event_keyboard_keycode(ev)
1900                                                 on ALLEGRO_KEY_UP
1901                                                         key[KEY_UP] = true
1902                                                 on ALLEGRO_KEY_DOWN
1903                                                         key[KEY_DOWN] = true
1904                                                 on ALLEGRO_KEY_LEFT
1905                                                         key[KEY_LEFT] = true
1906                                                 on ALLEGRO_KEY_RIGHT
1907                                                         key[KEY_RIGHT] = true
1908                                         off
1909                                 on ALLEGRO_EVENT_KEY_UP
1910                                         switch al_get_allegro_event_keyboard_keycode(ev)
1911                                                 on ALLEGRO_KEY_UP
1912                                                         key[KEY_UP] = false
1913                                                 on ALLEGRO_KEY_DOWN
1914                                                         key[KEY_DOWN] = false
1915                                                 on ALLEGRO_KEY_LEFT
1916                                                         key[KEY_LEFT] = false
1917                                                 on ALLEGRO_KEY_RIGHT
1918                                                         key[KEY_RIGHT] = false
1919                                                 on ALLEGRO_KEY_ESCAPE
1920                                                         exit
1921                                         off
1922                                 off
1923                                 if redraw and al_is_event_queue_empty(event_queue)
1924                                         redraw = false
1925                                         drawScene()
1926                                         al_flip_display()
1927                                 ok
1928                                 callgc()
1929                         end
1930
1931                 func destroy
1932
1933                         destroyResources()
1934                         al_destroy_timer(timer)
1935                         al_destroy_allegro_event(ev)
1936                         al_destroy_allegro_timeout(timeout)
1937                         al_destroy_event_queue(event_queue)
1938                         al_destroy_display(display)
1939
1940                 func loadresources
1941
1942                 func drawScene
1943
1944                 func destroyResources
1945
1946 スクリーンショット:
1947
1948 .. image:: ringcube3d.png
1949         :alt: Ring Cube
1950
1951
1952 .. index:: 
1953         pair: Ring 1.5 の変更履歴; Ring 1.5.2 の変更履歴
1954
1955 Ring 1.5.2 の変更履歴
1956 =========================
1957
1958
1959 * 取扱説明書 - “アプリケーション開発期間の短縮” の章を更新しました。
1960 * Ring ノートパッド - 全てのプラットフォームで実行結果ウィンドウへプログラムの実行結果を表示するようになりました。
1961 * フォームデザイナー - Help メニュー - コンソールウィンドウを表示せずに CHM/PDF ファイルを開けるようになりました。
1962 * フォームデザイナー - マウスをすばやく動かしたときに Resize/Move イベントの応答性を改善
1963 * フォームデザイナー - 「新規、開く、名前を付けて保存」で Controller クラスを Ring ノートパッドで開くようにしました。
1964 * フォームデザイナー - ファイルメニューへ “フォームを閉じる” オプションを追加。
1965 * Ring ノートパッド - 実行に、現在のファイル (開いているフォームも) 自動的に保存するようになりました。
1966 * GetQuotesHistory アプリケーション - macOS および Qt 5.2 で動作するために更新
1967 * Calculator アプリケーション - 様々な機能を搭載するために更新しました!
1968 * Ring VM - 環境エラーの分類 (この章をご確認ください : 言語リファレンス)
1969 * RingQt - イベント実行の高速化のために QAllEvents へ新しいメソッドを追加
1970 * RingQt - スタイル「フュージョン : 黒」 - 無効なコントロールに最適な配色
1971 * スクリプト - Fedora Linux での Ring ビルド用 (この章をご確認ください : ソースコードからのビルド方法)
1972
1973
1974 スクリーンショット:
1975
1976 .. image:: fedora.png
1977         :alt: Ring (Fedora 1 で実行)
1978
1979
1980 .. index:: 
1981         pair: Ring 1.5 の変更履歴; Ring 1.5.3 の変更履歴
1982
1983 Ring 1.5.3 の変更履歴
1984 =========================
1985
1986 * フォームデザイナー : 再びフォームを開くことを可能にするために、アクションが閉じられると Ring ノートパッドへ通知するようになりました。
1987 * フォームデザイナー : Ring ノートパッドで Controller クラスを開くときにアクションを保存するようになりました。
1988 * フォームデザイナー : CTRL キーで複数のコントロールを選択時に現在のコントロールを保持するようになりました。
1989 * フォームデザイナー : Ring ノートパッドでの使用時に素敵な背景色に対応しました (スタイル - モダン : 黒)
1990 * RingOpenSSL : OpenSSL 1.1 など新しいバージョンへ対応するために更新しました。
1991 * ビルドスクリプト : Fedora 26 (64bit) での動作に対応するために更新
1992 * OpenGL : 新しいサンプル - 複数の立方体 (samples/3D/manycubes)
1993
1994
1995 スクリーンショット:
1996
1997 .. image:: manycubes.png
1998         :alt: 複数の立方体
1999
2000 * RingQt : QDateTime クラスの追加
2001 * RingQt : QMenu および QCursor クラスへ新しいメソッドを追加
2002
2003 用例:
2004
2005 .. code-block:: ring
2006
2007         load "guilib.ring"
2008
2009         new qApp {
2010                 win = new qwidget() {
2011                         setwindowtitle("Context Menu")
2012                         resize(400,400)
2013                         myfilter = new qAllEvents(win) {
2014                                 setContextmenuEvent("mymenu()")
2015                         }
2016                         installeventfilter(myfilter)
2017                         show()
2018                 }
2019                 exec()
2020         }
2021
2022
2023         func mymenu 
2024
2025                 new qMenu(win) {
2026                         oAction = new qAction(win) {
2027                                 settext("new")
2028                                 SetCLickevent("See :New")
2029                         }
2030                         addaction(oAction)
2031                         oAction = new qAction(win) {
2032                                 settext("open")
2033                                 SetCLickevent("See :Open")
2034                         }
2035                         addaction(oAction)
2036                         oAction = new qAction(win) {
2037                                 settext("save")
2038                                 SetCLickevent("See :Save")
2039                         }
2040                         addaction(oAction)
2041                         oAction = new qAction(win) {
2042                                 settext("close")
2043                                 SetCLickevent("See :Close")
2044                         }
2045                         addaction(oAction)
2046                         oCursor  = new qCursor()
2047                         exec(oCursor.pos())
2048                 }
2049         
2050
2051 コンパイラ : 数値内で _ の使用に対応
2052
2053 用例:
2054
2055 .. code-block:: ring
2056
2057         x = 1_000_000
2058         see type(x)+nl
2059         see x+1+nl
2060
2061 実行結果:
2062
2063 .. code-block:: ring
2064
2065         NUMBER
2066         100000001
2067
2068 コンパイラ : 数値の後に f の使用に対応
2069
2070 用例:
2071
2072 .. code-block:: ring
2073
2074         x = 19.99f
2075         see type(x) + nl
2076
2077 実行結果:
2078
2079 .. code-block:: ring
2080
2081         NUMBER
2082
2083 Google API Shortener アプリケーション
2084
2085 スクリーンショット:
2086
2087 .. image:: urlappshot1.png
2088         :alt: URLShortener - スクリーンショット 1
2089
2090 TicTacToe 3D ゲーム
2091
2092 スクリーンショット:
2093
2094 .. image:: tictactoe3d.png
2095         :alt: TicTacToe 3D ゲーム
2096
2097
2098 .. index:: 
2099         pair: Ring 1.5 の変更履歴; Ring 1.5.4 の変更履歴
2100
2101 Ring 1.5.4 の変更履歴
2102 =========================
2103
2104
2105 * CalmoSoft Fifteen Puzzle ゲーム 3D
2106 * Ring ノートパッド - 新しいスタイル
2107 * Ring ノートパッド - ツールバーのスタイルを改善
2108 * Ring ノートパッド - View モード
2109 * Ring ノートパッド - QPlainTextEdit - スクロールバーの背景色の設定を行わないようにしました。
2110 * Ring ノートパッド - スタイル - フュージョン (白) - コメントに銀色を使用
2111 * Ring ノートパッド - Tab と Shift-Tab - 複数行インデント
2112 * フォームデザイナー - ツールバーのスタイルを改善
2113 * フォームデザイナー - ウィンドウフラグとメニュバーデザイナー用の素敵な背景色
2114 * フォームデザイナー - コントロールのデフォルト背景色
2115 * RingQt - QWidget クラスへgrab() および windowHandle() メソッドを追加
2116 * RingQt - QPixmap クラスへ新しいメソッドを追加
2117 * RingQt - クラスの追加:
2118         * QScreen
2119         * QWindow
2120         * QGuiApplication
2121         * QTextBrowser
2122 * 拡張機能用のコード生成器 - Nonew オプション - 親クラスへの対応
2123 * Ring VM - 内部実装 - 文字列とリストオブジェクトをステートへ渡せるようになりました。
2124 * Ring VM - ガベージコレクター - 小規模オブジェクトをメモリへプールできるようになりました。
2125 * Ring VM - ステートの保存と復元に関するコードの改善
2126