|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Перенос Формы, кликом внутри нее
Возник такой вопрос, как сделать так, что бы если кликнуть внутри формы на любом месте, не отпуская мыши, она переносилась так как с кликом по строке заголовка.
|
#2
|
|||
|
|||
Допустим Вам надо перетащить форму держа курсор мыши на компоненте label1
Код:
procedure tform1.label1mousedown(sender: tobject; button: tmousebutton; shift: tshiftstate; x, y: integer); const sc_dragmove = $f012; begin releasecapture; form1.perform(wm_syscommand, sc_dragmove, 0); end; Удачного использования! |
#3
|
|||
|
|||
Все бы хорошо, да выдает ошибку:
Цитата:
А вот ошибки: Код:
[DCC Error] SDIMAIN.PAS(104): E2003 Undeclared identifier: 'wm_syscommand' [DCC Error] SDIMAIN.PAS(104): E2076 This form of method call only allowed for class methods [DCC Error] SDIAPP.DPR(6): F2063 Could not compile used unit 'SDIMAIN.PAS' |
#4
|
|||
|
|||
А зачем так сложно?
Вот код из моего проекта - форма без заголовка, которую можно двигать по экрану за любое место: Код:
unit CallAlertFrm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Math, ExtCtrls, Preferences; type TCallAlertForm = class(TForm) btClose: TButton; lbNumber: TLabel; lbNumberData: TLabel; lbCaller: TLabel; lbCallerData: TLabel; tmBlend: TTimer; procedure btCloseClick(Sender: TObject); procedure tmBlendTimer(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormPaint(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } FIsMove : Boolean; FDragPoint : TPoint; protected { Protected declarations } procedure CreateParams(var Params: TCreateParams); override; public { Public declarations } procedure ResizeForData; end; var CallAlertForm: TCallAlertForm; implementation {$R *.dfm} { TCallAlertForm } procedure TCallAlertForm.ResizeForData; var MaxWidth : Integer; begin // Resize MaxWidth := lbNumberData.Left + Max(lbNumberData.Canvas.TextWidth(lbNumberData.Caption), lbCallerData.Canvas.TextWidth(lbCallerData.Caption)); Self.Width := MaxWidth + 16; // Move to tray area Case PPreferences.AlertVPos Of avpTop : Self.Top := 2; avpCenter : Self.Top := Round((Screen.Height - Self.Height) / 2); avpBottom : Self.Top := Screen.Height - Self.Height - 2; End; Case PPreferences.AlertHPos Of ahpLeft : Self.Left := 2; ahpCenter : Self.Left := Round((Screen.Width - Self.Width) / 2); ahpRight : Self.Left := Screen.Width - Self.Width - 2; End; end; procedure TCallAlertForm.btCloseClick(Sender: TObject); begin Close; end; procedure TCallAlertForm.tmBlendTimer(Sender: TObject); begin AlphaBlendValue := AlphaBlendValue + 5; tmBlend.Enabled := AlphaBlendValue < 255; end; procedure TCallAlertForm.FormClose(Sender: TObject; var Action: TCloseAction); begin tmBlend.Enabled := False; end; procedure TCallAlertForm.CreateParams(var Params: TCreateParams); begin inherited; Params.WndParent := GetDesktopWindow; end; procedure TCallAlertForm.FormPaint(Sender: TObject); begin Self.Canvas.Pen.Width := 5; Self.Canvas.Pen.Color := clSilver; Self.Canvas.Rectangle(Rect(0,0,Self.Width,Self.Height)); end; procedure TCallAlertForm.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin FIsMove := True; FDragPoint := Point(X , Y ); end; procedure TCallAlertForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin If FIsMove Then Begin Self.Left := Self.Left + x - FDragPoint.X; Self.Top := Self.Top + y - FDragPoint.y; End; end; procedure TCallAlertForm.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin FIsMove := False; end; end. Там еще позиционирование формы, переразмеривание под данные и плавное появление (через прозрачность). Да и еще она как бы живет сама по себе. В общем, думаю разберешься что к чему, если будут вопросы - пиши. |
#5
|
|||
|
|||
lmikle, как раз таки для меня этот вариант сложнее, если можешь опиши как сделать именно перемещение формы.
|
#6
|
||||
|
||||
А поискть на форуме не судьба?
http://delphisources.ru/forum/showpo...91&postcount=7 Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |