TDateTimePickerのFormatプロパティで日時の書式を設定する

Delphi XE2/C++Builder XE2からTDateTimePickerにFormatプロパティが追加されたようです。

Formatプロパティで日時の書式を設定することができます。

DateTimePicker1->Format = L"yyyy年MM月dd日";

TDateTimePicker

C++Builder XE以前ではDateTime_SetFormat関数を使います。

DateTime_SetFormat(DateTimePicker1->Handle, L"yyyy年MM月dd日");

MemoコンポーネントとRichEditコンポーネントのカーソル関連の処理

先日、某掲示板の質問に回答するためにMemoコンポーネントとRichEditコンポーネント
のカーソル関連の処理を調べたので、簡単にまとめます。

選択している文字

SelStartプロパティは選択されている文字の位置を示します。

SelLengthプロパティは選択している文字の数を示します。

SelTextプロパティは選択している文字を示します。

//選択状態を設定する
Memo1->SelStart = 2;
Memo1->SelLength = 4;

//選択している文字の情報を取得する
ShowMessage(IntToStr(Memo1->SelStart) + "文字目から" + IntToStr(Memo1->SelLength) + "文字選択しています");
ShowMessage("選択している文字は「" + Memo1->SelText + "」です");

現在のカーソル位置の行番号を取得する

カーソルがある行の行番号を取得するにはEM_LINEFROMCHARメッセージを使用します。
行番号は0から始まります。

int currentRowNumber = Memo1->Perform(EM_LINEFROMCHAR, -1, 0);
ShowMessage(IntToStr(currentRowNumber));

可視領域の一番上の行を取得する

可視領域の一番上の行を取得するにはEM_GETFIRSTVISIBLELINEメッセージを使用します。
行番号は0から始まります。

int row = RichEdit1->Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
ShowMessage("可視領域の先頭行は「" + IntToStr(row) + "」行目です");

スクロールする

一行下にスクロールする

Memo1->Perform(EM_SCROLL, SB_LINEDOWN, 0);

一行上にスクロールする

Memo1->Perform(EM_SCROLL, SB_LINEUP, 0);

一ページ下にスクロールする

Memo1->Perform(EM_SCROLL, SB_PAGEDOWN, 0);

一ページ上にスクロールする

Memo1->Perform(EM_SCROLL, SB_PAGEUP, 0);

指定した行数だけスクロールする

int row = 移動する行数(負数なら上に、正数なら下にスクロール);
Memo1->Perform(EM_LINESCROLL, 0, row);

C++Builder XE3でSQLiteを使ってみた。

RAD Studio XE3 Hotfix 3によってProfessional editionでSQLiteが使えるようになったので、試してみました。

Pythonでサンプルのデータベースファイルを作成します。
作成したデータベースファイルは「C:\test\test.db」に配置しました。

#!python2.7
# -*- coding: utf-8 -*-
import sqlite3

con = sqlite3.connect(u"test.db", isolation_level=None)
con.execute(u"create table example (id integer, name varchar(20))")
con.executemany(u"insert into example values (?, ?)",
        [(1, u"Delphi XE3"), (2, u"C++Builder XE3"), (3,u"HTML5 Builder"),
         (4, u"デルファイ"), (5, u"シープラスプラス")])

c = con.cursor()
c.execute(u"select* from example")
for row in c:
    print row[0], row[1]
con.close()

チュートリアル:SQLite データベースに接続する(Delphi)の手順にしたがって操作します。

SQLConnection1のDriverプロパティを編集するときに「Driver/Connection レジストリ
ファイル ‘C:\~\dbxconnections.ini’ が見つかりません。」というエラーメッセー
ジが表示される場合は、指定された場所に空のdbxconnections.iniを作成するといいようです。

実行時に「sqlite3.dllが見つかりません。」というエラーメッセージが表示される場
合は、SQLiteのページからsqlite3.dllをダウンロードして、パスの通った場所に配置します。

実行時の画面

C++Builder XE3で記述したソースコード

