danpapa blog

趣味のプログラミング等について

CodeBlocksーDSTool-ScriptEditor-Format-03

先々回の続きです。
danpapa-hry.hateblo.jp

とりあえず、コードを書いてみる

画面はこんな感じでした。
f:id:danpapa_hry:20190312210955p:plain:w300


OnInitイベント
まずここで「Script実行」の下にあるwxTextCtrlへ値を設定します。
「rows: 6,mem[2999]; msg: mem[2999];」がスクリプトになります。

void ScriptEditor_FormatDialog::OnInit(wxInitDialogEvent& event)
{
    TextCtrl1->SetValue(wxT("rows: 6,mem[2999]; msg: mem[2999];"));
}


「Script実行」ボタンのコード
wxTextCtrlの値(スクリプト)を取得し、SplitScriptへ渡す。

void ScriptEditor_FormatDialog::OnButton2Click(wxCommandEvent& event)
{
    SplitScript(TextCtrl1->GetValue());
}


SplitScript関数
ここではスクリプトを「;」で分割し、順番にRunScriptへ渡します。

void ScriptEditor_FormatDialog::SplitScript(wxString script)
{
    wxString splitscript;

    wxStringTokenizer tokenizer(script, ";");
    while ( tokenizer.HasMoreTokens() )
    {
        splitscript  = GetNextSplit(&tokenizer);
        RunScript(splitscript);
    }
}


RunScript関数
ここでは、スクリプトをコマンドと各引数に分けていきます。
まず「:」でコマンドと引数へ分け、「,」で各引数へ分けます。
そして、コマンド別の処理を書いてます。まだ「msg:」と「rows:」しかありません。

void ScriptEditor_FormatDialog::RunScript(wxString script)
{
    wxString strCommand;
    wxString param[3];
    wxString dummy;

    wxStringTokenizer tokenizer(script, wxT(":"));
    strCommand  = GetNextSplit(&tokenizer);
    dummy = GetNextSplit(&tokenizer);

    tokenizer = wxStringTokenizer(dummy,wxT(","));
    param[0] = GetNextSplit(&tokenizer);

    if(strCommand==wxT("msg"))
    {
        if(CheckMem(param[0]))
        {
            wxMessageBox(mem[GetMemIndex(param[0])]);
        }else{
            return;
        }
    }

    if(strCommand==wxT("rows"))
    {
        param[1] = GetNextSplit(&tokenizer);

        if(CheckMem(param[1]))
        {
            mem[GetMemIndex(param[1])] = ListBox1->GetString(GetIvalue(param[0]));
        }else{
            return;
        }
    }
}


GetIvalue関数
ここでは引数が文字、メモリの判別を行い、それぞれintで戻します。

int ScriptEditor_FormatDialog::GetIvalue(wxString param)
{
    if(CheckMem(param))
    {
        return wxAtoi(mem[GetMemIndex(param)]);
    }else{
        return wxAtoi(param);
    }
}


GetMemIndex関数
ここではmem[2999]が引数だった場合、2999をintで返します。

int ScriptEditor_FormatDialog::GetMemIndex(wxString param)
{
    param = param.Right(param.length()-4);
    param = param.Left(param.length()-1);

    return wxAtoi(param);
}


CheckMem関数
ここでは、メモリの場合はtrue、そうでなければfalseを返します

bool ScriptEditor_FormatDialog::CheckMem(wxString param)
{
    if(param.Left(4)==wxT("mem["))
    {
        return true;
    }else{
        return false;
    }
}


GetNextSplit関数
これ、先々回の説明では無くて、急遽追加しました。
分割した文字列を取得し、その文字列の前後にある空白を削除してから、文字列を返します。

wxString ScriptEditor_FormatDialog::GetNextSplit(wxStringTokenizer *tokenizer)
{
    wxString str = tokenizer->GetNextToken();
    str.Trim(true);
    str.Trim(false);

    return str;
}

大した事やってないのに長いですねぇ。作り方がまずいんでしょうw
ま、動けばいいんです。今は。。。

さっそく実行してみよう
これが「Script実行」をクリックした結果です。
f:id:danpapa_hry:20190314220904p:plain:w300

「rows: 6,mem[2999]; msg: mem[2999];」これがスクリプトでした。
「rows: 6,mem[2999];」でフォーマットの6行目の値をmem[2999]へ入れる
「msg: mem[2999];」でmem[2999]をメッセージで表示

とりあえず動きは確認できました。後は残っているコマンドを追加していけば、スクリプト解析~スクリプト実行までは完成しそうです。

最終的には関数やクラスにまとめていく方が良いのかも知れません。