unit U_frameFPList; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxContainer, cxEdit, cxStyles, cxCustomData, cxFilter, cxData, cxDataStorage, cxNavigator, dxDateRanges, dxScrollbarAnnotations, Data.DB, cxDBData, cxCheckBox, cxTextEdit, dxBarBuiltInMenu, Vcl.Menus, cxGridCustomPopupMenu, cxGridPopupMenu, Datasnap.DBClient, Data.Win.ADODB, cxGridLevel, cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxClasses, cxGridCustomView, cxGrid, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.ToolWin, Vcl.ExtCtrls, dxSkinsCore, dxSkinsDefaultPainters, cxMemo, cxLabel, cxMaskEdit, cxDropDownEdit, cxButtonEdit, cxButtons; type TframeFPList = class(TFrame) ADOQueryMain: TADOQuery; ADOQueryCmd: TADOQuery; ADOQueryTemp: TADOQuery; CDS_HZ: TClientDataSet; DS_HZ: TDataSource; cxGridPopupMenu2: TcxGridPopupMenu; PopupMenu1: TPopupMenu; N1: TMenuItem; N2: TMenuItem; Panel_FP: TPanel; LabelFP: TLabel; cxLabel290: TcxLabel; fp_speed: TcxTextEdit; fp_gjNumber: TcxTextEdit; cxLabel279: TcxLabel; TbFPReplace2: TcxButton; TbFPClear2: TcxButton; cxLabel284: TcxLabel; cxLabel286: TcxLabel; cxLabel287: TcxLabel; cxLabel288: TcxLabel; cxLabel297: TcxLabel; cxLabel299: TcxLabel; cxLabel300: TcxLabel; cxLabel301: TcxLabel; cxLabel302: TcxLabel; cxLabel303: TcxLabel; cxLabel323: TcxLabel; fp_temperature1: TcxTextEdit; fp_temperature10: TcxTextEdit; fp_temperature11: TcxTextEdit; fp_temperature2: TcxTextEdit; fp_temperature3: TcxTextEdit; fp_temperature4: TcxTextEdit; fp_temperature5: TcxTextEdit; fp_temperature6: TcxTextEdit; fp_temperature7: TcxTextEdit; fp_temperature8: TcxTextEdit; fp_temperature9: TcxTextEdit; cxGrid6: TcxGrid; TvFP: TcxGridDBTableView; cxGridDBColumn14: TcxGridDBColumn; cxGridDBColumn17: TcxGridDBColumn; TvFPserialno: TcxGridDBColumn; cxGridLevel5: TcxGridLevel; cxLabel8: TcxLabel; TbFPAdd: TcxButton; TbFPDel: TcxButton; fp_Precautions: TcxMemo; cxLabel12: TcxLabel; fp_leftGap: TcxTextEdit; cxLabel13: TcxLabel; fp_rightGap: TcxTextEdit; CDS_FP: TClientDataSet; DS_FP: TDataSource; TvFPfp_spel: TcxGridDBColumn; TvFPfp_unit: TcxGridDBColumn; TvFPBPIID: TcxGridDBColumn; procedure TBRafreshClick(Sender: TObject); procedure ToolButton5Click(Sender: TObject); procedure ToolButton3Click(Sender: TObject); procedure TbFPReplace2Click(Sender: TObject); procedure TbFPClear2Click(Sender: TObject); procedure TbFPAddClick(Sender: TObject); procedure TbFPDelClick(Sender: TObject); procedure cxGridDBColumn14PropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure cxGridDBColumn17PropertiesEditValueChanged(Sender: TObject); private procedure FillAllTextEditsWithValue(AParent: TWinControl; const AHint, AValue: string; AExclude: TcxTextEdit = nil); procedure ClearAllTextEditsByHint(AParent: TWinControl; const AHint: string; AExclude: TcxTextEdit = nil); function FindLastEditedTextEdit(AParent: TWinControl; const AHint: string): string; { Private declarations } public procedure InitGrid(); function SaveData(mPSID :String): Boolean; { Public declarations } end; implementation uses U_DataLink, U_RTFun, U_LabelPrint,U_ProductInfoSel; {$R *.dfm} procedure TframeFPList.InitGrid(); begin // // with ADOQueryMain do // begin // Close; // SQL.Clear; // sql.Add(' select A.* from BS_Position A order by POSNO '); // Open; // end; // with ADOQueryTemp do // begin // Close; // SQL.Clear; // sql.Add(' select A.* FROM V_Dye_Technics_Details A'); // sql.Add(' Where A.PSID=''' + trim(fpsid) + ''''); //// SQL.Add(' and A.PSID = ''' + trim(CDS_2.fieldbyname('PSID').AsString) + ''''); // Open; // end; // with ADOQueryCmd do // begin // Close; // SQL.Clear; // sql.Add(' select A.* FROM BS_Cloth_GY_Sub A'); // sql.Add(' Where A.PSID=''' + trim(CDS_GX.fieldbyname('PSID').AsString) + ''''); //// SQL.Add(' and A.PSID = ''' + trim(CDS_2.fieldbyname('PSID').AsString) + ''''); // Open; // end; end; procedure TframeFPList.TbFPAddClick(Sender: TObject); begin with CDS_FP do begin Append; CDS_FP.FieldByName('serialno').Value := CDS_FP.RecordCount + 1; Post; end; end; procedure TframeFPList.TbFPClear2Click(Sender: TObject); begin ClearAllTextEditsByHint(panel_Fp, '发泡温控'); end; procedure TframeFPList.TbFPDelClick(Sender: TObject); var i: Integer; begin if not CDS_FP.IsEmpty then begin if Application.MessageBox('确定要删除数据吗?', '提示', 32 + 4) = IDYES then begin if Trim(CDS_FP.fieldbyname('BCPID').AsString) <> '' then begin with ADOQueryCmd do begin Close; sql.Clear; sql.Add('delete BS_Cloth_GY_Sub where BCPID=' + quotedStr(Trim(CDS_FP.fieldbyname('BCPID').AsString))); ExecSQL; end; end; CDS_FP.Delete; end else exit; i := 0; CDS_FP.First; while not CDS_FP.Eof do begin i := i + 1; CDS_FP.Edit; CDS_FP.fieldByName('serialno').value := i; CDS_FP.Post; CDS_FP.Next; end; end else begin Application.MessageBox('无可删除数据!', '提示', 0); Exit; end; end; procedure TframeFPList.TbFPReplace2Click(Sender: TObject); begin FillAllTextEditsWithValue(panel_fp, '发泡温控', FindLastEditedTextEdit(panel_fp, '发泡温控')); end; procedure TframeFPList.TBRafreshClick(Sender: TObject); begin InitGrid(); end; procedure TframeFPList.ToolButton3Click(Sender: TObject); var RTValues: TArray; begin if CDS_HZ.IsEmpty then Exit; if CDS_HZ.Locate('SSel', True, []) = False then begin Application.MessageBox('请先选择数据!', '提示', 0); Exit; end; RTValues := SelCDSKey(CDS_HZ, ['POSID']); try frmLabelPrint := TfrmLabelPrint.Create(Application); with frmLabelPrint do begin FLMType := 'Position'; FFiltration1 := RTValues[0]; if ShowModal = 1 then begin // Self.InitGrid(); end; end; finally frmLabelPrint.Free; end; end; procedure TframeFPList.ToolButton5Click(Sender: TObject); begin if CDS_HZ.IsEmpty then Exit; if CDS_HZ.Locate('SSel', True, []) = False then begin Application.MessageBox('请先选择数据!', '提示', 0); Exit; end; if Application.MessageBox('确定要删除数据吗?', '提示', 32 + 4) <> IDYES then Exit; with CDS_HZ do begin while not Eof do begin if CDS_HZ.Locate('SSel', True, []) = True then begin with ADOQueryCmd do begin Close; sql.Clear; sql.Add('delete BS_Position where POSID=' + QuotedStr(CDS_HZ.FieldByName('POSID').AsString)); ExecSQL; end; end; CDS_HZ.Edit; CDS_HZ.FieldByName('SSel').Value := False; CDS_HZ.Post; Next; end; end; InitGrid(); end; function TframeFPList.SaveData(mPSID :String) : Boolean; var MaxProcessID, MaxBCPID, MaxPSID, MaxDTMID, mDTMID, DTMPSlist: string; maxsubid1, maxsubid2, maxsubid3, maxsubid4, maxsubid5, maxsubid6, mmaxgx: string; begin try //////////////// 保存主表 ////////////////////// with ADOQueryCmd do begin Close; SQL.Clear; sql.Add('select * from Bs_Cloth_GY_Main where PSID=''' + Trim(mPSID) + ''''); Open; end; with ADOQueryCmd do begin if Trim(mPSID) = '' then begin Append; end else begin Edit; end; FieldByName('PSID').Value := Trim(mPSID); RTSetsavedata(ADOQueryCmd, 'Bs_Cloth_GY_Main', panel_fp, 2); ADOQueryCmd.Post; /// ////////////////// 保存发泡子表 ////////////////////// with CDS_FP do begin First; while not Eof do begin if Trim(CDS_FP.Fieldbyname('BCPID').AsString) = '' then begin if GetLSNo(ADOQueryTemp, maxsubid6, 'FP', 'Bs_Cloth_GY_Sub', 5, 1) = False then begin Application.MessageBox('取配比子流水号失败!', '提示', 0); Exit; end; end else begin maxsubid6 := Trim(CDS_FP.fieldbyname('BCPID').AsString); end; with ADOQueryCmd do begin Close; SQL.Clear; sql.Add('select * from Bs_Cloth_GY_Sub where '); sql.Add('BCPID=''' + Trim(maxsubid6) + ''''); Open; end; with ADOQueryCmd do begin if Trim(CDS_FP.fieldbyname('BCPID').AsString) = '' then begin Append; end else begin Edit; end; FieldByName('GYType').Value := '发泡'; FieldByName('PSID').Value := Trim(mPSID); FieldByName('BCPID').Value := Trim(maxsubid6); RTSetSaveDataCDS(ADOQueryCmd, TvFP, CDS_FP, 'Bs_Cloth_GY_Sub', 0); Post; end; Next; end; end; //////////////// 保存发泡子表结束 ////////////////////// end; //////////////// 保存主表结束 ////////////////////// // FPSID := maxId; Result := True; except Result := False; Application.MessageBox('保存失败!', '提示', 0); end; end; procedure TframeFPList.cxGridDBColumn14PropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); begin try frmProductInfoSel := TfrmProductInfoSel.Create(Application); with frmProductInfoSel do begin FSTKName := '助剂'; if ShowModal = 1 then begin with Self.CDS_FP do begin Edit; FieldByName('fp_Name').Value := frmProductInfoSel.CDS_1.fieldbyname('P_Name').value; FieldByName('fp_spel').Value := frmProductInfoSel.CDS_1.fieldbyname('P_Type').value; FieldByName('fp_unit').Value := frmProductInfoSel.CDS_1.fieldbyname('QtyUnit').value; FieldByName('BPIID').Value := frmProductInfoSel.CDS_1.fieldbyname('BPIID').value; end; end; end; finally frmProductInfoSel.Free; end; end; procedure TframeFPList.cxGridDBColumn17PropertiesEditValueChanged( Sender: TObject); var s: string; fValue: Double; begin s := TcxTextEdit(Sender).EditingText; if (s <> '') and (s[Length(s)] <> '%') then begin try // 尝试将字符串转换为浮点数 fValue := StrToFloat(s); // 格式化为两位小数并添加百分号 TvFP.Controller.FocusedColumn.EditValue := FormatFloat('0.00', fValue) + '%'; except on E: EConvertError do begin // 如果转换失败,保持原样并添加百分号 TvFP.Controller.FocusedColumn.EditValue := s + '%'; end; end; end; end; procedure TframeFPList.FillAllTextEditsWithValue(AParent: TWinControl; const AHint, AValue: string; AExclude: TcxTextEdit = nil); // 可选:排除特定控件 var i: Integer; AControl: TControl; ATextEdit: TcxTextEdit; begin for i := 0 to AParent.ControlCount - 1 do begin AControl := AParent.Controls[i]; if (AControl is TcxTextEdit) and ((AControl as TcxTextEdit).Text = '') then begin ATextEdit := AControl as TcxTextEdit; if (ATextEdit.Hint = AHint) and (ATextEdit <> AExclude) then ATextEdit.Text := AValue; end; end; end; procedure TframeFPList.ClearAllTextEditsByHint(AParent: TWinControl; const AHint: string; AExclude: TcxTextEdit = nil); var i: Integer; AControl: TControl; begin for i := 0 to AParent.ControlCount - 1 do begin AControl := AParent.Controls[i]; // 检查是否是 TcxTextEdit,并且 Hint 匹配,且不是排除的控件 if (AControl is TcxTextEdit) and (TcxTextEdit(AControl).Hint = AHint) and (TcxTextEdit(AControl) <> AExclude) then begin TcxTextEdit(AControl).Text := ''; // 直接清空 end; end; end; function TframeFPList.FindLastEditedTextEdit(AParent: TWinControl; const AHint: string): string; var i, j: Integer; AControl: TControl; SortedControls: TList; TempControl: TControl; begin Result := ''; // 如果没有子控件,直接返回空 if AParent.ControlCount = 0 then Exit; // 使用 TList 存储控件(兼容旧版 Delphi) SortedControls := TList.Create; try // 将所有子控件添加到列表 for i := 0 to AParent.ControlCount - 1 do SortedControls.Add(AParent.Controls[i]); // 手动排序:按 Top(Y坐标)和 Left(X坐标)升序排列 for i := 0 to SortedControls.Count - 1 do begin for j := i + 1 to SortedControls.Count - 1 do begin // 比较两个控件的 Top 和 Left if (TControl(SortedControls[i]).Top > TControl(SortedControls[j]).Top) or ((TControl(SortedControls[i]).Top = TControl(SortedControls[j]).Top) and (TControl(SortedControls[i]).Left > TControl(SortedControls[j]).Left)) then begin // 交换位置 TempControl := TControl(SortedControls[i]); SortedControls[i] := SortedControls[j]; SortedControls[j] := TempControl; end; end; end; // 遍历排序后的控件 for i := 0 to SortedControls.Count - 1 do begin AControl := TControl(SortedControls[i]); if (AControl is TcxTextEdit) and (TcxTextEdit(AControl).Hint = AHint) and (TcxTextEdit(AControl).Text <> '') then begin Result := TcxTextEdit(AControl).Text; // 最后一个符合条件的会被保留 end; end; finally SortedControls.Free; end; end; end.