void __fastcall TForm1::connectButtonClick(TObject *Sender)
{
  SQLConnection1->ConnectionName = "C:\\test\\test.db";
  SQLConnection1->Params->Add("Database=C:\\test\\test.db");
  try {
    SQLConnection1->Connected = true;
    executeButton->Enabled = true;
    outputMemo->Text = "Connection established!";
  } catch (EDatabaseError& E) {
    ShowMessage("Exception raised with message: " + E.Message);
  }
}
void __fastcall TForm1::executeButtonClick(TObject *Sender)
{
  outputMemo->Clear();
  UnicodeString query = "SELECT * FROM example;";
  TDataSet* results;
  try {
    SQLConnection1->Execute(query, NULL, results);
  } catch (Exception& E) {
    outputMemo->Text = "Exception raised with message: " + E.Message;
  }
  ShowSelectResults(results);
}
void TForm1::ShowSelectResults(TDataSet* results)
{
  if (!results->IsEmpty()) {
    TStringList* names = new TStringList();
    results->GetFieldNames(names);
    for (results->First(); !results->Eof; results->Next()) {
      UnicodeString currentLine;
      for (int i = 0; i < names->Count; ++i) {
        TField* currentField = results->FieldByName(names->Strings[i]);
        currentLine = currentLine + " " + currentField->AsString;
      }
      outputMemo->Lines->Add(currentLine);
    }
    delete names;
  }
}

Delphiで数値の形式を国際化に対応する

Windowsでは地域の設定によって小数点や桁区切りの記号が異なります。
また利用者が自由に記号を変更することも可能です。

アプリケーションを国際化に対応する場合は、数値の形式を意識する必要があります。

先日、私が対応したときの方法を紹介します。
ポイントはFormat関数やStrToFloat関数などを使用するとき、引数にTFormatSettingsを与えることです。

アプリケーションでは、フォームに表示する時はコントロールパネルの「地域の設定」で設定されている小数点記号と桁区切り記号を使用し、ファイルに保存する時には小数点記号「.」桁区切り記号「,」とすることにしました。

type
  TForm1 = class(TForm)
  private
    /// <summary>コントロールパネルの「地域と言語の設定のオプション」の設定</summary>
    /// <remarks>フォームへの入出力に使用する</remarks>
    FLocalSettings: SysUtils.TFormatSettings;

    /// <summary>小数点記号「.」桁区切り記号「,」の設定</summary>
    /// <remarks>ファイルへの入出力に使用する</remarks>
    FGlobalSettings: SysUtils.TFormatSettings;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //コントロールパネルの「地域と言語の設定のオプション」の設定
  FLocalSettings := TFormatSettings.Create;

  //小数点記号「.」桁区切り記号「,」の設定
  FGlobalSettings := TFormatSettings.Create;
  FGlobalSettings.DecimalSeparator := '.';  //小数点記号
  FGlobalSettings.ThousandSeparator := ','; //桁区切り記号
end;

フォームに入力された数字を数値に変換する時には、StrToFloat関数を使用します。
このとき第二引数を指定し、コントロールパネルの「地域の設定」の書式で変換します。

var
  Value: double;
begin
   //コントロールパネルの「地域の設定」の書式で変換する。
  Value := StrToFloat(Edit1.Text, FLocalSettings);

数値を画面に表示する時はFormat関数を使用します。
このときに、コントロールパネルの「地域の設定」の書式で変換します。

Label1.Caption := Format('%n', [Value], FLocalSettings);

ファイルに保存する時には、小数点記号「.」桁区切り記号「,」で保存します。

S := Format('%n', [Value], FGlobalSettings);

ファイルから読み込む時も同じ要領になります。

次のサンプルプログラムでは、入力された値をEdit1に入力された値を、Label1にはコントロールパネルの「地域」設定で、Label2には小数点記号「.」桁区切り記号「,」で出力しています。
なお、コントロールパネルの「地域」の設定では、小数点の記号を「#」、桁区切り記号を「%」に変更しています。

procedure TForm1.Edit1Exit(Sender: TObject);
var
  Value: double;
begin
  Value := StrToFloat(Edit1.Text, FLocalSettings);

  Label1.Caption := Format('%n', [Value], FLocalSettings);
  Label2.Caption := Format('%n', [Value], FGlobalSettings);
end;