unit JkPanel; interface uses Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs, ExtCtrls,dbctrls,stdctrls,db,ADODB,ComCtrls,Variants,Gauges, SqlExpr,Grids,DBGrids,MovePanel,JKFootpanel,Buttons,dsr; type TEditorstyle = (TsMemo,Tscombox,Tsedit); type TJkPanel = class(TPanel) private { Private declarations } This_Jth :string; //机台编号 This_TaskOrder :string; //任务序次 FEditorstyle:Teditorstyle; FLeft :Integer; FTop :Integer; maxTextLen :Integer; maxLabelLen :Integer; maxDgheight :Integer; maxFootHeight :integer; FTitleVisible :Boolean; FEditorVisible :Boolean; FDataReadOnly :Boolean; FPageCount :Integer; FPass_Grid :TDBGrid; FP_Move :TMovePanel; FP_Parent :TPanel; ColorLabels :array of TLabel; Co_Shapes :array of TShape; Co_DllBtn :array of TSpeedButton; Co_Panels :array of TPanel; FPageControl: TPageControl; {分页控件} FTabSheets :array of TTabSheet; ScrollBoxs :array of TScrollBox; {滚动控件} Splitters :array of TSplitter; {分割控件} FootPanels :array of TJKFootpanel; {Foot页显示控件} FLineHeight :Integer; //数据数组控件,动态生成 MemoEditors :array of TMemo; comEditors :array of TCombobox; edEditors :array of Tedit; DGLists :array of TDbGrid; AdoLists :array of TadoDataset; DsLists :array of TDataSource; DGGlides :array of TDbGrid; AdoGlides :TadoDataset; DsGlides :TDataSource; 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_ColA :String; // DataField FDataField_ColB :String; // DataField Fcnnstr :String; FPageSql :string; FListSql :String; FFootSql :string; FGlideSql :String; FCheJianFieldName :String; FColumns :Integer; //显示列数 tmpado :TadoDataset; tmpDs :TDataSource; TmpDgListIdx,TmpDgListCol:integer; 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 Co_DllBtnClick(Sender: TObject); procedure AdolistsAfterScroll(DataSet: TDataSet); procedure DGListsCellClick(Column: TColumn); procedure DGListsDrawColumnCell(Sender: TObject; const Rect: TRect;DataCol: Integer; Column: TColumn;State: TGridDrawState); procedure refreshFootpanel(Tag :integer); procedure DGGlideDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); procedure FP_MovePanelDblClick(Sender: TObject); procedure FootPanelDblclick(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; Const Defaultsheet :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 DgHeight :Integer read maxDgheight write maxDgheight default 300; property FootHeight :Integer read maxFootHeight write maxFootHeight default 200; property TitleVisible :Boolean read FTitleVisible write FTitleVisible default True; property EditorVisible :Boolean read FEditorVisible write FEditorVisible 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_ColA :String read FDataField_A write FDataField_ColA; property DataField_ColB :String read FDataField_B write FDataField_ColB; 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 Data_PageSql :String read FPageSql write FPageSql; property Data_DgListSql :String read FListSql write FListSql; property Data_FootSql :String read FFootSql write FFootSql; property Data_GlideSql :String read FGlideSql write FGlideSql; property Data_CheJianField :String read FCheJianFieldName write FCheJianFieldName; property Columns :Integer read FColumns write FColumns default 4;//表列数 { Published declarations } end; procedure Register; implementation constructor TJkPanel.Create(AOwner :TComponent); begin Inherited Create(AOWner); FLeft := 20; FTop := 20; maxTextLen := 250; maxLabelLen := 250; maxDgheight := 200; maxFootHeight := 150; FLineHeight := 15; FTitleVisible := True; FDataReadOnly := True; end; procedure TJkPanel.Setedit(Value :TEditorstyle); begin if FEditorstyle <> Value then begin FEditorstyle := Value; Invalidate; end; end; { 为第I字段增加提示信息的方法} procedure TJkPanel.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 TJkPanel.AKeyDown(Sender :TObject; var Key :Word; Shift :TShiftState); begin // end; procedure TJkPanel.AProgressEditorChange(Sender :TObject); begin // end; procedure TJkPanel.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 TJkPanel.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; { 创建各字段的数据输入控件的方法} procedure TJkPanel.CreateEditors(var DS :TDataSource; cnnstr :String; Const Defaultsheet :String = ''); var Tmp_CheJian,Tmp_Parm :String; i,j,n,k,This_Index,TextHeight :Integer; tmp_col0,Tmp_Row0,Tmp_Row1 :Integer; XXX :TStringList; kkk,RRR :array of integer; DefaultIndex :Integer; //默认车间 begin if (Data_CheJianField = '') 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; TmpDgListIdx := -1; FPageCount := 0; DefaultIndex := 0; n := DataSource.DataSet.RecordCount; if n <= 0 then exit; DataSource.DataSet.DisableControls; if TitleWidth < maxTextLen then maxTextLen := TitleWidth; { 计算最大的标题长度及显示长度} DataSource.DataSet.First; { 计算高度} TextHeight := Canvas.TextHeight(DataSource.DataSet.Fields[0].DisplayLabel) + LineHeight; //10; { 分配内存} SetLength(AdoLists,n); SetLength(DsLists,n); SetLength(DGLists,n); SetLength(Labels,n); SetLength(ColorLabels,n); SetLength(ProgressEditor,n); SetLength(Shapes,n); { 创建数据感知控件 AdoGlides、DsGlides} AdoGlides := TadoDataset.Create(owner); DsGlides := TDatasource.Create(owner); DsGlides.DataSet := AdoGlides; 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.CommandText := Data_PageSql; Active := True; FPageCount := RecordCount; if FPageCount = 0 then exit; setlength(kkk,FPageCount); for i := 0 to high(kkk) do kkk[i] := -1; SetLength(RRR,FPageCount); for i := 0 to high(RRR) do RRR[i] := 0; 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(ScrollBoxs,FPageCount+1); setlength(FootPanels,FPageCount+1); setlength(Splitters,FPageCount+1); setlength(Co_Shapes,FPageCount+1); setlength(Co_DllBtn,FPageCount+1); setlength(Co_Panels,FPageCount+1); SetLength(DGGlides,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 Tmp_CheJian := trim(fieldByName(Data_CheJianField).AsString); if Defaultsheet <> '' then //指定默认车间 begin if Tmp_CheJian = Defaultsheet then DefaultIndex := j; end; FTabSheets[j].Caption := '车间:' + Tmp_CheJian; FTabSheets[j].Hint := Tmp_CheJian; XXX.Append(Tmp_CheJian); end else begin Tmp_CheJian := ''; FTabSheets[j].Caption := '未指定车间'; FTabSheets[j].Hint := Tmp_CheJian; XXX.Append('未指定车间'); end; FTabSheets[j].ShowHint := False; FTabSheets[j].Visible := True; FTabSheets[j].Align := alClient; //创建Foot页显示控件 FootPanels[j] := TJKFootpanel.Create(Owner); with FootPanels[j] do begin Visible := True; Parent := FTabSheets[j]; // BevelInner := bvLowered; //BevelOuter := bvRaised; Left := 0; Width := 1; Align := alRight; Hint := FTabSheets[j].Hint; ShowHint := False; onDblclick := FootPanelDblclick; LimitLeft := 8; Ctl3D := False; end; //创建颜色块显示控件载体 Co_Panels[j] := Tpanel.Create(Owner); with Co_Panels[j] do begin Visible := True; Parent := FootPanels[j]; BevelInner := bvLowered; BevelOuter := bvRaised; height := 40; Co_Panels[j].BorderWidth := 2; Align := alTop; end; //创建颜色块显示控件 Co_Shapes[j] := TShape.Create(Owner); with Co_Shapes[j] do begin Visible := True; Parent := Co_Panels[j]; Width := FootHeight; Align := alClient; end; //创建按钮控件 Co_DllBtn[j] := TSpeedButton.Create(Owner); with Co_DllBtn[j] do begin Visible := True; Parent := FootPanels[j]; height := 25; Tag := j; Font.name := '宋体'; Font.Size := 9; Align := alTop; Font.Color := ClBlue; //Flat := true; caption := '流程处理'; OnClick := Co_DllBtnClick; end; { 创建DbGrid控件 DGGlides} DGGlides[j]:= TDBGrid.Create(owner); with DGGlides[j] do begin Visible := True; Parent := FootPanels[j]; height := 110; Align := alTop; Tag := j; Font.name := '宋体'; Font.Size := 9; ReadOnly := True; Options := [dgEditing,dgMultiSelect]; //,dgRowLines,dgColumnResize, FixedColor := clSkyBlue; OnDrawColumnCell := DGGlideDrawColumnCell; end; //创建分割控件 Splitters[j] := TSplitter.Create(Owner); with Splitters[j] do begin Visible := True; Parent := FTabSheets[j]; Width := 4; Align := alRight; end; //创建滚动盒 ScrollBoxs[j] := TScrollBox.Create(Owner); with ScrollBoxs[j] do begin Visible := True; Parent := FTabSheets[j]; Color := RGB(100,100,100);//clTeal; Align := alClient; Hint := FTabSheets[j].Hint; ShowHint := False; end; 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 if DataSource.DataSet.Fieldbyname(Data_CheJianField).AsVariant = null then This_Index := FPageCount else This_Index := XXX.IndexOf(trim(DataSource.DataSet.Fieldbyname(Data_CheJianField).Asstring)); if kkk[This_Index] >= Columns -1 then begin kkk[This_Index] := 0; RRR[This_Index] := RRR[This_Index] +1; end else kkk[This_Index] := kkk[This_Index] + 1; tmp_col0 := kkk[This_Index]; tmp_Row0 := RRR[This_Index]; { 创建数据感知控件 AdoLists、DsLists} AdoLists[i] := TadoDataset.Create(owner); AdoLists[i].Tag := i; AdoLists[i].AfterScroll:= AdolistsAfterScroll; DsLists[i] := TDatasource.Create(owner); DsLists[i].DataSet := AdoLists[i]; DsLists[i].Tag := i; //DsLists[i].OnDataChange := DsListsDataChange; { 创建标题} Labels[i] := TLabel.Create(owner); Labels[i].visible := FTitleVisible; Labels[i].Parent := (ScrollBoxs[This_Index] as TScrollBox); Labels[i].Font.Name := '宋体'; Labels[i].Font.Size := 9; Labels[i].Font.Color := ClBlue; Labels[i].OnClick := LabelsClick; Labels[i].Tag := i; //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 := ''; Tmp_CheJian := trim((ScrollBoxs[This_Index] as TScrollBox).Hint); //机台编号 if DataSource.DataSet.Fieldbyname(DataField_ColA).AsVariant <> null then Labels[i].Hint := trim(DataSource.DataSet.Fieldbyname(DataField_ColA).AsString) else Labels[i].Hint := ''; Labels[i].ShowHint := False; if FEditorstyle = TsMemo then begin Labels[i].Top := FTop + tmp_Row0 * (TextHeight*3+DgHeight+5) + 2; Labels[i].Left := FLeft + (TitleWidth + 20) * tmp_Col0 + 5; Labels[i].Width := TitleWidth; end else begin Labels[i].Top := FTop + tmp_Row0 * (TextHeight*2+DgHeight+5) + 2; Labels[i].Left := FLeft + (TitleWidth + 12) * tmp_Col0; Labels[i].Width := TitleWidth; end; { 创建信息显示数据对象} if FEditorstyle = Tscombox then begin comEditors[i] := TComboBox.Create(Owner); comEditors[i].Parent := ScrollBoxs[This_Index]; //Self; comEditors[i].Left := Labels[i].Left; //+ Labels[i].Width; comEditors[i].Width := maxTextLen; if FTitleVisible then comEditors[i].Top := Labels[i].Top+14 else comEditors[i].Top := Labels[i].Top; if DataSource.DataSet.Fieldbyname(DataField_Editor).AsVariant <> null then comEditors[i].Text := DataSource.DataSet.Fieldbyname(DataField_Editor).AsString; comEditors[i].OnKeyPress := OnKeyPress; comEditors[i].OnKeyDown := OnKeyDown; comEditors[i].Visible := EditorVisible; comEditors[i].Tag := i; DGLists[i] := TDbGrid.Create(Owner); DGLists[i].Parent := ScrollBoxs[This_Index]; DGLists[i].Font.name := '宋体'; DGLists[i].Font.Size := 9; DGLists[i].ReadOnly := True; DGLists[i].FixedColor := clSkyBlue; DGLists[i].Left := comEditors[i].Left; DGLists[i].Width := comEditors[i].Width; DGLists[i].Height := DgHeight; DGLists[i].Options := [dgRowSelect]; if EditorVisible then DGLists[i].Top := comEditors[i].Top+comEditors[i].height+2 else DGLists[i].Top := comEditors[i].Top+2; DGLists[i].Hint := trim(Labels[i].caption); DGLists[i].ShowHint := False; DGLists[i].OnDrawColumnCell := DGListsDrawColumnCell; DGLists[i].OnCellClick := DGListsCellClick; DGLists[i].Tag := i; ColorLabels[i] := TLabel.Create(Owner); ColorLabels[i].Parent := ScrollBoxs[This_Index]; ColorLabels[i].AutoSize := true; ColorLabels[i].Font.name := '宋体'; ColorLabels[i].Font.Size := 9; ColorLabels[i].Top := Labels[i].top; ColorLabels[i].Left := Labels[i].Left + round(Labels[i].Width/2)+20; ColorLabels[i].Width := round(Labels[i].Width/2)-20; ColorLabels[i].BringToFront; ColorLabels[i].Tag := i; ColorLabels[i].Font.Color := ClWhite; ColorLabels[i].Color := RGB(100,100,100); ColorLabels[i].Caption := '待机中'; end else if FEditorstyle = Tsedit then begin edEditors[i] := Tedit.Create(Owner); edEditors[i].Parent := ScrollBoxs[This_Index]; edEditors[i].Left := Labels[i].Left; //+ Labels[i].Width; edEditors[i].Width := maxTextLen; if FTitleVisible then edEditors[i].Top := Labels[i].Top+14 else edEditors[i].Top := Labels[i].Top; 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 := OnKeyPress; edEditors[i].OnKeyDown := OnKeyDown; edEditors[i].Visible := EditorVisible; DGLists[i] := TDbGrid.Create(Owner); DGLists[i].Parent := ScrollBoxs[This_Index]; DGLists[i].Font.name := '宋体'; DGLists[i].Font.Size := 9; DGLists[i].ReadOnly := True; DGLists[i].Options := [dgRowSelect]; DGLists[i].FixedColor := clSkyBlue; DGLists[i].Left := edEditors[i].Left; DGLists[i].Width := edEditors[i].Width; DGLists[i].Height := DgHeight; DGLists[i].Tag := i; if EditorVisible then DGLists[i].Top := edEditors[i].Top+edEditors[i].height+2 else DGLists[i].Top := edEditors[i].Top+2; DGLists[i].Hint := trim(Labels[i].caption); DGLists[i].ShowHint := False; DGLists[i].OnDrawColumnCell := DGListsDrawColumnCell; DGLists[i].OnCellClick := DGListsCellClick; DGLists[i].Tag := i; ColorLabels[i] := TLabel.Create(Owner); ColorLabels[i].Parent := ScrollBoxs[This_Index]; ColorLabels[i].AutoSize := False; ColorLabels[i].Font.name := '宋体'; ColorLabels[i].Font.Size := 9; ColorLabels[i].Top := Labels[i].top; ColorLabels[i].Left := Labels[i].Left + round(Labels[i].Width/2)+20; ColorLabels[i].Width := round(Labels[i].Width/2)-20; ColorLabels[i].BringToFront; ColorLabels[i].Tag := i; ColorLabels[i].Font.Color := ClWhite; ColorLabels[i].Color := RGB(100,100,100); ColorLabels[i].Caption := '待机中'; end else begin MemoEditors[i] := Tmemo.Create(Owner); MemoEditors[i].Parent := ScrollBoxs[This_Index]; MemoEditors[i].Left := Labels[i].Left; MemoEditors[i].Width := maxTextLen; if FTitleVisible then MemoEditors[i].Top := Labels[i].Top+14 else MemoEditors[i].Top := Labels[i].Top; 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 := OnKeyPress; MemoEditors[i].OnKeyDown := OnKeyDown; MemoEditors[i].Visible := EditorVisible; MemoEditors[i].Tag := i; DGLists[i] := TDbGrid.Create(Owner); DGLists[i].Parent := ScrollBoxs[This_Index]; DGLists[i].Font.name := '宋体'; DGLists[i].Font.Size := 9; DGLists[i].ReadOnly := True; DGLists[i].FixedColor := clSkyBlue; DGLists[i].Left := MemoEditors[i].Left; DGLists[i].Width := MemoEditors[i].Width; DGLists[i].Height := DgHeight; DGLists[i].Options := [dgRowSelect]; if EditorVisible then DGLists[i].Top := MemoEditors[i].Top+MemoEditors[i].height+2 else DGLists[i].Top := MemoEditors[i].Top+2; DGLists[i].Hint := trim(Labels[i].caption); DGLists[i].ShowHint := False; DGLists[i].OnDrawColumnCell := DGListsDrawColumnCell; DGLists[i].OnCellClick := DGListsCellClick; DGLists[i].Tag := i; ColorLabels[i] := TLabel.Create(Owner); ColorLabels[i].Parent := ScrollBoxs[This_Index]; ColorLabels[i].AutoSize := False; ColorLabels[i].Font.name := '宋体'; ColorLabels[i].Font.Size := 9; ColorLabels[i].Left := DGLists[i].Left + DGLists[i].Width +1; ColorLabels[i].Height := DGLists[i].Height + MemoEditors[i].Height; ColorLabels[i].Top := DGLists[i].Top; ColorLabels[i].Tag := i; ColorLabels[i].Font.Color := ClWhite; ColorLabels[i].Color := RGB(100,100,100); ColorLabels[i].Caption := '待机中'; end; Tmp_Parm := trim(DataSource.DataSet.Fieldbyname(DataField_Editor).Value); with AdoLists[i] do begin DisableConTrols; Active := False; ConnectionString := Fcnnstr; //数据库连接串 CursorType := ctStatic; LockType := ltReadOnly; CommandText := Data_DgListSql; Parameters.ParamValues['ListParm'] := Tmp_Parm; Active := True; { tmpSql := 'select a.AutoID,case a.MachMiss when ''0000000000'' then ' + 'convert(varchar(20),f.GlideName) else convert(varchar(20),d.ShortName) end' + ' as ShortName,rtrim(b.MP_Crock) as MP_Crock,' + 'convert(varchar(20),c.ChnName) as ChnName,a.MachLen,' + 'convert(varchar(20),f.GlideName) as GlideName,' + 'a.MachMiss,a.TaskOrder,a.Status,' + 'c.RedCode,c.GreenCode,c.BlueCode' + ' from MD_Dev_Mission a '+#10#13 + ' left join MD_PlanCrock b on b.mp_autocrk = left(a.MachMiss,10)' + ' left join Mc_color c on c.ColorId = b.MP_Color ' + ' left join Mc_Glide f on f.GlideNo = a.MachGlide'+#10#13 + ' left join BC_Customer d on d.customno = b.MP_Customno'+#10#13 + ' where a.Status <> ''6''' + ' and a.Machine =:ListParm'+#10#13 + ' order by a.Machine,a.TaskOrder'; } for k := 0 to Fields.Count -1 do Fields[k].Visible := False; Fieldbyname('ShortName').Visible := True; //加工单位 Fieldbyname('MP_Crock').Visible := True; //助记缸号 Fieldbyname('ChnName').Visible := True; //颜色 Fieldbyname('MachLen').Visible := True; //单缸重量 Fieldbyname('GlideName').Visible := True; //工序 DGLists[i].DataSource := DsLists[i]; EnableConTrols; DGLists[i].Columns[0].width := 50; DGLists[i].Columns[1].width := 30; DGLists[i].Columns[2].width := 55; DGLists[i].Columns[3].width := 45; DGLists[i].Columns[4].width := 50; //DGLists[i].Columns[0].Alignment := TaCenter; //DGLists[i].Columns[1].Alignment := TaCenter; //DGLists[i].Columns[2].Alignment := TaCenter; //DGLists[i].Columns[3].Alignment := TaCenter; //DGLists[i].Columns[4].Alignment := TaCenter; First; end; Shapes[i] := TShape.Create(Owner); Shapes[i].Parent := ScrollBoxs[This_Index]; Shapes[i].Left := Labels[i].Left - 5; Shapes[i].top := Labels[i].Top - 5; if FEditorstyle = TsMemo then begin Shapes[i].height := ColorLabels[i].height + Labels[i].height +20 +10; Shapes[i].Width := (ColorLabels[i].left - Labels[i].left) + ColorLabels[i].Width + 10; end else begin Shapes[i].height := (DGLists[i].Top + DGLists[i].Height - Labels[i].Top)+ 10; Shapes[i].Width := Labels[i].Width +10; end; Shapes[i].Brush.Color := clSkyBlue; Shapes[i].Visible := True; Shapes[i].SendToBack; Shapes[i].Tag := i; 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 := DefaultIndex; end; Finally FPageControl.Visible := True; end; end; procedure TJkPanel.Co_DllBtnClick(Sender: TObject); var this_Gh :String; k :Integer; begin if not CanLCCL then //判断是否有权操作此项功能 begin application.messagebox('对不起,目前您还没有被授权操作此项功能。','信息提示',mb_ok or MB_ICONInformation); Exit; end; k := (sender as TSpeedButton).Tag; if not FootPanels[k].DataSource.dataset.active then exit; if Co_DllBtn[k].Caption = '流程处理' then begin if FootPanels[k].DataSource.dataset.FieldValues['缸号'] = null then exit; this_Gh := FootPanels[k].DataSource.dataset.fieldbyname('缸号').AsString; //执行流程处理 DoAbnormalC(TmpHandle,cnn_Base,V_UserId,V_User,this_Gh); end else begin //执行洗缸领料 if This_Jth <> '' then DoRinseprt(TmpHandle,cnn_Base,V_UserId,V_User,This_Jth,This_TaskOrder); end; end; procedure TJkPanel.DGListsDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var Redcode,GreenCode,BlueCode,TmpStatus :Integer; begin with (Sender as TdbGrid) do begin if DataSource = nil then exit; if not DataSource.DataSet.Active then exit; Redcode := (DataSource.DataSet as TAdoDataset).fieldByName('Redcode').AsInteger; Greencode := (DataSource.DataSet as TAdoDataset).fieldByName('Greencode').AsInteger; Bluecode := (DataSource.DataSet as TAdoDataset).fieldByName('Bluecode').AsInteger; TmpStatus := (DataSource.DataSet as TAdoDataset).fieldByName('Status').AsInteger; if gdFocused in State then begin Canvas.Brush.Color := clblack; Canvas.Font.Color := Clred; end else if TmpStatus = 5 then begin Canvas.Font.Color := clBlue; Canvas.Brush.Color := clWhite; Canvas.Font.Style := [fsBold]; //fsItalic ColorLabels[(Sender as TDbGrid).Tag].Color := RGB(Redcode,Greencode,Bluecode); if (Redcode <=10) or (Bluecode <=10) or (Greencode <=10) then ColorLabels[(Sender as TDbGrid).Tag].Font.Color := ClWhite else ColorLabels[(Sender as TDbGrid).Tag].Font.Color := ClBlack; ColorLabels[(Sender as TDbGrid).Tag].Caption := '生产中'; end else if (Redcode <=100) or (Greencode <=100) then begin Canvas.Font.Color := ClWhite; Canvas.Brush.Color := RGB(Redcode,Greencode,Bluecode); end else begin Canvas.Font.Color := ClBlack; Canvas.Brush.Color := RGB(Redcode,Greencode,Bluecode); end; DefaultDrawColumnCell(Rect,DataCol,Column,State); end; end; procedure TJkPanel.DGGlideDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin with (Sender as TDbGrid) do begin if DataSource = nil then exit; if not DataSource.DataSet.Active then exit; if gdFocused in State then exit; if (Sender as TDbGrid).SelectedRows.CurrentRowSelected then begin Canvas.Brush.Color := clHighlight; Canvas.Font.Color := ClWhite; end else if DataSource.DataSet.RecNo mod 2 = 0 then begin Canvas.Brush.Color := $00DEDEDE; Canvas.Font.Color := ClBlack; end else begin Canvas.Brush.Color := clwhite; Canvas.Font.Color := ClBlack; end; DefaultDrawColumnCell(Rect,DataCol,Column,State); end; end; procedure TJkPanel.refreshFootpanel(Tag :integer); var i,Listindex,PageIndex :integer; R,G,B :Integer; tmpCarN0 :String; TmpMachMiss :String; //单缸号 begin try PageIndex := FPageControl.ActivePageIndex; Listindex := Tag; if AdoLists[Listindex].RecordCount = 0 then begin FootPanels[PageIndex].DataSource := Nil; exit; end; //获取机台号 This_Jth := Labels[Listindex].Hint; //获取任务序次 This_TaskOrder := trim(AdoLists[Listindex].FieldByName('TaskOrder').AsString); TmpMachMiss := trim(AdoLists[Listindex].FieldByName('MachMiss').AsString); if TmpMachMiss = '0000000000' then Co_DllBtn[PageIndex].Caption := '洗缸领料' else Co_DllBtn[PageIndex].Caption := '流程处理'; with tmpado do begin DisableConTrols; Active := False; ConnectionString := Fcnnstr; CursorType := ctStatic; LockType := ltReadOnly; CommandText := Data_FootSql; Parameters.ParamValues['FootParm'] := AdoLists[Listindex].Fields[0].Value; Active := True; for i := 0 to fieldCount -1 do tmpado.Fields[i].Alignment := taLeftJustify; tmpDs.dataset := tmpado; EnableConTrols; end; with adoGlides do begin DisableConTrols; Active := False; ConnectionString := Fcnnstr; CursorType := ctStatic; LockType := ltReadOnly; CommandText := Data_GlideSql; if AdoLists[Listindex].Fieldbyname('MachMiss').AsString <> null then begin tmpCarN0 := trim(AdoLists[Listindex].Fieldbyname('MachMiss').AsString); tmpCarN0 := Copy(tmpCarN0,1,10); end else tmpCarN0 := '////'; Parameters.ParamValues['PCarNo'] := tmpCarN0; Active := True; First; EnableConTrols; end; DGGlides[PageIndex].DataSource := DsGlides; DGGlides[PageIndex].Columns[0].Width := 74; DGGlides[PageIndex].Columns[1].Width := 40; FootPanels[PageIndex].Width := 140; FootPanels[PageIndex].Columns := 1; FootPanels[PageIndex].DataSource := tmpDs; FootPanels[PageIndex].CreateEditors(tmpDs,1); R := 255; G:= 255; B := 255; R := AdoLists[Listindex].Fieldbyname('RedCode').AsInteger; G := AdoLists[Listindex].Fieldbyname('GreenCode').AsInteger; B := AdoLists[Listindex].Fieldbyname('BlueCode').AsInteger; Co_Shapes[PageIndex].Brush.Color := RGB(R,G,B); except // end; end; procedure TJkPanel.DGListsCellClick(Column: TColumn); var tmpIdx,TmpCol,TmpTag :Integer; begin if not Column.Grid.DataSource.DataSet.Active then exit; if Column.Grid.DataSource.DataSet.RecordCount = 0 then exit; if Column.Grid.DataSource.DataSet.RecNo = 1 then begin tmpIdx := (Column.Grid as TCustomDbGrid).ComponentIndex; TmpCol := Column.Index; if TmpDgListIdx = -1 then begin TmpDgListIdx := tmpIdx; TmpDgListCol := TmpCol; refreshFootpanel((Column.Grid as TCustomDbGrid).DataSource.DataSet.Tag); end else begin if TmpDgListIdx <> tmpIdx then refreshFootpanel((Column.Grid as TCustomDbGrid).DataSource.DataSet.Tag); TmpDgListIdx := tmpIdx; TmpDgListCol := TmpCol; end; (Column.Grid as TCustomDbGrid).SetFocus; end end; procedure TJkPanel.AdolistsAfterScroll(DataSet: TDataSet); begin //刷新 Footpanel refreshFootpanel(DataSet.tag); end; //响应Labels[i]的Click事件 procedure TJkPanel.LabelsClick(Sender: TObject); begin // end; { procedure TJkPanel.LabelsClick(Sender: TObject); var i :integer; Tmp_CheJian,Tmp_JiTai :String; begin try if FP_Parent = nil then inti_Grid(Sender); if FP_Parent = nil then exit; Tmp_JiTai := trim((Sender as Tlabel).Caption); Tmp_CheJian := trim(((Sender as Tlabel).Parent as TScrollBox).Hint); if tmpado.Active then begin if tmpado.FieldValues['机台'] <> null then if tmpado.FieldByName('机台').AsString = Tmp_JiTai 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+' '''+Tmp_CheJian+''','''+Tmp_JiTai+''''; 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 TJkPanel.FootPanelDblclick(Sender: TObject); begin if sender is TScrollBox then (sender as TScrollBox).Parent.width := 1; end; procedure TJkPanel.FP_MovePanelDblClick(Sender: TObject); begin FP_Parent.Visible := False; end; //Register控件 procedure Register; begin RegisterComponents('Data Controls', [TJkPanel]); end; // 内存的释放是要有顺序的!必须以创建的相反的顺序进行!尤其是当组件之间有父子关系时 procedure TJkPanel.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; DGGlides := nil; DsGlides := nil; AdoGlides := nil; DsGlides.Free; AdoGlides.Free; DGLists := nil; DsLists := nil; AdoLists := nil; FPass_Grid := nil; FP_Move := nil; FP_Parent := nil; Shapes := nil; ProgressBars := nil; comEditors := nil; edEditors := nil; MemoEditors := nil; ScrollBoxs := nil; Splitters := nil; Co_Shapes:= nil; Co_DllBtn := Nil; Co_Panels:= nil; FootPanels := nil; tmpDs.Free; tmpado.Free; FPageControl.Free; end; end; end.