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

C++Builder

前回公開した、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の機能を使用して、前回終了時の状態を再現できるような処理を加えてみました。

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

コメント

  1. ZENKYU より:

    かずばんさん、こんばんは。

    次の手順でやってみました。

    NcCheck2DXF を立ち上げる。
    NCファイルをドロップする。
    フォントを変更するため「Font」タブをクリックする。(この時フォントは Tahoma になってた)
    MSゴシック、太字、サイズ12 に変更し「OK」を押す。
    変更内容が有効になる。
    この状態で NcCheck2DXF を終了する。
    すると変更した内容で INI ファイルが書き出されたのを確認しました。

    もう一度 NcCheck2DXF を立ち上げて NCファイルをドロップした時
    変更したフォントになっていなくて Tahoma になっています。

    他の属性は INI ファイルの内容が反映されているようですが(色は INI ファイルに無いので別)
    フォントだけ INI ファイルの設定で立ち上がっていないように思います。

    • kazuban kazuban より:

      ZENKYUさん、ありがとうございます
      Font名の変更はあまり考えていなかったので、ノーチェックでした(^^ゞ
      変更後、再起動してデータを入れると、フォント字体は以前の状態になっているみたいですけど確かに、Fontダイアログでは、反映されていませんね!
      初期でTahomaになるのは、C++Builderのデフォルトなのかなぁ?
      あえて何もしないと、これになるようです。
      色については、カーソル行を赤にしたので、あまり変更を考えていませんでした
      直せるかは?ですが
      また、時間があるときに検討してみます。

      • kazuban kazuban より:

        ZENKYUさん、単純なミスでした。
        ちょっと見てみたら、読み込み時に、FontダイアログへFont名の登録するのを忘れてました。
        Ver3.41 に変更しました。

        • ZENKYU より:

          かずばんさん、ありがとうございます。

          Ver3.41 良好です。

          使う上で問題ない部分ばかりなんですが…

          気づいた事その1
          表示するファイルが空の状態で起動した直後はFontダイアログを開けないですよね。
          で、「Edit」ボタンで編集モードに入り
          %
          %
          %
          G
          M
          X
          Y
          S
          %
          %
          %
          なんて入力すると末尾がわの「%」の大きさが変わります。

          「更新」を押して「Check」モードに戻れば設定ファイルの状態になります。
          以後、編集モードに入っても変化しません。

          気づいた事その2
          上部のXYZ座標値を表示している窓の部分。
          窓の中にアドレスを表示しなければ、数値をもう一桁表示できそうですね。

          気づいた事その3
          左側のNCデータを表示している部分の幅を小さくし、右側の図形表示部の
          幅を大きくしていくと、「ファイル保存」のボタンが隠れていきます。
          このあたりの設計変更があるといいかも。

          P.S
          JIMTOF もバーチャルではなく現場でその空気を感じたいですね~

          • kazuban kazuban より:

            ZENKYUさん、アドバイスありがとうございます
            気づいた事その1、はよくわかりませんが
            私の環境では、再現できませんでした。

            気づいた事その2、確かに上部に軸指示があるので
            数値部分には、アドレスはいらないですね
            たぶん、最初のレイアウトでは、上部の軸アドレスはなかったんだと思います。
            桁数の変更は、大したことなく変更できます

            気づいた事その3、はサイズの変更にボタンサイズを合わせる方法はわからないので、今のレイアウトでは難しいです
            見えなくなったら、エディタ部分の幅を調整してもらうしかないです
            もしくは、メニューバーに、DXFやファイルの保存を追加するかですかね~

            また重要な変更がみつかったら、検討してみます。

            確かに、JIMTOFオンラインはあまり面白くないですね
            各メーカーのリンクサイトのイメージですかね
            出展側は、名刺交換で来客情報が得られるのでその点ではメリットあるでしょうか?
            訪問側は、それほど興味ないけど、覗いてみるか~程度で、名刺交換はちと抵抗あります

タイトルとURLをコピーしました