「Tips - Delphi」の編集履歴(バックアップ)一覧はこちら
「Tips - Delphi」(2009/07/19 (日) 20:23:44) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
&font(b,144%){Tips - Delphi}
#contents
----
***便利な関数
|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;
***メニューバーとツールバーで共通の処理をしたい
[[こちらのページ>Tips - Delphi メニューバーとツールバーの処理共通化]]を参照。
***文字列を数値に変換する
+StrToCurr関数を使う。
+StrToInt関数を使う。
+StrToIntDef関数を使う。
--「10進数と16進数を示す文字列」を整数値に変換する関数。変換エラー時に返す数値を指定できるため、指定の数値が返されたときにエラー処理へ分岐できる。
+Val関数を使う。整数、実数のいずれも可。
:
:
var
STR : String;
FLT : Single;
ERR : Integer;
:
:
begin
:
:
Val(STR, FLT, ERR); // STR → FLT ERRは変換エラー箇所(エラーがなければ0)
if ERR = 0 then // 変換エラーがなければ
:
:
else // 変換エラーがあれば
:
:
***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フォーム」を表示させる方法。
+Aboutフォームを作成。
+Aboutフォームにフォーム閉じ用のButtonオブジェクトを置き、ModalResultプロパティを mrOK に設定。
--フォームを閉じるためのボタンイベントは不要。
Button.ModalResult := mrOK;
// 変更の必要はないので、オブジェクト インスペクタで設定して構わない。
+メインフォームにAboutフォームを呼び出すイベントを追加。
procedure TMain.ViewAboutBox(Sender: TObject);
begin
AboutBox.ShowModal;
// AboutBoxは、呼び出すフォーム名。この場合、表示させたいAboutフォーム。
// ShowModalは、フォームをダイアログ表示させるメソッド。ボタンを押すとフォームを閉じ、
// 押されたボタンを返し値にするので、特にボタンイベントを設定しなくても良い。
end;
***DialogのOKかCancelかで処理を分ける
デフォルトで準備されているDialogの場合、Executeメソッド(型はBoolean)で判定可能。
if OpenDialog.Execute then
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
自前でDialogFormを作成する場合、設置したボタンにModalResultプロパティを設定し、DialogFormのModalResultプロパティの値(型はInteger)で判定(FormのModalResultプロパティは、押されたボタンのModalResultの値になる)。&br();
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プロパティを使う。&br();改行コード(#13#10)を区切りに一行化する。&br();Sample.Text = 'Line0'#13#10'Line 1'#13#10'Line,2'#13#10'Line"3'#13#10……
-CommaTextプロパティを使う。&br();半角コンマ(,)を区切りに一行化する。行に半角コンマ(,)や半角スペース( )が入った場合は半角ダブルクォーテーション(")で行を囲み、行に半角ダブルクォーテーション(")が入る場合は半角ダブルクォーテーションを二重にする。&br();Sample.CommaText = Line0,"Line 1","Line,2","Line""3",……
-DelimitedTextプロパティを使う。&br();CommaTextの区切り文字(,)や囲み文字(")の変更可能版。区切り文字はDelimiterプロパティで、囲み文字はQuoteCharプロパティで指定する。デフォルトではCommaTextと同じ。
***複数行テキストエディタで、手動でカーソルを最下行へ移動
TMemo, TRichEditで、自動でカーソルが最下行へ移動しないときに、手動で移動させる方法。
Memo1.SelStart := Length(Memo1.Lines.Text);//キャレット位置を最後に
Memo1.Perform(EM_SCROLLCARET, 0, 0); //キャレット位置までスクロール
&font(b,144%){Tips - Delphi}
基本的にDelphi 6 Personalの個人メモ。ヴァージョン違うと使えないかも。
#contents
----
***便利な関数
|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;
***メニューバーとツールバーで共通の処理をしたい
[[こちらのページ>Tips - Delphi メニューバーとツールバーの処理共通化]]を参照。
***文字列を数値に変換する
+StrToCurr関数を使う。
+StrToInt関数を使う。
+StrToIntDef関数を使う。
--「10進数と16進数を示す文字列」を整数値に変換する関数。変換エラー時に返す数値を指定できるため、指定の数値が返されたときにエラー処理へ分岐できる。
+Val関数を使う。整数、実数のいずれも可。
:
:
var
STR : String;
FLT : Single;
ERR : Integer;
:
:
begin
:
:
Val(STR, FLT, ERR); // STR → FLT ERRは変換エラー箇所(エラーがなければ0)
if ERR = 0 then // 変換エラーがなければ
:
:
else // 変換エラーがあれば
:
:
おまけ:
+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フォーム」を表示させる方法。
+Aboutフォームを作成。
+Aboutフォームにフォーム閉じ用のButtonオブジェクトを置き、ModalResultプロパティを mrOK に設定。
--フォームを閉じるためのボタンイベントは不要。
Button.ModalResult := mrOK;
// 変更の必要はないので、オブジェクト インスペクタで設定して構わない。
// ボタンが押されたことが分かれば良いので、mrNone 以外なら何でも良い。
+メインフォームに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の値になる)。&br();
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プロパティを使う。&br();改行コード(#13#10)を区切りに一行化する。&br();Sample.Text = 'Line0'#13#10'Line 1'#13#10'Line,2'#13#10'Line"3'#13#10……
-CommaTextプロパティを使う。&br();半角コンマ(,)を区切りに一行化する。行に半角コンマ(,)や半角スペース( )が入った場合は半角ダブルクォーテーション(")で行を囲み、行に半角ダブルクォーテーション(")が入る場合は半角ダブルクォーテーションを二重にする。&br();Sample.CommaText = Line0,"Line 1","Line,2","Line""3",……
-DelimitedTextプロパティを使う。&br();CommaTextの区切り文字(,)や囲み文字(")の変更可能版。区切り文字はDelimiterプロパティで、囲み文字はQuoteCharプロパティで指定する。デフォルトではCommaTextと同じ。
***複数行テキストエディタで、手動でカーソルを最下行へ移動
TMemo, TRichEditで、自動でカーソルが最下行へ移動しないときに、手動で移動させる方法。
Memo1.SelStart := Length(Memo1.Lines.Text);//キャレット位置を最後に
Memo1.Perform(EM_SCROLLCARET, 0, 0); //キャレット位置までスクロール
***RichEditで文字列の書式を部分的に変えたい
[[こちらのページ>Tips - Delphi RichEditの文字装飾をプログラム制御]]を参照。