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

Тема в разделе "Delphi - Компоненты", создана пользователем programmer8329, 2 дек 2012.

  1. programmer8329

    Регистрация:
    28 июн 2012
    Сообщения:
    19
    Симпатии:
    0
    Я знаю что создать дочернюю форму без границ в компиляторе(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»

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

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Неправда... В Delphi создать можно всё что может создать Windows... :rolleyes:
    Поясните пожалуйста, что Вы имеете в виду под словами "создать дочернюю форму без границ"?
    Это когда у формы нет заголовка и внешних границ бордера? Или дочерняя форма должна уметь "вылезать" за границы главной формы?
    Или Вы что-то другое имеете в виду?
     
  3. programmer8329

    Регистрация:
    28 июн 2012
    Сообщения:
    19
    Симпатии:
    0
    Я же сам пробовал создать форму без заголовка и границ для дочерней формы, но у увы ....
     
  4. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    :) Странная у нас с Вами беседа получается...
    Вспомнил анекдот на эту тему
    Вопросы Вы почему-то задаете в форме категорического утверждения... ;)
    Получается что Вы все 324(с половиной) способа управления формами перепробовали...
    А вот этот (второй после чтения help-а) пробовали?
    Код (Delphi):
    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
    Код (Delphi):
    implementation

    uses uChildForm;

    {$R *.dfm}

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

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

    sinkopa Well-Known Member

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

    Регистрация:
    28 июн 2012
    Сообщения:
    19
    Симпатии:
    0
    Хорошо в свойствах убираем все границы формы т.е ставим свойство 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 процннтов формы скрывается за верхней границей экрана после того я отпускаю левую кнопку мыши форма выталкивается вниз а мне нужно чтобы она была там где я ее бросил.
     
  8. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Нет НЕ хорошо... Этим своим кодом
    Код (Delphi):
    M.Result := htCaption
    Вы конечно обманули Windows, но... Вы больше себя обманули :(
    Этот код говорит системе буквально следующее: "Мой курсор мыши всегда находится над заголовком формы".
    Тем самым все управляющие команды (сообщения) в клиентскую область окна, туда не попадут...
    Попробуйте-ка в обработчик (к примеру на OnMouseUp) вставить какой нибудь ShowMessage... :)
    Ладно, хватит нравоучений. Вот рабочий код:
    Код (Delphi):
    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.
     
  9. programmer8329

    Регистрация:
    28 июн 2012
    Сообщения:
    19
    Симпатии:
    0
    Большое спасибо, я протестировал, все работает.
     
Загрузка...

Поделиться этой страницей