プログラムコードの覚え書き

最新情報(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 で「未解決の外部シンボル」エラーになります。

思い立って、作り直してみたところ、コンパイルに通るようになりました。 困ったときは、やり直し。でも面倒ですよね。


トップページ