見出し画像

Notes C API探訪: 日時をテキストにコンバートする

さて、以前の記事までで以下のようにご紹介しました。

1. 数値 → テキスト (前回紹介済み)
2. テキスト → 数値 (今回紹介済み)
3. 日時 → テキスト
4. テキスト → 日時

次のステップに進むにあたり、以下のように準備してきました。

1. TIME型の代わりになるクラスを考える(記事リンク)
2. TIMEDATE型をラップする(記事リンク)
3. Notes日時とQDateTimeとの相互変換(記事リンク)

では、いよいよ「日時をテキストにコンバート」してみます。

コンバートシミュレーターダイアログの記事で以下のようにコードを紹介していました。

// convertsimulatordialog.cpp(抜粋)

void ConvertSimulatorDialog::convertTimeToText() {
 nxpp::TimeDateToTextConverter converter;
 setIntlFormat(&converter);
 setTimeFormat(&converter);

 try {
   QDateTime dt = ui->dateTimeToTextDateTimeEdit->dateTime();
   TIMEDATE td = nxpp::qt::toTIMEDATE(dt);
   nxpp::Lmbcs text = converter(&td);
   ui->dateTimeToTextLineEdit->setText(fromLmbcsQ(text));
 }
 // Notesステータスがスローされたらそのエラーメッセージに変換して表示
 catch (nxpp::Status &status) {
   consoleLog(nxpp::qt::fromStatus(status.error()));
 }
 // それ以外の例外ならそのメッセージを表示
 catch (std::exception &ex) {
   std::string what(ex.what());
   consoleLog(QString::fromStdString(what));
 }
}

まず、コンバーター(nxpp::TimeDateToTextConverter)を生成していますが、これについては後述します。
次に、UIから取得したQDateTimeの値をNotes日時であるTIMEDATE型のデータに変換します。この変換プロセスに、先の3つの記事を要したわけです。
そして、TIMEDATE型に変換できたUIの日時を、コンバーターを使ってテキストに変換します。
最後に、変換できたテキストを、UI要素に設定してユーザーに表示します。

nxpp::TimeDateToTextConverter

では日時からテキストに変換するコンバーターのコードを見ていきます。

// nxpp/include/nxpp/nxpp_timedate.hpp
// ...

namespace nxpp {
// ...

class TimeDateToTextConverter
   : public TimeConverter
{
public:
 TimeDateToTextConverter() : TimeConverter() {}

 TimeDateToTextConverter(
     intl::SettingsPtr iPtr,
     TimeFormatPtr tPtr
     )
   : TimeConverter(iPtr, tPtr)
 {}

 Lmbcs operator () (TIMEDATE *pTimeDate) const {
   char buffer[MAXALPHATIMEDATE] = "";
   WORD len = 0;
   Status status = ConvertTIMEDATEToText(
         !intlSettingsPtr_ ? nullptr : intlSettingsPtr_->data(),
         !formatPtr_ ? nullptr : formatPtr_->data(),
         pTimeDate,
         buffer,
         MAXALPHATIMEDATE,
         &len
         );
   if (!status) { throw status; }
   return Lmbcs(buffer, len);
 }
};

// ...
} // namespace nxpp
// ...

数値用のコンバーターと同様、関数オブジェクトになっています。コンバートする元のデータ型、コンバート先文字列の最大長、コンバートに使うNotes C API関数が違うだけで、使い方は数値型のものとほとんど同じです。

継承元のTimeConverterは次のようになっています。

// nxpp/include/nxpp/nxpp_timedate.hpp
// ...

namespace nxpp {
// ...

class TimeConverter
   : public intl::ConverterBase<TimeFormat>
{
public:
 TimeConverter() : intl::ConverterBase<TimeFormat>() {}

 TimeConverter(
     intl::SettingsPtr iPtr,
     TimeFormatPtr tPtr
     )
   : intl::ConverterBase<TimeFormat>(iPtr, tPtr)
 {}
};

// ...
} // namespace nxpp
// ...

コード中のTimeFormatは、以前紹介したTFMT構造体をラップしたクラスになります。

さらに、これの継承元になっているテンプレートクラスは、こちらの記事で紹介しています。コンバートの仕組みが、数値と日時の型違いだけなので、テンプレートを活用できる好例といってもいいでしょう。

まとめ

今回ご紹介したコンバート関数のラップは、以下のような位置づけになります。

1. 数値 → テキスト (前回紹介済み)
2. テキスト → 数値 (前回紹介済み)
3. 日時 → テキスト (今回紹介済み)
4. テキスト → 日時

次回でようやくコンバート関数オブジェクトクラスが出そろいます。

この記事が気に入ったらサポートをしてみませんか?