|
Delphi.メモノート φ(..)o
ちょっとした覚え書きです。
・Delphiにはどんな関数があるの?
ヘルプで関数一覧とひけば出てきます(Delphi3)。
・終了時にタスクバーに残骸が残る。
終了間際にShowWindowを使用すると出なくなる。
procedure TForm1.FormDestroy(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_SHOW);
end;
・フォントサイズを調べる。
Form1.Font.PixelsPerInch が96ならフォントサイズ小。120なら大。
・マウスカーソルを移動する。
SetCursorPos(640, 480); //X640 Y480に移動
・現在最小化されているか?の判定。
IsIconic(Application.Handle)
Trueだったら現在最小化中。
・タスクバーの文字を書き換えたい。
Application.Titleに文字を入れる。
Application.Title := '表示したい文字';
・1バイト文字、2バイト文字の区別をつけたい。
ByteType関数を使う。
1バイト文字か、2バイト文字の1バイト目、2バイト目かの判断が出来る。
・StretchBltで縮小処理をすると結果が汚くなる。
SetStretchBltModeで拡大モードを COLORONCOLOR に変えてみる。
・フォームのカーソル変更が出来ない。
Screen変数で行なう。
Screen.Cursor := crHourGlass; //砂時計カーソル
・TRichEditのテキストの揃え方を実行時に変更する。
Alignmentプロパティだと設計時にのみ変更が可能。
実行時にはParagraphプロパティを使う。
RichEdit1.Paragraph.Alignment := taCenter; //中央揃え
・フォーカスのあるコントロール名を取得する。
乗っているフォームが Form1 だとした場合、
Form1.ActiveControl.Name
が、「現在フォーカスのあるコントロールの名前」になる。
・Windowsのバージョンを知りたい。
Win32Platform 変数で調べる。(Win32s or 95 or NT)
細かく調べる場合はWin32majorVersion, Win32MinorVersion,
Win32BuildNumber, Win32CDSVersionで見る。
・MessageDlgのタイトルの文字を変えたい。
Application.MessageBoxを使ってみる。
Application.MessageBox('本文','タイトル名',MB_OK + MB_ICONSTOP);
・QueryPerformanceCounterでミリ秒単位の時間を得る。
var
iCounter: TLargeInteger;
iFrequency: TLargeInteger;
QueryPerformanceCounter(iCounter);
QueryPerformanceFrequency(iFrequency);
Result := Trunc((iCounter.LowPart / iFrequency.LowPart)*1000);
//Int64が使える場合はInt64を使う方がいいかも。
・インチとミリの変換。
1 inch = 25.4 mm
(正確には 1 inch = 25.4059 mm。そんなに変わらない。)
・マウスのフォーム上での座標を得る。
Form1 だとした場合・・
var iMouse: TPoint; //iMouse.XがX座標。iMouse.YがY座標。
GetCursorPos(iMouse);
iMouse := Form1.ScreenToClient(iMouse);
・メニューに横線を描きたい。
TMenuItemのCaptionに -(マイナス)を入れると横線になる。
・OnCreateやOnShowイベント中にCloseする。
PostMessage(Handle, WM_Close, 0, 0);
・ファイルのやりとりに失敗する事がある。
いくつかのWindows API等、短いファイル名の使用を前提としているものがある。
(mciSendStringやプログラム起動時のファイル名読込など)
この場合は長いファイル名(フルパス)だと失敗する事があるので短いパス名に変換して渡す。
ExtractShortPathNameで短いパス名に変換出来る。
・Formがちらつく。
フォームの描き直しをする時、一旦塗りつぶすようになっているのでちらつく事がある。
{ Private 宣言 }
procedure ErasebkgndHandler(var msg: TWMERASEBKGND);message WM_ERASEBKGND;
procedure TForm1.ErasebkgndHandler(var msg: TWMERASEBKGND);
begin
//何もせずに返す。これで塗りつぶしキャンセルになる。
end;
・TImageの大きさ変更が反映されない。
現在のオフスクリーンビットマップを廃棄する必要がある。
Image1.Picture.Graphic := nil; //Graphicの廃棄
・ファイルの小さいアイコン(16x16)を取得する。
ExtractIconExを使うと楽だが、これはフォントサイズ大などでは拡大されたアイコンが
返ってくる。システムイメージリストを使うと常に16x16のアイコンが取得できる。
//ファイル(FileName)のアイコンをビットマップ(Bitmap)にコピーする例
var
iIcon: TIcon;
iSfi: TShFileInfo;
iImageList: TImageList;
iIcon := TIcon.Create;
iImageList := TImageList.CreateSize(16, 16);
try
iImageList.ShareImages := True;
iImageList.Handle := SHGetFileInfo(PChar(FileName), 0, iSfi, SizeOf(TShFileInfo),
SHGFI_SYSICONINDEX or SHGFI_ICON or SHGFI_USEFILEATTRIBUTES or SHGFI_SMALLICON);
iImageList.GetIcon(iSfi.iIcon, iIcon);
DrawIconEx(Bitmap.Canvas.Handle, 0, 0, iIcon.Handle,16, 16, 0, 0, DI_NORMAL);
finally
iIcon.Free;
iImageList.Free;
end;
・Windowsフォルダ、Windows\Systemフォルダのパスを知りたい。
var
iDirectory: array[0..MAX_PATH-1] of Char;
GetWindowsDirectory(iDirectory, MAX_PATH); //Windowsフォルダ
GetSystemDirectory(iDirectory, MAX_PATH); //Systemフォルダ
・ComboBoxのメニューをプログラムで開閉したい。
ComboBox1.Perform(CB_SHOWDROPDOWN, 1, 0); //開く
ComboBox1.Perform(CB_SHOWDROPDOWN, 0, 0); //閉じる
・TListに数値を入れる。
TListはポインターのリスト。型変換をするとIntegerを格納できる。
List1.Add(Pointer(i)); //格納
i := Integer(List1[0]); //取り出す
・ブラウザを立ち上げる。
ShellExecuteを使うと関連付けされているブラウザが立ち上がる。
use節にShellapiが必要。
//ウェブページ
ShellExecute(Handle, 'OPEN', 'http://www.mars.dti.ne.jp/~tin/', '', '', SW_SHOW);
//カレントにあるファイル
ShellExecute(Handle, 'OPEN', 'index.htm', '', '', SW_SHOW);
//メーラー
ShellExecute(Handle, 'OPEN', 'mailto:tin@mars.dti.ne.jp', '', '', SW_SHOW);
ブラウザが手前に来ない事がある。
ShellExecuteの後で Application.ProcessMessages; を使っておくといい。
・Windows終了時にFormCloseイベントが発生しない。
Windows終了イベントを捉えてそこで必要な処理を行う。
{ Private 宣言 }
procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QUERYENDSESSION;
procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
//ここに必要な処理
Msg.Result := LongInt(True);
end;
# 尚、FormDestroyは起きます。
・ウィンドウの最小サイズを決める。
{ Private 宣言 }
procedure WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo); message WM_GETMINMAXINFO;
procedure TForm1.WMGetMinMaxInfo(var Msg : TWMGetMinMaxInfo);
var
iX, iY: Integer;
begin
iX := 128 + GetSystemMetrics(SM_CXFRAME) * 2; // 例 横128
iY := 64 + GetSystemMetrics(SM_CYFRAME) * 2; // 例 縦 64
iY := iY + GetSystemMetrics(SM_CYCAPTION);
with Msg.MinMaxInfo^ do
ptMinTrackSize:= Point(iX, iY);
end;
|