1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
unit MAIN;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls,
StdCtrls, Dialogs, Messages, ExtCtrls, ChildPanel,JvCaptionPanel;
type
TConnector=class(TComponent)
private
FFromPanel: TMyPanel;
FToPanel: TMyPanel;
procedure SetFromPanel(const Value: TMyPanel);
procedure SetToPanel(const Value: TMyPanel);
public
constructor Create(AOwner:TComponent); override;
destructor Destroy; override;
procedure DrawLine(ACanvas:TCanvas);
published
property FromPanel:TMyPanel read FFromPanel write SetFromPanel;
property ToPanel:TMyPanel read FToPanel write SetToPanel;
end;
TMainForm = class(TForm)
ButtonNewForm: TButton;
PaintBox1: TPaintBox;
procedure ButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure PaintBox1Paint(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ déclarations privées }
procedure CreatePanelChild(const Name: string);
public
{ déclarations publiques }
CurrentFrom:TMyPanel;
PanelChildCount:Integer;
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.CreatePanelChild(const Name: string);
var
Child: TJvCaptionpanel;
begin
{ crée une nouvelle fenêtre Panel enfant }
Child := TMyPanel.Create(self);
Child.Parent:=Self;
Child.Caption := Name;
Child.CaptionFont.Name:='Arial';
Child.Buttons:=[capClose];
Child.Width:=150;
Child.Height:=150;
end;
procedure TMainForm.ButtonClick(Sender: TObject);
begin
Inc(PanelChildCount);
CreatePanelChild('NONAME' + IntToStr(PanelChildCount));
end;
{ TConnector }
constructor TConnector.Create(AOwner: TComponent);
begin
inherited;
FFromPanel:=nil;
FToPanel:=nil;
end;
destructor TConnector.Destroy;
begin
inherited;
FFromPanel:=nil;
FToPanel:=nil;
end;
procedure TConnector.DrawLine(ACanvas:TCanvas);
var X1,Y1,X2,Y2:Integer;
begin
if ((FToPanel=nil) or (FFromPanel=nil)) then Exit;
with ACanvas do
begin
Pen.Color:=clRed;
Pen.Width:=2;
X1:=FFromPanel.Left+FFromPanel.Width div 2;
Y1:=FFromPanel.Top+FFromPanel.Height div 2;
X2:=FToPanel.Left+FToPanel.Width div 2;
Y2:=FToPanel.Top+FToPanel.Height div 2;
MoveTo(X1,Y1);
LineTo(X2,Y2);
end;
end;
procedure TConnector.SetFromPanel(const Value: TMyPanel);
begin
FFromPanel := Value;
end;
procedure TConnector.SetToPanel(const Value: TMyPanel);
begin
FToPanel := Value;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
CurrentFrom:=nil;
PanelChildCount:=0;
end;
procedure TMainForm.PaintBox1Paint(Sender: TObject);
var i:Integer;
AConnector:TConnector;
begin
if MainForm.ComponentCount>0 then
for i:=MainForm.ComponentCount-1 downto 0 do
if (MainForm.Components[i] is TMyPanel) then
begin
if not (MainForm.Components[i] as TMyPanel).Visible then
(MainForm.Components[i] as TMyPanel).Free;
end;
if MainForm.ComponentCount>0 then
for i:=0 to MainForm.ComponentCount-1 do
if (MainForm.Components[i] is TConnector) then
begin
AConnector:=(MainForm.Components[i] as TConnector);
AConnector.DrawLine(PaintBox1.Canvas);
end;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
var i:Integer;
AConnector:TConnector;
begin
if ComponentCount>0 then
for i:=0 to MainForm.ComponentCount-1 do
if (Components[i] is TConnector) then
begin
AConnector:=(Components[i] as TConnector);
AConnector.Free;
AConnector:=nil;
end;
end;
end. |
Partager