akr_Nim
Зарегистрирован: 27.10.2012 Сообщения: 2
|
Добавлено: Сб Окт 27 2012 20:24 Заголовок сообщения: Delphi. Реализация технологии Drag-and-Drop для динамически |
|
|
Рисую примитивный план здания. На форме имеется компонент ScrollBox, в котором, согласно условию, динамически создается Panel (основная площадь здания) с указанными размерами, т.е. Panel.Parent:=Scrollbox. Аналогично создаю комнаты/кабинеты, только в родители им ставлю Panel. Когда создаются комнаты (тоже TPanel), все складываются в кучу в верхнем левом углу. Нужна реализация "раскидывания" их по местам. В дальнейшем в комнатах будут расставляться компьютера (предполагаю SpeedButton'ы), и их тоже нужно будет раскидывать по комнате с использованием Drag-and-Drop. Прошу помощи у знающих людей. Заранее благодарю.
Код:
Код: | unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TPanel = class (ExtCtrls.TPanel)
public
property Canvas; // взлом канваса
end;
TMainForm = class(TForm)
Create_Project: TButton;
PlaneH: TEdit;
PlaneW: TEdit;
Label1: TLabel;
MainPanel: TScrollBox;
add_room: TButton;
RoomName: TEdit;
RoomH: TEdit;
RoomW: TEdit;
PCCount: TEdit;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
RoomCount: TEdit;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Button1: TButton;
procedure add_roomClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
const ms = 30;
procedure FormResize(Sender: TObject);
procedure Create_ProjectClick(Sender: TObject);
private
plane : TPanel;
room : array of TPanel;
RC : integer;
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.add_roomClick(Sender: TObject);
begin
room[RC] := TPanel.Create(Self);
room[RC].Parent := plane;
room[RC].Width := StrToInt(RoomW.Text)* ms;
room[RC].Height := StrToInt(RoomH.Text)* ms;
room[RC].ParentBackground := false;
room[RC].BevelWidth := 2;
room[RC].Dragging;
room[RC].DragMode := dmAutomatic;
room[RC].Color := clWhite;
RC := RC + 1;
end;
procedure TMainForm.Button1Click(Sender: TObject);
var
bmp : TBitmap;
begin
bmp := TBitmap.Create;
bmp.Width := MainPanel.Width;
bmp.Height := MainPanel.Height;
MainPanel.PaintTo(bmp.Canvas, 0, 0);
bmp.SaveToFile('c:\test.bmp');
bmp.Free;
end;
procedure TMainForm.Create_ProjectClick(Sender: TObject);
begin
while MainPanel.ControlCount > 0 do
MainPanel.Controls[0].Free;
plane := TPanel.Create(Self);
plane.Parent := MainPanel;
plane.Width := StrToInt(PlaneW.Text)* ms;
plane.Height := StrToInt(PlaneH.Text)* ms;
plane.BevelWidth := 2;
plane.ParentBackground := false;
plane.Color := clPurple;
plane.DragOver(room[0], 0, 0, dsDragEnter, boolean);
RC := StrToInt(RoomCount.Text);
add_room.Enabled := True;
end;
procedure TMainForm.FormResize(Sender: TObject);
begin
MainPanel.Width := MainForm.Width - 200;
SetLength(room, 100);
end;
end. |
PS: Гуглом пользовался, кучу форумов перерыл, Drag-and-Drop реализовывал на статических объектах, находил обработку событий динамическими объектами, но чтобы было и то и другое - не получается. Пытался написать внешнюю процедуру, и присвоить ее динамическим объектам, но Delphi ругается. |
|