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. テキスト → 日時
次回でようやくコンバート関数オブジェクトクラスが出そろいます。