投稿

6月, 2024の投稿を表示しています

Delphi の LabeledEdit を右寄せにしつつラベルは左に

イメージ
Delphi で LabeledEdit(TLabeledEdit) の Alignment を taRightJustify にすると、テキストボックス内の右寄せと共に、ラベルまで右側に付いてしまう LabeledEdit.EditLabel にも Left プロパティがあるので、それを LabeledEdit.Left と同じにすればOK、ただ、移動させると元の位置に戻ってしまいます フォームの OnShow イベントで Left位置を合わせておけばよいようです procedure TForm1.FormShow(Sender: TObject); begin LabeledEdit1.EditLabel.Left := LabeledEdit1.Left; end;

Delphi の TToolBar 上でPopupMenuの表示位置下にあるコントロールを取得

 Delphi の TToolBar 上でPopupMenuの表示位置下にあるコントロールを取得 今回は TToolBar 上に TToolButton.Style を tbsButton と tbsSeparator で配置したもの TToolBar には、指定位置のコントロールを取得する ScreenToClient があるのだが、tbsSeparator のコントロール上で取得しても nil しか返ってこない procedure TForm1.PopupMenuItem1Click(Sender: TObject); var Point: TPoint; Ctrl: TControl; begin if (Sender is TMenuItem) then begin Point := ToolBar1.ScreenToClient(TPopupMenu(TMenuItem(Sender).GetParentMenu).PopupPoint); Ctrl := ToolBar1.ControlAtPos(Point, True); // ToolButton.Style が tbsSeparator のコントロールは Ctrl = nil が返る end; end; そのため Toolbar 上のコントロールを探して一致するものを取得(例は横軸しか判定してません) procedure TForm1.PopupMenuItem1Click(Sender: TObject); var Point: TPoint; Ctrl: TControl; I: Integer; begin if (Sender is TMenuItem) then begin Point := ToolBar1.ScreenToClient(TPopupMenu(TMenuItem(Sender).GetParentMenu).PopupPoint); for I := ToolBar1.ControlCount - 1 downto 0 do begin Ctrl := ToolBar1.Control

Delphi でFormを MainForm 以外の中央に表示

Delphi でFormを MainForm 以外の中央に表示 親になるフォーム位置、サイズを GetWindowRect で取得して中央を計算する procedure MoveFormCenter(AForm, AParentForm: TForm); var Rect: TRect; begin GetWindowRect(AParentForm.Handle, Rect); AForm.Top := Rect.Top + (Rect.Bottom - Rect.Top - AForm.Height) div 2; AForm.Left := Rect.Left + (Rect.Right - Rect.Left - AForm.Width) div 2; end; (MessageDlg をフォームの中央に表示は こちら )

Delphi の EdgeBrowser 設置のFrameやFormで1400 ウィンドウ ハンドルが無効です

Delphi の EdgeBrowser Visibleプロパティを実行時に変更したり、同じ場所(FrameやForm)にあるコントロールを非表示にしたりすると、FrameやForm参照時に謎の「1400 ウィンドウ ハンドルが無効です」エラーが発生する 同じ場所に非表示のコントロールが存在すると上記の症状が発生するっぽい

Delphi で初期フォームを非表示にして、次のフォームをメインウィンドウみたいにする

Delphi で初期フォームを非表示にして、次のフォームをメインウィンドウみたいにする タスクトレイへ常駐したりするアプリケーションでよくあるパターン TForm1 へトレイアイコンなどを配置して非表示とし TForm2 をメインウィンドウ的にタスクバーへ表示させる TForm2 を初期フォームとして、非表示起動させて、そちらへトレイアイコンを配置してもいいような感じがしますが、TForm2 を初期ウィンドウとするとそのフォームを閉じるとアプリが終了してしまいます。 それを阻止しようとして OnCloseで閉じるをキャンセルして隠す処理をしてしまうと、アプリケーションを明確に終了する場合は問題ないのですが、OS終了時にサインアウトが阻止されてしまうという面倒な事につながってしまいます プロジェクトのフォームで自動生成フォームの順序を Form1 ←隠すフォーム Form2 ←メインとして動作させるフォーム としておき 各フォームのプロパティを TForm1.Visible = False TForm2.Visible = False とします プロジェクトのソース Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.ShowMainForm := False ; Form2.Visible := True; // 起動時に表示する場合 Application.Run; Form2へ public procedure CreateParams(var Params: TCreateParams); override; procedure TForm2.CreateParams(var Params: TCreateParams); begin inherited; Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW; Params.WndParent := GetDesktopWindow; end; とします あらかじめ