Как Создать Mdi Child Form Со Свойством Borderless?

  • Автор темы programmer8329
  • Дата начала
P

programmer8329

Я знаю что создать дочернюю форму без границ в компиляторе(ide) невозможно. Но я читал в интернете что возможно создать подобную форму . Вот отрывок диалога внизу


«i am not sure if it solves your problem but
Neil Rubenking writes about this in his book
Delphi Programming Problem Solver.
In summary it involves overriding the
form.createparams procedure by first
calling the inherited procedure and then
adding your own stuff.
Try looking at the createparam procedure in
the help and the createwindow and
createwindowex functions in win32.hlp
johan»

Кто нибудь знает как создать подобную форму?
 
S

sinkopa

Я знаю что создать дочернюю форму без границ в компиляторе(ide) невозможно. Но я читал в интернете что возможно создать подобную форму . Вот отрывок диалога внизу
Кто нибудь знает как создать подобную форму?
Неправда... В Delphi создать можно всё что может создать Windows... :rolleyes:
Поясните пожалуйста, что Вы имеете в виду под словами "создать дочернюю форму без границ"?
Это когда у формы нет заголовка и внешних границ бордера? Или дочерняя форма должна уметь "вылезать" за границы главной формы?
Или Вы что-то другое имеете в виду?
 
P

programmer8329

Я же сам пробовал создать форму без заголовка и границ для дочерней формы, но у увы ....
 
S

sinkopa

Я же сам пробовал создать форму без заголовка и границ для дочерней формы, но у увы ....
:) Странная у нас с Вами беседа получается...
Вспомнил анекдот на эту тему
Чапаев: "Петька! Аппарат!"
Петька: "Тринадцать!"
Чапаев: "Чего тринадцать?"
Петька: "А чего аппарат?"
Вопросы Вы почему-то задаете в форме категорического утверждения... ;)
Получается что Вы все 324(с половиной) способа управления формами перепробовали...
А вот этот (второй после чтения help-а) пробовали?
Код:
unit uChildForm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TchildMDIForm = class(TForm) // в дизайн тайм выставить свойство FormStyle := fsMDIChild
closeChildButton: TButton;
procedure closeChildButtonClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
procedure CreateParams(var Params: TCreateParams); override;
public
{ Public declarations }
end;

var
childMDIForm: TchildMDIForm;

implementation

{$R *.dfm}

procedure TchildMDIForm.closeChildButtonClick(Sender: TObject);
begin
Close;
end;

procedure TchildMDIForm.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style and (not WS_CAPTION);
end;

procedure TchildMDIForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;

end.
У гавной формы FormStyle := fsMDIForm
Код:
implementation

uses uChildForm;

{$R *.dfm}

procedure TmainMDIForm.ShowChildFormClick(Sender: TObject);
begin
childMDIForm := TchildMDIForm.Create(Self);
end;
 
P

programmer8329

Большое спасибо за ваш ответ, все действительно работает, у меня еще один вопрос вы вначале затронули тему вылезания формы за границу так вот у меня еще один вопрос если у формы со свойством normal убрать все границы а управление формой осуществляь с помощью кода который « обманывает» форму переводя нажатие мыши на клиентской части в нажатие на панели(caption) и таким образом передвигать форму без границ это не сложно сделать в интернете готовые коды есть, сложнее другое когда такая форма выходит за границы экрана виндоус заталкивают эту форму обратно а как сделать так чтобы форма фиксировалась там где ее разместят даже если ее разместили за границей экрана .
 
S

sinkopa

Большое спасибо за ваш ответ, все действительно работает, у меня еще один вопрос вы вначале затронули тему вылезания формы за границу так вот у меня еще один вопрос если у формы со свойством normal убрать все границы а управление формой осуществляь с помощью кода который « обманывает» форму переводя нажатие мыши на клиентской части в нажатие на панели(caption) и таким образом передвигать форму без границ это не сложно сделать в интернете готовые коды есть, сложнее другое когда такая форма выходит за границы экрана виндоус заталкивают эту форму обратно а как сделать так чтобы форма фиксировалась там где ее разместят даже если ее разместили за границей экрана .
Я опять Вас не понимаю... :)
Каким образом (каким из 5-ти способов) вы реализуете "убрать все границы"?
Какой у Вас код (из 3-х вариантов) "который « обманывает» форму переводя нажатие..."?
Какими действиями (либо кодом) Ваша "такая форма выходит за границы экрана"?
И с чего это вообще виндоус должна эту форму "заталкивать обратно"?
Обычно это как раз программисты бьются над проблемой "не потерять форму" (скажем при изменении пользователем разрешения экрана).
Давайте не будем больше играть в угадайку...
Сделаем так. Накидайте маленький тестовый проектик с Вашими багами и дайте мне в личку ссылу на скачивание и Ваш email.
Я погляжу и отпишусь что "не так" и как подправить. Ок?
 
P

programmer8329

Хорошо в свойствах убираем все границы формы т.е ставим свойство None, после того как нашы границы исчезли ставим код

procedure WMNCHitTest(var M:
TWMNCHitTest); message
wm_NCHitTest


procedure TForm1.WMNCHitTest(var
M: TWMNCHitTest);
begin
inherited;
{ вызов унаследованного
обработчика события }
if M.Result = htClient then
{ кликнув в области окна?
}
M.Result := htCaption;
{ если так, то мы заставили
Windows думать, }
{ что
щелчок был на заголовке окна.
}
end;

Ну и все больше кода нет ,после того как я нажимаю мышью нижнюю часть формы (т.е я нажимаю клиентскую часть формы , а ничего другого и нету) наша форма передвигается, мышью я перетаскиваю форму до верхнего края экрана так что 90 процннтов формы скрывается за верхней границей экрана после того я отпускаю левую кнопку мыши форма выталкивается вниз а мне нужно чтобы она была там где я ее бросил.
 
S

sinkopa

Хорошо в свойствах убираем все границы формы т.е ставим свойство None, после того как нашы границы исчезли ставим код...
Нет НЕ хорошо... Этим своим кодом
Код:
M.Result := htCaption
Вы конечно обманули Windows, но... Вы больше себя обманули :(
Этот код говорит системе буквально следующее: "Мой курсор мыши всегда находится над заголовком формы".
Тем самым все управляющие команды (сообщения) в клиентскую область окна, туда не попадут...
Попробуйте-ка в обработчик (к примеру на OnMouseUp) вставить какой нибудь ShowMessage... :)
Ладно, хватит нравоучений. Вот рабочий код:
Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
private
FDraging: Boolean;
FDragPoint: TPoint;
public
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
FDraging := False;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
FDraging := (Button = mbLeft);
FDragPoint := Point(X, Y);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if FDraging then
begin
Dec(X,FDragPoint.X);
Dec(Y,FDragPoint.Y);
Left := Left + X;
Top := Top + Y;
end;
end;

end.
 
P

programmer8329

Большое спасибо, я протестировал, все работает.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!