Tips - Delphi  基本的にDelphi 6 Personalの個人メモ。ヴァージョン違うと使えないかも。


便利な関数

Trunc(x) x の小数点以下を切捨てる
Trunc(x + 0.5) x の小数点以下を四捨五入
ExtractFilePath(Application.ExeName) 実行中のアプリのディレクトリを取得
ExtractFilePath(ParamStr(0))

よく使うキーコード

#00 キー入力無視
#08 BackSpace/Delete
#13 Enter 改行

キー入力を制限する

 制限したいコンポーネントのOnKeyPressイベントに、特定のキー以外を無視するルーチンを設定する。

procedure TForm1.KeyPressLimit(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9', #08]) then // 入力キーが'0'~'9',BackSpace/Delete 以外なら
  begin 
    beep; // ビープ音による警告
    Key := #0; // 入力を無視
  end;
end;

メニューバーとツールバーで共通の処理をしたい

 こちらのページを参照。

文字列を数値に変換する

  1. StrToCurr関数を使う。
  2. StrToInt関数を使う。
  3. StrToIntDef関数を使う。
    • 「10進数と16進数を示す文字列」を整数値に変換する関数。変換エラー時に返す数値を指定できるため、指定の数値が返されたときにエラー処理へ分岐できる。
  4. Val関数を使う。整数、実数のいずれも可。
    :
    :
     var
      STR : String;
      FLT : Single;
      ERR : Integer;
    :
    :
    begin
    :
    :
      Val(STR, FLT, ERR); // STR → FLT ERRは変換エラー箇所(エラーがなければ0)
      if ERR = 0 then // 変換エラーがなければ
    :
    :
      else // 変換エラーがあれば
    :
    :
    

おまけ:

  1. IntToHex関数を使うと10進数表記を16進数表記に変換できる……はずだが、Personalには実装されていないらしい。

JPEG画像を扱う

 Jpeg画像を扱うためのユニット「Jpeg」が標準添付されているので、pasファイルのuses節に、手入力で「Jpeg」を追加するだけ。
 Jpegユニットを追加すると、Jpegデータを格納するための TJPEGImage が使えるようになり、これを経由して内部でビットマップに変換できるようになる。

:
:
uses Windows, ‥‥, Jpeg;
:
:
var
  JPG : TJPEGImage;
  BMP : TBitmap;
:
:
 begin
  JPG := TJPEGImage.Create;
  BMP := TBitmap.Create;
:
:
  JPG.Assign(BMP); // BMP → JPG
:
:
  BMP.Assign(JPG); // JPG → BMP
:
:

指定URLへのリンクを埋め込む

 外部アプリケーションをWindows経由でコントロールする「ShellAPI」関数群の中から、「ShellExecute」関数を使うと、指定URLを規定のブラウザで開いてくれる。
 最初に、pasファイルのuses節に、手入力で「ShellAPI」を追加する。後はボタンやラベルをクリックしたときのイベントに、指定URLを呼び出すShellExecute関数を設定すればOK。

:
:
uses Windows, ‥‥, ShellAPI;
:
:
procedure TForm1.Label1Click(Sender: TObject);
begin
//  ShellExecute(Handle, 'OPEN', 'http://www39.atwiki.jp/kgh07155/', '', '', SW_SHOWNORMAL);
//  ShellExecute(NULL, 'OPEN', 'http://www39.atwiki.jp/kgh07155/', NULL, NULL, SW_SHOWNORMAL);
//どちらの書式でもOK。引数の'OPEN'とURL、SW_SHOWNORMALがポイント。

  ShellExecute(Handle, 'OPEN', PChar(TLabel(Sender).Caption), '', '', SW_SHOWNORMAL);
// URLとして指定する文字列はPChar型のみ有効。PChar(String)のように型変換すると良い。
// この例の場合、Labelに表示された文字列を引数として適宜実行する。
// つまりLabelの文字列がURLなら、自動でブラウザを起動し指定URLを呼び出す。
end;
:
:

 ShellExecute関数の使い方は他にもいろいろあるが、ここでは省略。

Aboutフォーム表示

ヴァージョン情報や作者URLなどを表示する「Aboutフォーム」を表示させる方法。

  1. Aboutフォームを作成。
  2. Aboutフォームにフォーム閉じ用のButtonオブジェクトを置き、ModalResultプロパティを mrOK に設定。
    • フォームを閉じるためのボタンイベントは不要。
      Button.ModalResult := mrOK;
      // 変更の必要はないので、オブジェクト インスペクタで設定して構わない。
      // ボタンが押されたことが分かれば良いので、mrNone 以外なら何でも良い。
      
  3. メインフォームにAboutフォームを呼び出すイベントを追加。
    procedure TMain.ViewAboutBox(Sender: TObject);
    begin
      AboutBox.ShowModal;
    // AboutBoxは、呼び出すフォーム名。この場合、表示させたいAboutフォーム。
    // ShowModalは、フォームをダイアログ表示させるメソッド。ボタンを押すとフォームを閉じ、
    // 押されたボタンのModalResult(mrNone以外)を返し値にするので、
    // 特にボタンイベントを設定しなくても良い。
    end;
    

DialogのOKかCancelかで処理を分ける

デフォルトで準備されているDialogの場合、Executeメソッド(型はBoolean)で判定可能。

if OpenDialog.Execute then
  Memo1.Lines.LoadFromFile(OpenDialog1.FileName);

自前でDialogFormを作成する場合、設置したボタンにModalResultプロパティを設定し、DialogFormのModalResultプロパティの値(型はInteger)で判定(FormのModalResultプロパティは、押されたボタンのModalResultの値になる)。
ModalResultの値はTModalResult型を参照。

DialogForm.Button1.ModalResult := mrYes;
DialogForm.Button2.ModalResult := mrNo;
if DialogForm.ModalResult := mrYes then
  Memo1.Lines.LoadFromFile(DialogForm.FileName);

複数行の文字列を一行化する

TStringList, TMemo, TRichEditで、複数の文字列を一行化する方法。

Sample := TStringList.Create;
Sample.Add('Line0');
Sample.Add('Line 1');
Sample.Add('Line,2');
Sample.Add('Line"3');
:
  • Textプロパティを使う。
    改行コード(#13#10)を区切りに一行化する。
    Sample.Text = 'Line0'#13#10'Line 1'#13#10'Line,2'#13#10'Line"3'#13#10……
  • CommaTextプロパティを使う。
    半角コンマ(,)を区切りに一行化する。行に半角コンマ(,)や半角スペース( )が入った場合は半角ダブルクォーテーション(")で行を囲み、行に半角ダブルクォーテーション(")が入る場合は半角ダブルクォーテーションを二重にする。
    Sample.CommaText = Line0,"Line 1","Line,2","Line""3",……
  • DelimitedTextプロパティを使う。
    CommaTextの区切り文字(,)や囲み文字(")の変更可能版。区切り文字はDelimiterプロパティで、囲み文字はQuoteCharプロパティで指定する。デフォルトではCommaTextと同じ。

複数行テキストエディタで、手動でカーソルを最下行へ移動

TMemo, TRichEditで、自動でカーソルが最下行へ移動しないときに、手動で移動させる方法。

Memo1.SelStart := Length(Memo1.Lines.Text);//キャレット位置を最後に
Memo1.Perform(EM_SCROLLCARET, 0, 0);       //キャレット位置までスクロール

RichEditで文字列の書式を部分的に変えたい

 こちらのページを参照。

最終更新:2009年07月19日 20:23