Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > перемещение динамически созданной формы


Автор: asad 16.2.2009, 21:20
У меня такая проблема: нужно перемещать форму не за заголовок, потому что его нету.
Я создаю динамически форму, с Image и Label. BorderStyle у этой формы должен быть bsNone. В общем как это сделать мне понятно, когда форма создаётся не динамически. А вот когда динамически я не пойму, что куда и как писать =( 
Помогите пожалуйста!!!!

Автор: THandle 16.2.2009, 23:25
asad, А чем отличается динамическое создание формы от нединамического в данном случае? Ведь все события и обработчики остаются те же. Сделай такой обработчик OnMouseDown в design-time:
Код


procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin
    ReleaseCapture;
    Perform(WM_SYSCOMMAND, $F012, 0);
  end;
end;


А форму с ним создавай как хочется. smile

Автор: Poseidon 17.2.2009, 00:43
Можно отлавливать WM_NCHITTEST и "говорить" системе что вся форма это и есть заголовок.

Код
private
  procedure WMNCHITTEST(var Msg: TMessage); message WM_NCHITTEST;

{...}

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetWindowLong(Handle, GWL_STYLE,
                             GETWINDOWLONG(Handle, GWL_STYLE) and (not WS_CAPTION));
  Height := ClientHeight;
end;

procedure TForm1.WMNCHITTEST(var Msg: TMessage);
begin
  inherited;
  Msg.Result := HTCAPTION;
end;


Если на форме нет кнопок и др. компонентов от TWinControl, то работать будет как надо smile

Автор: bems 17.2.2009, 15:36
THandle, А без черной магии никак? Вариант Poseidon имхо лучше

Автор: asad 17.2.2009, 21:11
Всё дело в том , что на форме1(главная форма), я нажимаю на кнопку, открывается форма2. там я опять нажимаю на кнопку и на форме1, появляется формаN.  И таких формN может быть неограниченное количество.  Из-за этого я не пойму куда прописать эту процедуру.
Код

private
  procedure WMNCHITTEST(var Msg: TMessage); message WM_NCHITTEST;
{...}
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetWindowLong(Handle, GWL_STYLE,
                             GETWINDOWLONG(Handle, GWL_STYLE) and (not WS_CAPTION));
  Height := ClientHeight;
end;
procedure TForm1.WMNCHITTEST(var Msg: TMessage);
begin
  inherited;
  Msg.Result := HTCAPTION;
end;



Автор: Poseidon 18.2.2009, 01:01
Цитата(asad @  17.2.2009,  21:11 Найти цитируемый пост)
и на форме1, появляется формаN
Форма появляется на форме? Что-то ты перечитал видимо.

Цитата(asad @  17.2.2009,  21:11 Найти цитируемый пост)
.  Из-за этого я не пойму куда прописать эту процедуру.
Прописываешь это для той формы, которую и хочешь "тягать".

Автор: asad 18.2.2009, 15:43
Я создаю массив форм. Их то я и хочу двигать. 
Покажите пожалуйста, что куда вписать. А то я недогоняю=((
Код

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls, Mask;

type
  TForm2 = class(TForm)
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Image1: TImage;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    UpDown1: TUpDown;
    Label3: TLabel;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    MaskEdit1: TMaskEdit;

    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  NewImage: Array of TImage;
  NewLabel: Array of TLabel;
  NewForm: Array of TForm;
  n,i, w:integer;
implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.BitBtn1Click(Sender: TObject);
begin
  n:=Random(0)+1;
SetLength(NewForm,n);
SetLength(Newimage,n);
SetLength(Newlabel,n);
for i:=0 to n-1 do

   begin
   NewForm[i]:=TForm.Create(Self);
   NewForm[i].Show;
   NewForm[i].SetBounds(300,300,80,110);
   newform[i].parent:=Form1;
   newform[i].BorderStyle:=bsnone;
   newform[i].Color:=clwhite;

       newimage[i]:=TImage.Create(self);
       newimage[i].Parent:=newform[i];
       Newimage[i].Left:=10;
       Newimage[i].Top:=10;
       newimage[i].Height:=100;
       newimage[i].Width:=100;
       newimage[i].Picture.LoadFromFile('computer.bmp');

           newlabel[i]:=tlabel.Create(self);
           newlabel[i].parent:=newform[i];
           newlabel[i].Left:=30;
           newlabel[i].Top:=0;
           newlabel[i].Caption:=edit1.Text;



end;
   close;
end;
procedure TForm2.BitBtn2Click(Sender: TObject);
begin
 close;
end;

end.

Автор: THandle 18.2.2009, 15:50
asad, Создай новую форму (Пусть её класс будет TMYNewForm), через File->New->Form.
Кинь на нее Image, Label, что там еще у тебя в массивах лежит и создается для каждой формы. Сделай у этой формы  обработку какую дал Poseidon(ну или местный черный маг), а потом массив уже делай не TForm'ов, а TMYNewForm'ов:

Код

  NewForm: Array of TMyNewForm;


И создавай их в цикле как это делаешь. Только уже не надо будет создавать компоненты - они уже лежат на форме.

Автор: asad 19.2.2009, 20:07
Цитата(THandle @ 18.2.2009,  15:50)
asad, Создай новую форму (Пусть её класс будет TMYNewForm), через File->New->Form.
Кинь на нее Image, Label, что там еще у тебя в массивах лежит и создается для каждой формы. Сделай у этой формы  обработку какую дал Poseidon(ну или местный черный маг), а потом массив уже делай не TForm'ов, а TMYNewForm'ов:

Код

  NewForm: Array of TMyNewForm;


И создавай их в цикле как это делаешь. Только уже не надо будет создавать компоненты - они уже лежат на форме.

Не получается smile  =((( Дельфи постоянно ругается. Объясните пожалуйста по подробнее, как поменять класс...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)