unit AutoPanel;

interface
uses
	Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,
  	ExtCtrls,dbctrls,stdctrls,db,ADODB,ComCtrls,Variants,Gauges,
   SqlExpr,DBGrids,MovePanel;

type
   TEditorstyle = (TsMemo,Tscombox,Tsedit);

type
  TAutoPanel = class(TPanel)
  private
    { Private declarations }
    FEditorstyle:Teditorstyle;
    FLeft :Integer;
    FTop :Integer;
    maxTextLen :Integer;
    maxLabelLen :Integer;
    FTitleVisible :Boolean;
    FDataReadOnly :Boolean;
    FPageCount :Integer;

    FPass_Grid :TDBGrid;
    FP_Move :TMovePanel;
    FP_Parent :TPanel;

    FPageControl: TPageControl; {分页控件}
    FTabSheets :array of TTabSheet;
    FScrollBox :array of TScrollBox; {滚动控件}
    FLineHeight :Integer;

    //数据数组控件,动态生成
    MemoEditors :array of TMemo;
    comEditors :array of TCombobox;
    edEditors :array of Tedit;
    ProgressEditor :array of Tedit;
    Labels :array of TLabel;  //字段标题,动态生成
    ProgressBars :array of TGauge;
    Shapes :array of TShape;
    FDataSource :TDataSource; // 数据源
    FDataField_A  :String;  // DataField
    FDataField_B :String;  // DataField
    FDataField_C :String;  // DataField
    FDataField_D  :String;  // DataField
    FDataField_E :String;  // DataField
    FDataField_F :String;  // DataField
    FStore :String;
    Fcnnstr :String;
    FListSql :String;
    FBerthFieldName :String;
    FStoreFieldName :String;
    FBerthTableName :String;
    
    FColumns :Integer; //显示列数
    tmpado :TadoDataset;
    tmpDs :TDataSource;
    procedure FreeEditors; //释放数据输入控件的内存
    procedure AKeyDown(Sender:TObject; var Key :Word; Shift:TShiftState);
    procedure AKeyPress(Sender:TObject; var Key :Char);
    procedure AProgressEditorChange(Sender :TObject);
    procedure inti_Grid(sender :TObject);
    procedure LabelsClick(Sender: TObject);
    procedure FP_MovePanelDblClick(Sender: TObject);
    function comEditor(Index :Integer):TComboBox;
    function edEditor(Index :Integer):Tedit;
    function MemoEditor(Index :Integer) :TMemo;
  protected
    { Protected declarations }

  public
      constructor Create(AOwner:TComponent); override;
      destructor Destroy; override;
    	procedure Setedit(Value  :TEditorstyle);
    	procedure CreateEditors(var DS :TDataSource; cnnstr :String);  //创建各字段的数据输入控件
    	procedure ClearHits(ItemIndex :Integer);
    	procedure AddHits(ItemIndex:Integer; Hits :array of string);

    { Public declarations }
    published

    	property LimitLeft :Integer read FLeft write FLeft default 10;
    	property LimitTop :Integer read FTop write FTop default 10;
    	property Editorstyle :TEditorstyle read FEditorstyle write Setedit default TsMemo;

    	property EditorWidth :Integer read maxTextLen write maxTextLen  default 100;
    	property TitleWidth :Integer read maxLabelLen write maxLabelLen  default 100;
    	property TitleVisible :Boolean read FTitleVisible write FTitleVisible default True;
      property DataReadOnly :Boolean read FDataReadOnly write FDataReadOnly; //default True;
    	property LineHeight :Integer read FLineHeight write FLineHeight  default 15;
    	property DataSource :TDataSource read FDataSource write FDataSource; //数据源
      property DataField_Editor :String read FDataField_A write FDataField_A;
      property DataField_Title :String read FDataField_B write FDataField_B;
      property DataField_Progress :String read FDataField_C write FDataField_C;
      property DataField_BerthArea :String read FDataField_D write FDataField_D;
      property DataField_IconLeft :String read FDataField_E write FDataField_E;
      property DataField_IconTop :String read FDataField_F write FDataField_F;

      property Data_BerthListSql :String read FListSql write FListSql;
      property Data_BerthField :String read FBerthFieldName write FBerthFieldName;
      property Data_StoreField :String read FStoreFieldName write FStoreFieldName;

      property Data_BerthTable :String read FBerthTableName write FBerthTableName;
      property Store_Name :String read FStore write FStore;
      property Columns :Integer read FColumns write FColumns default 4;//表列数

    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Data Controls', [TAutoPanel]);
