5,927
社区成员




unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Grids, RzGrids, StdCtrls;
type
TForm1 = class(TForm)
grdTest: TRzStringGrid;
btnCreatePanel: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnCreatePanelClick(Sender: TObject);
procedure grdTestTopLeftChanged(Sender: TObject);
private
FPanelList: TList;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
type
PRecPanel = ^TRecPanel;
TRecPanel = record
Panel : TPanel;
LeftCol: Integer;
TopRow : Integer;
end;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FPanelList := TList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
FData: PRecPanel;
begin
while FPanelList.Count > 0 do
begin
if Assigned(FPanelList.Items[0]) then
begin
FData := PRecPanel(FPanelList.Items[0]);
FData^.Panel.Free;
Dispose(FData);
end;
FPanelList.Delete(0);
end;
FPanelList.Free;
end;
procedure TForm1.btnCreatePanelClick(Sender: TObject);
var
FData : PRecPanel;
FPanel: TPanel;
begin
FPanel := TPanel.Create(grdTest);
FPanel.Parent := grdTest;
FPanel.Caption := 'Panel ' + IntToStr(FPanelList.Count + 1);
FPanel.Left := 100;
FPanel.Top := 30;
FPanel.Width := 180;
FPanel.Height := 50;
New(FData);
FData^.Panel := FPanel;
FData^.LeftCol := grdTest.LeftCol;
FData^.TopRow := grdTest.TopRow;
FPanelList.Add(FData);
end;
procedure TForm1.grdTestTopLeftChanged(Sender: TObject);
var
I : Integer;
FData: PRecPanel;
begin
LockWindowUpdate(grdTest.Handle);
try
for I:=0 to FPanelList.Count-1 do
begin
FData := PRecPanel(FPanelList.Items[I]);
FData^.Panel.Left := FData^.Panel.Left - (grdTest.LeftCol - FData^.LeftCol) * grdTest.DefaultColWidth;
FData^.Panel.Top := FData^.Panel.Top - (grdTest.TopRow - FData^.TopRow) * grdTest.DefaultRowHeight;
FData^.LeftCol := grdTest.LeftCol;
FData^.TopRow := grdTest.TopRow;
end;
grdTest.Invalidate;
finally
LockWindowUpdate(0);
end;
end;
end.
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
//根据行列限制panel的大小,可以改为一个区域的
if (ACol = 1) and (ARow = 1) then
begin
Panel1.SetBounds(Rect.Left,Rect.Top,rect.Right-rect.Left,Rect.Bottom-rect.Top);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Panel1.Parent := StringGrid1;
end;