🍩Ring 1.12:docs

- News
- Download
- Get Help
- Contribute
- Resources
- Team
- Website
- Index

### ナビゲーション

- 次へ »
- » 前へ |
- プログラミング言語 Ring 1.12 取扱説明書 »
- Ring 1.3 の変更履歴

# Ring 1.3 の変更履歴

Ring 1.3 公開版の変更点と新機能を学びます。

## 新機能と変更リスト

Ring 1.3 の新機能！

- RingQt の改善
- Ring ノートパッドの改善
- Emacs Editor 用の Ring モード
- StdLib の改善
- Loop/Exit 命令の改善
- 新しい関数
- 参照による Self 返し
- ‘from’ キーワードの代わりに‘<’または‘:’演算子の使用
- Ring のステートを共有せずに Ring を組み込む
- RingZip ライブラリ
- フォームデザイナー

## RingQt の改善

① QPixMap クラスの別バージョンとしてオブジェクトの初期化時に (int width,int height) を 扱う (QPixMap2) を追加しました。

用例:

    Load "guilib.ring"
    New qapp
    {
            win1 =  new qwidget()
            {
                    setwindowtitle("Drawing using QPixMap")
                    setgeometry(100,100,500,500)
                    label1 = new qlabel(win1)
                    {
                            setgeometry(10,10,400,400)
                            settext("")
                    }
                    imageStock = new qlabel(win1)
                    {
                            image = new qPixMap2(200,200)
                            color = new qcolor() {
                                    setrgb(255,255,255,255)
                            }
                            pen = new qpen() {
                                    setcolor(color)
                                    setwidth(10)
                            }
                            new qpainter() {
                                    begin(image)
                                            setpen(pen)
                                            drawline(0,0,200,200)
                                            drawline(200,0,0,200)
                                    endpaint()
                            }
                            setpixmap(image)
                    }
                    show()
            }
            exec()
    }

スクリーンショット:

② オブジェクトライブラリへ関数を実装しました。

- Last_WindowID()
- Open_WindowNoShow()
- Open_WindowAndLink()

なお WindowViewBase クラス名は WindowsViewParent へ変更されました。

このコードの用例では Open_WindowAndLink() は SecondWindowController クラスからオブジェクトの作成を行い FirstWindowController クラスへ SecondWindow() メソッドを追加します。 また SecondWindowController クラスへ FirstWindow() メソッドを追加します。

FirstWindowController クラスにある SendMessage() メソッドは SecondWindow() メソッドでオブジェクトへアクセスするために使えます。

    class firstwindowController from windowsControllerParent

        oView = new firstwindowView

        func OpenSecondWindow
            Open_WindowAndLink(:SecondWindowController,self)

        func SendMessage
            if IsSecondWindow()
                SecondWindow().setMessage("Message from the first window")
            ok

        func setMessage cMessage
            oView.Label1.setText(cMessage)

③ このクラスを RingQt へ追加しました

- QPixMap2
- QScrollArea
- QSplitter
- QCompleter
- QCompleter2
- QCompleter3
- QProcess
- QMdiArea
- QMdiSubWindow
- QCursor
- QListView
- QDesktopServices

④ qt.rh には各種定数が定義されています (guilib.ring から読み込みます)

⑤ 新しいクラス名 - インデックスは 1 から開始します。

RingQt には新しいクラスが追加されています - 別バージョンのクラス名は小文字 “q” で開始されません。 また GUI コントロールなど扱うときにインデックスが 1 から開始するようにメソッドを更新してあります。

- ComboBox
- ListWidget
- TableWidget
- TreeWidget

前述のクラスは guilib.ring の System.GUI パッケージに実装されています:

使用するには

    load "guilib.ring"

    import System.GUI

これは以前のコードに一切影響を与えません。 つまり Ring の規則と整合性がある優れたコードへの第三の選択です。

またフォームデザイナーは、クラス間で「インデックスを 0 から開始」 または「インデックスを 1 から開始」を選択肢を使用するために更新しました。

用例 (フォームデザイナーを使用)

1. https://github.com/ring-lang/ring/blob/master/applications/formdesigner/tests/indexstart/indexstartView.ring
2. https://github.com/ring-lang/ring/blob/master/applications/formdesigner/tests/indexstart/indexstartController.ring

## Ring ノートパッドの改善

① QTextEdit の代わりに QPlainTextEdit を使用

② ソースコード各行の行番号を表示

スクリーンショット:

③ Ring 関数名、クラス、および開いているファイル語句の自動補完

④ 関数とメソッドのリスト

⑤ 実行結果のウィンドウ

⑥ クラスのリスト

⑦ 現在のスタイルを変更