end;

procedure TAutoPanel.Setedit(Value  :TEditorstyle);
begin
  	if FEditorstyle <> Value then
   begin
   	FEditorstyle := Value;
   	Invalidate;
   end;
end;

{ 为第I字段增加提示信息的方法}
procedure TAutoPanel.AddHits(ItemIndex :Integer; Hits :array of string);
var
  m,n,i :Integer;
begin

	if FEditorstyle = Tscombox then
 	begin
   	n := Length(comEditors);
    	m := Length(Hits);
   	if ItemIndex< n then
      for i:= 0 to m - 1 do
        	comEditors[ItemIndex].Items.Add(Hits[i]);
	end
  	else if FEditorstyle = Tsedit then
  	begin
   	n := Length(edEditors);
    	m := Length(Hits);
   	if ItemIndex< n then
      for i:=0 to m-1 do
      	edEditors[ItemIndex].Hint:= Hits[i];
   end
  	else if FEditorstyle = TsMemo then
  	begin
   	n := Length(memoEditors);
    	m := Length(Hits);
   	if ItemIndex< n then
      for i:=0 to m-1 do
      	memoEditors[ItemIndex].Hint:= Hits[i];
   end;
end;

procedure TAutoPanel.AKeyDown(Sender :TObject; var Key :Word; Shift :TShiftState);
begin
   //
end;

procedure TAutoPanel.AProgressEditorChange(Sender :TObject);
begin
     //
end;

procedure TAutoPanel.AKeyPress(Sender :TObject; var Key :Char);
begin
   if (Sender is TComboBox) or (Sender is Tedit) or (Sender is TMemo) then
   if Key=#13 then
   	(Owner as TForm).Perform(WM_NEXTDLGCTL, 0, 0);
end;

procedure TAutoPanel.ClearHits(ItemIndex :Integer);
var
  n :Integer;
begin
 	if FEditorstyle = Tscombox then
  	begin
   	n := Length(comEditors);
   	if ItemIndex< n then comEditors[ItemIndex].Items.Clear;
   end
   else if FEditorstyle = Tsedit then
   begin
      n := Length(edEditors);
      if ItemIndex< n then edEditors[ItemIndex].Hint:='';;
   end
   else if FEditorstyle = TsMemo then
   begin
      n := Length(MemoEditors);
      if ItemIndex< n then MemoEditors[ItemIndex].Hint:='';;
   end;

end;

constructor TAutoPanel.Create(AOwner :TComponent);
begin
   Inherited Create(AOWner);
   FLeft := 20;
   FTop := 20;
   maxTextLen := 100;
   maxLabelLen := 100;
   FLineHeight := 15;
   FTitleVisible := True;
   FDataReadOnly := True;
end;

{ 创建各字段的数据输入控件的方法}
procedure TAutoPanel.CreateEditors(var DS :TDataSource; cnnstr :String);

var
  i,j,n,This_Index,TextHeight :Integer;
  tmp_col0,Tmp_Row0,tmp_col1,Tmp_Row1 :Integer;
  XXX :TStringList;
  tmpFlag :Boolean;
