プログラムコードの覚え書き
最新情報(2019.12.09更新) Embacadero RAD Studio 10.3.3 Rio を使ってソフトを作っています。 HTML Help と Excel を扱うことが難しく、 C++Builder のバージョンを上げるとそれまでの使い方ではエラーが多く起こり、 この2つのサポートを断念する場面がありました。
ここでは、今使っているやり方の Hint を上げます。(1) HTML Help cpp ファイルの#include を置く場所に下のコードを書き込みます。
#if __CODEGEARC__ < 0x640
#pragma link "HTMLHelpViewer"
#else
#pragma link "Vcl.HTMLHelpViewer"
#endif必要な箇所に、下のコードを書き込みます。
Application->HelpFile = "saiten.chm";
Application->HelpShowTableOfContents();(2) Path
Path は即値では "d:\\test.xls" のように円マークを2つ重ねて書き込む。 以前のC++Builderでは、ExtractFilePath のような組み込み関数を 使って、実際にあるファイル名からPathの部分を切り取ったときも 内部の円マークを探して2つ重ねるような場合があったが、 XE2 では、そのままOlePropertySet に渡しても大丈夫であった。
(3) cast
C++のcast は、新しくなっていたのですね。
static_cast<>()
dynamic_cast<>()
const_cast<>()
reinterpret_cast<>()
(4) Excel 操作
TExcelApplication を使う方法もありますが、なぜか、 「定義が曖昧」というエラーがでてコンパイルできません。 ここではOLEを使って実装するHintを上げます。
Variant exApp;
Variant wBooks;
Variant wBook;
Variant wSheets;
Variant wSheet;
Variant sRange;
を用意し
exApp = Variant::CreateObject("Excel.Application");
wBooks = exApp.OlePropertyGet("Workbooks");
表示
exApp.OlePropertySet("Visible",Variant(true));
ファイルを開く
wBook = wBooks.OlePropertyGet("Open",WideString(FileName));
wSheets = wBook.OlePropertyGet("WorkSheets");
UnicodeStringシートを開く
wSheet = wSheets.OlePropertyGet("Item",WideString(SheetName));
範囲指定
sRange = wSheet.OlePropertyGet("Range",WideString("I2"));
UnicodeStringコピー
wSheet.OleProcedure("Activate");
sRange.OleProcedure("Select");
wSheet.OleProcedure("Copy");
貼り付け
wSheet.OleProcedure("Activate");
sRange.OleProcedure("Select");
wSheet.OleProcedure("Paste");
値書き込み
sRange.OlePropertySet("Value",WideString("123"));
値取得
String data = sRange.OlePropertyGet("Value");
終了
exApp.OleProcedure("Quit");
追加 2019/12/09
最新のclangコンパイラでは、OlePropertyGet() で、2つめの引数が、文字列を static_cast<OleVariant>(FileName)とキャストすると、エラーになる。 static_cast<Variant>(FileName)は、コンパイラは通るが、実行時に、 変数の種類が違うとエラーが起こる。上記のようにWideString()で渡すと、 clangコンパイラに通って、実行できるようになった。
File Open もできるようになった。 さらに、書き戻すとき、自動的にExcelのシートを全選択し、それを書き戻すまでを自動でできるようになった。追加 2019/11/27
私のパソコンでは、「エクセルでデータ入力」で失敗しないが、学校のパソコンでは Abnormal termination ERROR が発生する。どうも、File の Open で、ファイル名が無いと 起きているようなので、新規作成を使うように変更した。
wBook = wBooks.OleFunction("Add");EX3 では64bitが作れるので試したら、OleVariant がエラーで引っかかるんですよ。 残念です。
(5) SetImeMode
漢字変換を制御する関数ですが、XE では普通に使えたのが、 XE2 では LINKER で「未解決の外部シンボル」エラーになります。
思い立って、作り直してみたところ、コンパイルに通るようになりました。 困ったときは、やり直し。でも面倒ですよね。