フリーソフトダウンロードページを追加しました

ソフトの終了状態を記録。C++BuilderでINIファイルを利用する。

ソフトの終了状態を記録。C++BuilderでINIファイルを利用する。

前回公開した、NCデータ確認ソフトはエディタ部分のフォントを変更できる仕様としました。
でも、再起動時には初期状態へ戻ってしまうため、フォントの設定状態を、次回起動時にも反映できないかな~との要望を「ZENKYUさん」よりいただいたので、やってみました。
前回起動時の状態の保存・取出しに、初期化ファイル(INIファイル)を使用し、フォントの設定に、「Font」プロパティを使用したので、覚書として残して置こうと思います。

エディタ部分のフォントを変更する

C++Builder でフォントを変更するには、「FontDialog」コンポーネントを使用すれば、簡単に実現できます。
例としては、Form に、FontDialogコンポーネントとTMemoやTRichEditを配置して、Fontプロパティに「FontDialog」からのFontを代入するだけです。

if(FontDialog1->Execute()){
  Memo1->Font = FontDialog1->Font;
}

単純にフォントだけを変更する場合はこれでいいのですが、
私は「TRichEdit」で、カーソル位置の色を変更したりしているのが原因か?
そのカーソル行だけ、うまく変更してくれません。
たぶん、「RichEdit1->SelAttributes」などで、きちんと処理すればよさそうな気もしますがよくわからなかったので、一度エディタ部の内容を一時ファイルへ保存して、フォントを変更後、再度その一時ファイルから、エディタ部へ読み込むような邪道な処理をしています。

UnicodeString temp = "TempFileForFont.txt";
RichEdit1->Lines->SaveToFile(temp);
RichEdit1->Font = FontDialog1->Font;
RichEdit1->Lines->Clear();
RichEdit1->Lines->LoadFromFile(temp);
DeleteFile(temp);

なので、一時的に、実行ファイルと同じ場所に一時ファイルが作成されます。
また、再度ファイルの読み書き処理をするので、処理時間を懸念しましたが、私の環境ではそれほど気にならなかったので、こんな処理としました。

INIファイルの作成

起動時に前回の状態を再現するには、その状態を記憶しておく必要があります。
市販のアプリケーションでは、システムレジストリへ記録しておく場合がよくありますが、このような小さなツールでレジストリを汚したくないので、INIファイル仕様で行こうと思います。

INIファイル名

INIファイルのファイル名は何がいいでしょう?
通常は実行プログラム名の拡張子を「INI」に変換した名前が一般的だと思います。

自分の実行プログラムの場所を知る

プログラムを実行する場合、そのEXEファイルをクリックして実行する場合や、必要なファイルをドロップしたり、コマンドラインからパラメータを追加して実行する場合などがあります。
その場合、パラメータは「ParamStr(int)」で取得できますが
自分自身の実行プログラムのパスは「ParamStr(0)」で知ることができます。
また「Application->ExeName」プロパティでも取得できます。

UnicodeString MyPath1 = ParamStr(0);
UnicodeString MyPath2 = Application->ExeName;

さらに、ファイルパスから、上層のディレクトリ名を知りたい場合には、
「ExtractFileDir(UnicodeString)」関数が使えます。

UnicodeString MyDir = ExtractFileDir(MyPath1);

INIファイル名を取得する

INIファイル名は、自分自身の実行ファイルパス名から、拡張子のみを変更した名前にする事にします。
結構面倒だな~と思っていたら、便利な関数がありました。
「ChangeFileExt(UnicodeString FileName, UnicodeString Extension)」です。
最初の引数に「ファイル名」、次に「拡張子」を与えます。
ここで注意!指示する「拡張子」には、「.」が必要です。

UnicodeString IniFilePath = ChangeFileExt(MyPath1,".INI");

INIファイルの読み・書き

最初は、WindowsSDK の「GetPrivateProfileString」と「WritePrivateProfileString」を利用してプログラムしていましたが
な~んだ、C++Builder にも「TIniFile」クラスが用意されていました
INIファイルは、基本的には「セクション名」「識別キー」「値」の3要素で構成されます。
作成するソフトでは、起動時のWindowの「場所」「幅」「フォント属性」が記録されるようにします。

[WINDOW]
Top=120
Left=80
Width=1174
Height=752
[FONT]
Name=Tahoma
Size=10
Bold=0
Italic=0
UnderLine=0
StrikeOut=0

INIファイルを反映

C++では、起動時にはまずコンストラクタが呼ばれますから、コンストラクタで読み込んで反映させます。

アプリのwindow位置設定

アプリの表示位置は、Formの「Top」「Left」「Width」「Height」で設定できます。
説明サイトを参考に「ReadInteger」で識別キーの整数値が取得できます。
上の例では

Top = ini->ReadInteger("WINDOW","Top",100);
Left = ini->ReadInteger("WINDOW","Left",100);

でアプリウィンドウの左上が決定できます。
幅、高さも同様です。

フォントの設定

フォントサイズやフォント名は、同様に「ReadInteger」「ReadString」で取得できます。
ちょっと変数形式が違うのが、「スタイル」や「文字飾り」です。
このプロパティには「集合型」が使われているようです。
「集合型」は、「<<」と「>>」演算子を使って、追加、削除します。
フォントのスタイルには、「太字」「斜体」「取り消し線」「下線」がありますが、それぞれ「fsBold」「fsItalic」「fsStrikeOut」「fsUnderline」で設定します。

FontDialog1->Font->Style = FontDialog1->Font->Style << fsBold;
FontDialog1->Font->Style = FontDialog1->Font->Style << fsItalic;
FontDialog1->Font->Style = FontDialog1->Font->Style >> fsStrikeOut;

状態を保存して終了

C++Builder では、フォームが閉じられる時に「FormDestroy」イベントが発生しますから、この場所に、INIファイルへの書き込み処理を定義します。

INIファイルへ書き出し

書き出しも、読込みと同様に、「TIniFile」クラスを利用します。

ini->WriteInteger("WINDOW","Top",Top);
ini->WritwInteger("WINDOW","Left",Left);

前回公開のNcCheck2Dxf.exe にVer3.41として入れ替えました。

上述のC++Builderの機能を使用して、前回終了時の状態を再現できるような処理を加えてみました。

こちらから、ダウンロードできます。

C++Builderカテゴリの最新記事

%d人のブロガーが「いいね」をつけました。