begin
   if (Store_Name = '')
      or (Data_BerthTable = '')
         or (DataField_BerthArea = '') then
            exit;
   { 释放全部控件内存}
   FreeEditors;

	if DS = nil then exit;
   if DataSource = nil then FDataSource := Ds;
   if not DataSource.DataSet.Active then exit;
   if  (DataSource.DataSet is TAdoDataSet) = False then exit;
   FPageCount := 0;
   tmp_col1 := -1;
   Tmp_Row1 := 0;

   n := DataSource.DataSet.RecordCount;
   if n <= 0 then exit;
   DataSource.DataSet.DisableControls;
   if maxLabelLen < maxTextLen then
      maxTextLen := maxLabelLen;
    	
   { 计算最大的标题长度及显示长度}
   DataSource.DataSet.First;
   { 计算高度}
   TextHeight := Canvas.TextHeight(DataSource.DataSet.Fields[0].DisplayLabel) + FLineHeight; //10;

   { 分配内存}
   SetLength(Labels,n);
   SetLength(ProgressBars,n);
   SetLength(ProgressEditor,n);
   SetLength(Shapes,n);
   if Columns = 0 then Columns := 6;
   try
      tmpado := TadoDataset.Create(Owner);
      tmpDs := TDatasource.Create(Owner);
      tmpDs.DataSet := tmpado;
      with tmpado do
      begin
         Active := False;
         Fcnnstr := cnnstr;
         tmpado.ConnectionString := Fcnnstr;
         //tmpado.Connection := (DataSource.DataSet as TAdoDataset).Connection;
         tmpado.CommandText := ' Select '+DataField_BerthArea+' '
                             + ' from '+Data_BerthTable+' where '+DataField_BerthArea+' is not null'
                             + ' and '+Data_StoreField+' = '''+Store_Name+''''
                             + ' Group by '+DataField_BerthArea+' order by '+DataField_BerthArea+'';
         Active := True;
         FPageCount := RecordCount;
         if FPageCount = 0 then exit;

         first;
         // 创建PageControl
         FPageControl := TPageControl.Create(Owner);
         FPageControl.Parent := Self;
         FPageControl.Font.Name := '宋体';
         FPageControl.Font.Size := 9;
         FPageControl.Align := alClient;
         FPageControl.Visible := False;

         { 分配载体内存}
         setlength(FTabSheets,FPageCount+1);
         setlength(FScrollBox,FPageCount+1);
         XXX := TStringList.Create();
         for j := 0 to FPageCount do
         begin
            { FPageControl分页}
            FTabSheets[j] := TTabSheet.Create(Owner);
            FTabSheets[j].Parent := FPageControl;
            FTabSheets[j].ParentFont := True;
            FTabSheets[j].PageControl := FPageControl;
            FTabSheets[j].Visible := True;
            FTabSheets[j].PageIndex := j;
            
            if j < FPageCount then
            begin
               FTabSheets[j].Caption := '库区:' + trim(fieldByName(DataField_BerthArea).AsString);
               FTabSheets[j].Hint := trim(fieldByName(DataField_BerthArea).AsString);
               XXX.Append(trim(fieldByName(DataField_BerthArea).AsString));
            end
            else
            begin
               FTabSheets[j].Caption := '未指定库区';
               FTabSheets[j].Hint := '';
               XXX.Append('未指定库区');
            end;
            FTabSheets[j].ShowHint := False;
            FTabSheets[j].Visible := True;
            FTabSheets[j].Align := alClient;

    	      //创建滚动盒
    	      FScrollBox[j] := TScrollBox.Create(Owner);
            FScrollBox[j].Visible := True;
    	      FScrollBox[j].Parent := FTabSheets[j];
            FScrollBox[j].Color := ClBlack;//clTeal;
    	      FScrollBox[j].Align := alClient;
            FScrollBox[j].Hint := FTabSheets[j].Hint;
            FScrollBox[j].ShowHint := False;

            next;
         end;
         
      end;

    	if FEditorstyle = Tscombox then
    		SetLength(comEditors,n)
    	else if FEditorstyle = Tsedit then
    		SetLength(edEditors,n)
    	else
    		SetLength(MemoEditors,n);


    	{ 创建编辑}
    	for i := 0 to n - 1 do
    	begin
         //DataField_BerthArea
         if DataSource.DataSet.Fieldbyname(DataField_BerthArea).AsVariant = null then
            This_Index := FPageCount
         else
            This_Index := XXX.IndexOf(trim(DataSource.DataSet.Fieldbyname(DataField_BerthArea).Asstring));

         tmpFlag := False;
         if DataSource.DataSet.Fieldbyname(DataField_IconLeft).AsVariant <> null then
      		tmp_col0 := DataSource.DataSet.Fieldbyname(DataField_IconLeft).Asinteger -1
         else
         begin
            tmpFlag := True;
            if tmp_col1 = Columns -1 then
            begin
               tmp_col1 := 0;
               tmp_Row1 := tmp_Row1 +1;
            end
            else
               tmp_col1 := tmp_col1 + 1;
            tmp_col0 := tmp_col1;
            This_Index := FPageCount;
         end;

         if DataSource.DataSet.Fieldbyname(DataField_IconTop).AsVariant <> null then
            tmp_Row0 := DataSource.DataSet.Fieldbyname(DataField_IconTop).Asinteger - 1
         else
         begin
            if not tmpFlag then
            begin
               if tmp_col1 = Columns - 1 then
               begin
                  tmp_col1 := 0;
                  tmp_Row1 := tmp_Row1 +1;
               end
               else
                  tmp_col1 := tmp_col1 + 1;
            end;
            tmp_Row0 := tmp_Row1;
            This_Index := FPageCount;
         end;
      	{ 创建标题}
      	Labels[i] := TLabel.Create(owner);
         Labels[i].visible := FTitleVisible;
      	Labels[i].Parent := (FScrollBox[This_Index] as TScrollBox);  // FScrollBox[This_Index];
         Labels[i].Font.Name := '宋体';
         Labels[i].Font.Size := 9;
         Labels[i].Font.Color := ClBlue;
         Labels[i].OnClick := LabelsClick;
         //Labels[i].Font.Style := [FsBold];
         Labels[i].Transparent := True;
         if DataSource.DataSet.Fieldbyname(DataField_Title).AsVariant <> null then
      		Labels[i].caption := DataSource.DataSet.Fieldbyname(DataField_Title).AsString
         else
            Labels[i].caption := '';
         Labels[i].Hint := '库位:[' + Labels[i].caption + ']';
         Labels[i].ShowHint := True;
         if FEditorstyle = TsMemo then
         begin
      		Labels[i].Top := FTop + tmp_Row0 * (TextHeight*3+30) + 2;
            Labels[i].Left := FLeft + (maxLabelLen + 40) * tmp_Col0 + 10;
            Labels[i].Width := maxLabelLen;
         end
         else
         begin
         	Labels[i].Top := FTop + tmp_Row0 * (TextHeight*2+30) + 2;
            Labels[i].Left := FLeft + (maxLabelLen + 30) * tmp_Col0 + 10;
            Labels[i].Width := maxLabelLen;
         end;

         { 创建进度条数据对象}
      	ProgressEditor[i] := Tedit.Create(Owner);
         ProgressEditor[i].visible := False;
      	ProgressEditor[i].Parent := FScrollBox[This_Index];
         if DataSource.DataSet.Fieldbyname(DataField_Progress).AsVariant <> null then
         	ProgressEditor[i].Text := DataSource.DataSet.Fieldbyname(DataField_Progress).AsString
         else
         	ProgressEditor[i].Text := '0';
         ProgressEditor[i].OnChange := AProgressEditorChange;
         
      	{ 创建信息显示数据对象}
	 		if FEditorstyle = Tscombox then
    		begin
      		comEditors[i] := TComboBox.Create(Owner);
      		comEditors[i].Parent := FScrollBox[This_Index]; //Self;
      		comEditors[i].Left := Labels[i].Left; //+ Labels[i].Width;
      		comEditors[i].Width := maxTextLen;
      		comEditors[i].Top := Labels[i].Top+20;
            if DataSource.DataSet.Fieldbyname(DataField_Editor).AsVariant <> null then
 					comEditors[i].Text := DataSource.DataSet.Fieldbyname(DataField_Editor).AsString;
      		comEditors[i].OnKeyPress := AKeyPress;
      		comEditors[i].OnKeyDown := AKeyDown;
         	ProgressBars[i] := TGauge.Create(Owner);
         	ProgressBars[i].Parent := FScrollBox[This_Index];
            ProgressBars[i].Font.name := '宋体';
            ProgressBars[i].Font.Size := 9;
            ProgressBars[i].ShowText := True;
            ProgressBars[i].Font.Color := ClWindow;
            ProgressBars[i].Kind := gkHorizontalBar;
         	ProgressBars[i].Left := comEditors[i].Left;
         	ProgressBars[i].Width := comEditors[i].Width;
         	ProgressBars[i].Height := 10;
         	ProgressBars[i].Top := comEditors[i].Top+comEditors[i].height+2;
         	ProgressBars[i].Progress := Round((DataSource.DataSet
                                        .Fieldbyname(DataField_Progress).Ascurrency)*100);
    		end
    		else if FEditorstyle = Tsedit then
    		begin
      		edEditors[i] := Tedit.Create(Owner);
      		edEditors[i].Parent := FScrollBox[This_Index];
      		edEditors[i].Left := Labels[i].Left; //+ Labels[i].Width;
      		edEditors[i].Width := maxTextLen;
      		edEditors[i].Top := Labels[i].Top+20;
            edEditors[i].ReadOnly := DataReadOnly;
            if DataSource.DataSet.Fieldbyname(DataField_Editor).AsVariant <> null then
            	edEditors[i].Text := DataSource.DataSet.Fieldbyname(DataField_Editor).AsString;
      		edEditors[i].OnKeyPress := AKeyPress;
      		edEditors[i].OnKeyDown := AKeyDown;
         	ProgressBars[i] := TGauge.Create(Owner);
         	ProgressBars[i].Parent := FScrollBox[This_Index];
            ProgressBars[i].Font.name := '宋体';
            ProgressBars[i].Font.Size := 9;
            ProgressBars[i].ShowText := True;
            ProgressBars[i].Font.Color := ClWindow;
            ProgressBars[i].Kind := gkHorizontalBar;
         	ProgressBars[i].Left := edEditors[i].Left;
         	ProgressBars[i].Width := edEditors[i].Width;
         	ProgressBars[i].Height := 10;
         	ProgressBars[i].Top := edEditors[i].Top+edEditors[i].height+2;;
         	ProgressBars[i].Progress := Round((DataSource.DataSet
                                        .Fieldbyname(DataField_Progress).Ascurrency)*100);
    		end
    		else
    		begin
      		MemoEditors[i] := Tmemo.Create(Owner);
      		MemoEditors[i].Parent := FScrollBox[This_Index];
      		MemoEditors[i].Left := Labels[i].Left;
      		MemoEditors[i].Width := maxTextLen;
      		MemoEditors[i].Top := Labels[i].Top+20;
            MemoEditors[i].Height := 60;
            MemoEditors[i].ReadOnly := DataReadOnly;
            if DataSource.DataSet.Fieldbyname(DataField_Editor).AsVariant <> null then
            	MemoEditors[i].Lines.Add(DataSource.DataSet.Fieldbyname(DataField_Editor).AsString);
      		MemoEditors[i].OnKeyPress := AKeyPress;
      		MemoEditors[i].OnKeyDown := AKeyDown;
         	ProgressBars[i] := TGauge.Create(Owner);
         	ProgressBars[i].Parent := FScrollBox[This_Index];
            ProgressBars[i].Font.name := '宋体';
            ProgressBars[i].Font.Size := 9;
            ProgressBars[i].ShowText := False;
            ProgressBars[i].Font.Color := ClWindow;
            ProgressBars[i].Kind := gkVerticalBar;
         	ProgressBars[i].Left := MemoEditors[i].Left + MemoEditors[i].Width +1;
         	ProgressBars[i].Width := 10;
         	ProgressBars[i].Height := MemoEditors[i].Height;
         	ProgressBars[i].Top := MemoEditors[i].Top;
         	ProgressBars[i].Progress := Round((DataSource.DataSet
                                        .Fieldbyname(DataField_Progress).Ascurrency)*100);
    		end;
         if ProgressBars[i].Progress <= 20 then
         	ProgressBars[i].ForeColor := RGB(48,48,96)
         else if (ProgressBars[i].Progress > 20) and (ProgressBars[i].Progress <= 40) then
         	ProgressBars[i].ForeColor := RGB(48,48,144)
         else if (ProgressBars[i].Progress > 40) and (ProgressBars[i].Progress <= 60) then
         	ProgressBars[i].ForeColor := RGB(96,48,144)
         else if (ProgressBars[i].Progress > 60) and (ProgressBars[i].Progress <= 80) then
         	ProgressBars[i].ForeColor := RGB(144,48,144)
         else if ProgressBars[i].Progress > 80  then
         	ProgressBars[i].ForeColor := RGB(200,48,48);

      	Shapes[i] := TShape.Create(Owner);
      	Shapes[i].Parent := FScrollBox[This_Index];
         Shapes[i].Left := Labels[i].Left - 10;
         Shapes[i].top := Labels[i].Top  - 10;
         if FEditorstyle = TsMemo then
         begin
         	Shapes[i].height := ProgressBars[i].height + Labels[i].height +20 +10;
            Shapes[i].Width := (ProgressBars[i].left - Labels[i].left) + ProgressBars[i].Width + 20;
         end
         else
         begin
         	Shapes[i].height := (ProgressBars[i].Top - Labels[i].Top) + ProgressBars[i].Height + 20;
            Shapes[i].Width := Labels[i].Width +20;
         end;
         Shapes[i].Brush.Color := clSkyBlue;
         Shapes[i].Visible := True;
         Shapes[i].SendToBack;
         if not DataSource.DataSet.Eof then
         	DataSource.DataSet.next;
  		end;
      DataSource.DataSet.EnableControls;
      tmpado.Close;
      XXX.Free;
      if FPageControl.PageCount > 0 then
      begin
         FPageControl.ActivePageIndex := FPageControl.PageCount-1;
         FPageControl.ActivePageIndex := 0;
      end;
	Finally
      FPageControl.Visible := True;
   end;
end;

destructor TAutoPanel.Destroy;
begin
  	FreeEditors;
  	Inherited Destroy;
end;

function TAutoPanel.comEditor(Index :Integer) :TComboBox;
begin
  	if Index< Length(comEditors) then Result := comEditors[Index]
  	else Result := nil;
end;

function TAutoPanel.edEditor(Index :Integer) :Tedit;
begin
  	if Index < Length(edEditors) then Result := edEditors[Index]
  	else Result := nil;
end;
function TAutoPanel.MemoEditor(Index :Integer) :TMemo;
begin
  	if Index< Length(MemoEditors) then Result := MemoEditors[Index]
  	else Result := nil;
end;

procedure TAutoPanel.inti_Grid(sender :TObject);
begin
   try
    // 创建FP_Parent
   FP_Parent := TPanel.Create(Owner);
   with  FP_Parent Do
   begin
      Parent := Self;
      Visible := False;
      Font.Name := '宋体';
      Font.Size := 9;
      Font.Style:= [fsBold];
      Align := AlNone;
      BevelInner := bvLowered;
      BevelOuter := bvRaised;
      Width := 380;
      Height := 250;
      try
         Left := round(((Sender as Tlabel).Parent.Width-380)/2);
         Top := round(((Sender as Tlabel).Parent.height-250)/2);
      except
         Left := 0;
         Top := 0;
      end;
   end;

   FP_Move := TMovePanel.Create(Owner);
   with FP_Move do
   begin
      Parent := FP_Parent;
      ParentFont := true;
      BevelInner := bvLowered;
      BevelOuter := bvRaised;
      Height := 26;
      Align := AlTop;
      Color := clSkyBlue;
      Caption := '';
      OnDblClick := FP_MovePanelDblClick;
      Visible := True;
   end;

   FPass_Grid := TDBGrid.Create(Owner);
   with FPass_Grid do
   begin
      Parent := FP_Parent;
      ParentFont := true;
      Font.Style:= [];
      Align := AlClient;
      Visible := True;
      DataSource := TmpDs;
   end;
   except
        FPass_Grid := Nil;
        FP_Move := Nil;
        FP_Parent := Nil;
   end;
end;

//响应Labels[i]的Click事件
procedure TAutoPanel.LabelsClick(Sender: TObject);
var
   i :integer;
   Tmp_Area,Tmp_Berth :String;
begin
   try
      if FP_Parent = nil then inti_Grid(Sender);
      if FP_Parent = nil then exit;
      Tmp_Berth := trim((Sender as Tlabel).Caption);
      Tmp_Area := trim(((Sender as Tlabel).Parent as TScrollBox).Hint);
      if tmpado.Active then
      begin
         if tmpado.FieldValues['库位'] <> null then
         if tmpado.FieldByName('库位').AsString = Tmp_Berth then
            exit;
      end;
      screen.Cursor := crSQLWait;
      //FP_Parent.Visible := False;
      //FP_Parent.Left := FPageControl.Left + (Sender as Tlabel).Left + (Sender as Tlabel).Width + 28;
      //FP_Parent.Top := FPageControl.Top + (Sender as Tlabel).top + (Sender as Tlabel).Height +4;
      FP_Move.Caption := trim((Sender as Tlabel).Hint) + '明细列表';
      with tmpado do
      begin
         DisableConTrols;
         Active := False;
         ConnectionString := Fcnnstr;
         tmpado.CursorType := ctStatic;
         tmpado.LockType := ltReadOnly;
         CommandText := 'Exec '+Data_BerthListSql+' '''+Store_Name+''','''+Tmp_Area+''','''+Tmp_Berth+'''';
         Active := True;
         First;
         EnableConTrols;
         for i := 0 to Fields.Count -1 do
         begin
            Fields[i].Alignment := taCenter;
            if i = 0 then
               fields[i].DisplayWidth := 20
            else
               fields[i].DisplayWidth := 8;

            Fpass_Grid.Columns[i].Title.Alignment := taCenter;
            Fpass_Grid.Columns[i].Title.Font.Style:= [];
         end;

      end;
      screen.Cursor := crDefault;
      FP_Parent.Visible := True;
   except
      screen.Cursor := crDefault;
   end;
end;

procedure TAutoPanel.FP_MovePanelDblClick(Sender: TObject);
begin
   FP_Parent.Visible := False;
end;

// 内存的释放是要有顺序的!必须以创建的相反的顺序进行!尤其是当组件之间有父子关系时
procedure TAutoPanel.FreeEditors;
begin
  	if FPageControl <> nil then
   begin
      if FP_Parent <> nil then
      begin
         try
            FPass_Grid.Free;
            FP_Move.Free;
   	      FP_Parent.Free;
         except
            //
         end;
      end;
      FPass_Grid := nil;
      FP_Move := nil;
   	FP_Parent := nil;
      Shapes := nil;
      ProgressBars := nil;
   	comEditors := nil;
   	edEditors := nil;
   	MemoEditors := nil;
    	FScrollBox := nil;
      tmpDs.Free;
      tmpado.Free;
      FPageControl.Free;
  	end;
end;

end.