## Emacs Editor 用の Ring モード

Ring 1.3 では Emacs Editor 用の Ring モードがあります。

スクリーンショット:

## StdLib の改善

StdLib に関数を実装するために更新しました。

- SplitMany()
- JustFilePath()
- JustFileName()

## Loop|Exit 命令の改善

Loop|Exit 命令は、命令 (数値に限りません) の後に式を受け入れるために更新しました。

文法:

    Loop|Exit [数値]

変更後:

    Loop|Exit [式]

用例:

    XLoop = 2       # ループの外側
    YLoop = 1       # 最初のループの内側
    for x = 1 to 10
            for y = 1 to 10
                    see "x=" + x + " y=" + y + nl
                    if x = 3 and y = 5
                            exit XLoop
                    ok
            next
    next

## 新しい関数

- PackageName() 関数
- Swap() 関数

用例:

    aList = [:one,:two,:four,:three]
    see aList
    see copy("*",50) + nl
    swap(aList,3,4)
    see aList

実行結果:

    one
    two
    four
    three
    **************************************************
    one
    two
    three
    four

## 参照による Self 返し

この公開版では、クラスのメソッドで Self 返しを使うとオブジェクトを返します。

用例:

    mylist = [new mytest() {
            see self
            x = 20
            see self
    }]

    see mylist

    class mytest
            x = 15
            func init
                    return self     # 参照返し

実行結果:

    x: 15.000000
    x: 20.000000
    x: 20.000000

## ‘from’キーワードの代わりに‘<’または‘:’演算子の使用

この公開版では‘from’キーワードの代わりに‘<’または‘:’演算子を使えます。

文法①:

    class Cat from Animal

文法②:

    class Cat < Animal

文法③:

    class Cat : Animal

## Ring のステートを共有せずに Ring を組み込む

Ring 1.0 より Ring を C へ組み込むための関数は実装されていました。 また eval() 関数で Ring プログラム内で Ring のコードを実行できます。 この公開版ではステートを共有せずに Ring を Ring プログラムへ組み込むための関数を実装しました。

利点:

- ① Ring プログラムとアプリケーションの統合で競合が発生しません。
- ② Ring のコードを安全な環境で実行して、トレースを行うことができます。

用例:

    pState = ring_state_init()
    ring_state_runcode(pState,"See 'Hello, World!'+nl")
    ring_state_runcode(pState,"x = 10")

    pState2 = ring_state_init()
    ring_state_runcode(pState2,"See 'Hello, World!'+nl")
    ring_state_runcode(pState2,"x = 20")

    ring_state_runcode(pState,"see x +nl")
    ring_state_runcode(pState2,"see x +nl")

    v1 = ring_state_findvar(pState,"x")
    v2 = ring_state_findvar(pState2,"x")

    see v1[3] + nl
    see V2[3] + nl

    ring_state_delete(pState)
    ring_state_delete(pState2)

実行結果:

    Hello, World!
    Hello, World!
    10
    20
    10
    20

## RingZip ライブラリ

Ring 1.3 には *.zip ファイルの作成、変更、および展開用の RingZip ライブラリがあります。

用例①: 四本のファイルがある myfile.zip を作成します。

    load "ziplib.ring"
    oZip = zip_openfile("myfile.zip",'w')
    zip_addfile(oZip,"test.c")
    zip_addfile(oZip,"zip.c")
    zip_addfile(oZip,"zip.h")
    zip_addfile(oZip,"miniz.h")
    zip_close(oZip)

用例②: myfile.zip を myfolder フォルダへ展開します。

    load "ziplib.ring"
    zip_extract_allfiles("myfile.zip","myfolder")

用例③: myfile.zip にあるファイル名のリストを表示します。

    load "ziplib.ring"
    oZip = zip_openfile("myfile.zip",'r')
    for x=1 to zip_filescount(oZip)
           see zip_getfilenamebyindex(oZip,x) + nl
    next
    zip_close(oZip)

用例④: クラスの代わりに関数を使用します。

    load "ziplib.ring"

    new Zip {
            SetFileName("myfile.zip")
            Open("w")
            AddFile("test.c")
            AddFile("zip.c")
            AddFile("zip.h")
            AddFile("miniz.h")
            Close()
    }

## フォームデザイナー

Ring 1.3 では GUI アプリケーション・フォームの手軽な設計、および Ring ソースコードの生成を行うためのフォームデザイナーが付属しています。

オブジェクト指向プログラミングとメタプログラミングによる 約 8000 行の Ring コードを記述しました。

Ring ノートパッドからフォームデザイナーを実行できます。

また、別のウィンドウからフォームデザイナーを実行することもできます。