そこで、Ace エディターを WT プロジェクトに組み込み、Ace.js ファイルのコピーをロードして、それがどのように見えるかをテストしました。読み込みがうまくいったので、保存しようとしましたが、保存関数が呼び出されていないことに気付きました。これをしばらくデバッグした後、保存しようとしているファイルが 70000 ~ 80000 文字を超えると保存関数が呼び出されず、ファイルが小さい場合は正常に呼び出されてデータが渡されることに気付きました。大きなファイルを保存しようとするときに、この制限を回避するにはどうすればよいですか? 私が WT プロジェクトで実行しているコードを以下に示します。これを埋め込む方法の詳細については、Using ACE with WT を参照してください。
WText *editor;
MyClass::MyClass(const WEnvironment& env)
: WApplication(env)
{
wApp->require("lib/src/ace.js");
// A WContainerWidget is rendered as a div
editor = new WText("function(){\n hello.abc();\n}\n", root());
editor->setInline(false);
editor->resize(500, 500);
std::string editor_ref = editor->jsRef(); // is a text string that will be the element when executed in JS
std::string command =
editor_ref + ".editor = ace.edit(" + editor_ref + ");" +
editor_ref + ".editor.setTheme(\"ace/theme/monokai\");" +
editor_ref + ".editor.getSession().setMode(\"ace/mode/javascript\");";
editor->doJavaScript(command);
JSignal <std::string> *jsignal = new JSignal<std::string>(editor, "textChanged");
jsignal->connect(this, &MyClass::textChanged);
WPushButton *b = new WPushButton("Save", root());
command = "function(object, event) {" +
jsignal->createCall(editor_ref + ".editor.getValue()") +
";}";
b->clicked().connect(command);
}
void MyClass::textChanged(std::string incoming)
{
}
上記のコードでは、保存ボタンが押されたときに textChanged 関数が呼び出されます。ただし、大きなファイルが読み込まれる場合は、以下の関数を使用し、「function(){\n hello.abc();\n}\n」をその呼び出しに置き換えます。
std::string MyClass::ReadFile(std::string path)
{
std::ifstream in(path, std::ios::in | std::ios::binary);
if(in)
{
std::string contents;
in.seekg(0, std::ios::end);
contents.resize(in.tellg());
in.seekg(0, std::ios::beg);
in.read(&contents[0], contents.size());
in.close();
return(contents);
}
throw(errno);
}
前述のとおり、約 15,000 行の長さの Ace.js をロードしました。これにより、保存呼び出しが失敗しました。80,000文字を超える他のファイルでも同様に失敗すると確信していますが。前もって感謝します!