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;