飴屋ぷろじぇくと

 ちょっとカテゴリを分けてみようかなっと。

--.--.--[--] スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2014.10.10[金] FreeBASIC ウィンドウアプリ

FreeBASIC用 IDE FbEdit
http://www.hi-ho.ne.jp/makoto_watanabe/FbEdit/

リソースエディタが付いてます。
キーワード色分けはもちろん、自動コード補完やインテリセンス等コードアシスト機能も一通りあってなかなか便利です。
でもウィンドウアプリを作るにあたっての中身のコード実装はVB程簡単ではありません。
というかCやC++で実装してたのと変わりません。

まあ、そういうツールが無いこともないみたいなんですが、ピアノロール描いたりとかその上で編集できるようにしたりとか本当に自由にGUIを構築するにはどうにもバランスが悪い。
テキストボックスから文字列取ってくるとかは平易なコードで書けた方が望ましい。
それでいて、上記の“自由な”GUI構築も極力余計なこと考えずにコードを書ければよいのだけど、どうしても事あるごとに面倒くさいWindowsAPIが顔を出してきて煩わしい事この上ない。

VB6って今思うと奇跡の開発言語だったんだなって思う。
VB.NET?
あれはVBの皮かぶったC#でしょ。

という訳で、今日のコーディングはダイアログアプリのイベント実装を単純化してみるテスト。
まずはリソース。ここではソースを表示してますが、実際はリソースエディタでグラフィカルに作れます。
[TestForm.rc]
#define IDD_DLG1 1000
IDD_DLG1 DIALOGEX 6,5,194,107
CAPTION "Hello FB"
FONT 8,"MS Sans Serif",400,0
STYLE 0x10CE0800
BEGIN
END

次に本体。共通な処理は共通部品に追い出して、ここでは実現したい機能のコーディングだけに集中できるようにします。
[TestForm.bas]
#define IDD_DLG1 1000
#include "Form.bi"

Dim Shared Form1 As Form

Sub FormClose(param As ActionParam)
   EndDialog(param.hWin, 0)
End Sub

Form1.Actions.Add(WM_CLOSE, @FormClose)
Form1.Dialog(IDD_DLG1, NULL)


1.イベントプロシージャ、2.Windowメッセージとプロシージャの関連付け、3.ダイアログ表示とあって、これくらいシンプルだとVB並に気楽に作っていけそうですが、なかなかどうして、そうはいきません。ここからちょっと気の利いたことをしようとすると途端にコントロールの実装地獄が始まるのです。まあその辺は今後検証していくことにして。

この先は共通部品です。とりあえず最低限、基本機能だけ実装しました。バリバリのOOPでもはや何処がBasicなんだかよく判りませんが、これがいまどきのFreeBASICのコードです。
[Form.bi]
#Define UNICODE
#Include Once "windows.bi"
#Include Once "ActionSelector.bi"

Type Form Extends OBJECT
Private:
    Declare Static Function DlgProc(ByVal hWin As HWND,ByVal uMsg As UINT,ByVal wp As WPARAM,ByVal lp As LPARAM) As Integer
Public:
    Actions As ActionSelector
    hWin As HWND
    Declare Sub Dialog(ByVal id As Integer, ByVal hParent As HWND)
    Declare Sub EndDlg(retcode As Integer)
End Type


[Form.bas]
#include "Form.bi"

Sub Form.Dialog(ByVal id As Integer, ByVal hParent As HWND)
    Dim hInst As HINSTANCE = GetModuleHandle(NULL)
    DialogBoxParam(hInst, Cast(WString Ptr, id), hParent, @Form.DlgProc, Cast(LPARAM, @This))
End Sub

Function Form.DlgProc(ByVal hWin As HWND,ByVal uMsg As UINT,ByVal wp As WPARAM,ByVal lp As LPARAM) As Integer
    Dim As Form Ptr ThisPtr = GetProp(hWin, "ThisPtr")
    Dim ret As Integer = 0
    Select Case uMsg
        Case WM_INITDIALOG
            ThisPtr = Cast(Form Ptr, lp)
            ThisPtr->hWin = hWin
            SetProp(hWin, "ThisPtr", Cast(HANDLE, lp))
    End Select
    If ThisPtr <> NULL Then
        ThisPtr->Actions.DoAction(hWin, uMsg, wp, lp)
    End If
    Return ret
End Function


[ActionSelector.bi]
#Define UNICODE
#Include Once "windows.bi"

Type ActionParam
    hWin As HWND
    msg As UINT
    wp As WPARAM
    lp As LPARAM
End Type

Type ActionType As Sub(param As ActionParam)

Type ActionFolder
    Msg As UINT
    Action As ActionType
End Type

Type ActionSelector Extends OBJECT
Private:
    Acts(Any) As ActionFolder
    ActCnt As Integer
Public:
    Declare Constructor()
    Declare Sub Add(msg As UINT, Act As ActionType)
    Declare Sub DoAction(ByVal hWin As HWND,ByVal uMsg As UINT,ByVal wp As WPARAM,ByVal lp As LPARAM)
    Declare Property Count As Integer
End Type


[ActionSelector.bas]
#Include "ActionSelector.bi"

Constructor ActionSelector()
    ActCnt = 0
End Constructor

Sub ActionSelector.Add(msg As UINT, Act As ActionType)
    Dim i As Long
    For i = 0 To ActCnt - 1
        If Acts(i).Msg = msg Then
            Acts(i).Msg = msg
            Acts(i).Action = Act
            Exit Sub
        EndIf
    Next
    ReDim Preserve Acts(ActCnt)
    Acts(ActCnt).Msg = msg
    Acts(ActCnt).Action = Act
    ActCnt = ActCnt + 1
End Sub

Sub ActionSelector.DoAction(ByVal hWin As HWND,ByVal uMsg As UINT,ByVal wp As WPARAM,ByVal lp As LPARAM)
    Dim param As ActionParam
    param.hWin = hWin
    param.msg = uMsg
    param.wp = wp
    param.lp = lp
    Dim i As Long
    For i = 0 To ActCnt - 1
        If Acts(i).Msg = uMsg Then
            Acts(i).Action(param)
        End If
    Next
End Sub

Property ActionSelector.Count As Integer
    Return ActCnt
End Property

Comment

2014.10.11 Sat 23:30  window9

私が関与しているFreeBASIC用 IDE FbEditを紹介いただき、有難うございます。
方向は違いますが、Windows 用 GUI library 「window9」も、一度お試し下さい。
http://makoto-watanabe.main.jp/freebasic/Window9/W9S.html






(編集・削除用)

Trackback

http://utau2009.blog114.fc2.com/tb.php/19-8902583b

この記事にトラックバック(FC2Blog User)

Copyright © 飴屋/菖蒲

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。