unit U_frameFSList;

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
  TframeFSList = class(TFrame)
    ADOQueryMain: TADOQuery;
    ADOQueryCmd: TADOQuery;
    ADOQueryTemp: TADOQuery;
    CDS_HZ: TClientDataSet;
    DS_HZ: TDataSource;
    cxGridPopupMenu2: TcxGridPopupMenu;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    Panel_FS: TPanel;
    LabelFS: TLabel;
    cxLabel198: TcxLabel;
    fs_speed: TcxTextEdit;
    FS_Style: TcxComboBox;
    fs_isVacuun: TcxComboBox;
    TbFSReplace2: TcxButton;
    TBFScLEAR2: TcxButton;
    cxLabel192: TcxLabel;
    cxLabel194: TcxLabel;
    cxLabel195: TcxLabel;
    cxLabel196: TcxLabel;
    cxLabel205: TcxLabel;
    cxLabel207: TcxLabel;
    cxLabel208: TcxLabel;
    cxLabel209: TcxLabel;
    cxLabel210: TcxLabel;
    cxLabel211: TcxLabel;
    cxLabel231: TcxLabel;
    fs_temperature1: TcxTextEdit;
    fs_temperature10: TcxTextEdit;
    fs_temperature11: TcxTextEdit;
    fs_temperature2: TcxTextEdit;
    fs_temperature3: TcxTextEdit;
    fs_temperature4: TcxTextEdit;
    fs_temperature5: TcxTextEdit;
    fs_temperature6: TcxTextEdit;
    fs_temperature7: TcxTextEdit;
    fs_temperature8: TcxTextEdit;
    fs_temperature9: TcxTextEdit;
    cxGrid7: TcxGrid;
    TvFS: TcxGridDBTableView;
    cxGridDBColumn19: TcxGridDBColumn;
    cxGridDBColumn22: TcxGridDBColumn;
    TvFSserialno: TcxGridDBColumn;
    cxGridLevel6: TcxGridLevel;
    cxLabel7: TcxLabel;
    TbFSAdd: TcxButton;
    TbFSDel: TcxButton;
    fs_Precautions: TcxMemo;
    CDS_fS: TClientDataSet;
    DS_FS: TDataSource;
    TvFSfs_spel: TcxGridDBColumn;
    TvFSfs_unit: TcxGridDBColumn;
    TvFSBPIID: TcxGridDBColumn;
    procedure TBRafreshClick(Sender: TObject);

    procedure ToolButton5Click(Sender: TObject);
    procedure ToolButton3Click(Sender: TObject);
    procedure TbFSReplace2Click(Sender: TObject);
    procedure TBFScLEAR2Click(Sender: TObject);
    procedure TbFSAddClick(Sender: TObject);
    procedure TbFSDelClick(Sender: TObject);
    procedure cxGridDBColumn19PropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure cxGridDBColumn22PropertiesEditValueChanged(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 TframeFSList.InitGrid();
begin
//  POSNO.SetFocus;
//  try
//    ADOQueryMain.DisableControls;
//    with ADOQueryMain do
//    begin
//      Close;
//      SQL.Clear;
//      sql.Add(' select A.* from  BS_Position A order by POSNO ');
//      Open;
//    end;
//    SCreateCDS(ADOQueryMain, CDS_HZ);
//    SInitCDSData(ADOQueryMain, CDS_HZ);
//  finally
//    ADOQueryMain.EnableControls;
//    ToolButton2.Click;
//  end;
end;

procedure TframeFSList.TbFSAddClick(Sender: TObject);
begin
  with CDS_FS do
  begin
    Append;
    CDS_FS.FieldByName('serialno').Value := CDS_FS.RecordCount + 1;
    Post;
  end;
end;

procedure TframeFSList.TBFScLEAR2Click(Sender: TObject);
begin
  ClearAllTextEditsByHint(panel_FS, '防水温控');
end;

procedure TframeFSList.TbFSDelClick(Sender: TObject);
var
  i: Integer;
begin
  if not CDS_FS.IsEmpty then
  begin

    if Application.MessageBox('确定要删除数据吗？', '提示', 32 + 4) = IDYES then
    begin
      if Trim(CDS_FS.fieldbyname('BCPID').AsString) <> '' then
      begin
        with ADOQueryCmd do
        begin
          Close;
          sql.Clear;
          sql.Add('delete BS_Cloth_GY_Sub where BCPID=' + quotedStr(Trim(CDS_FS.fieldbyname('BCPID').AsString)));
          ExecSQL;
        end;
      end;
      CDS_FS.Delete;
    end
    else
      exit;

    i := 0;
    CDS_FS.First;
    while not CDS_FS.Eof do
    begin
      i := i + 1;
      CDS_FS.Edit;
      CDS_FS.fieldByName('serialno').value := i;
      CDS_FS.Post;
      CDS_FS.Next;
    end;
  end
  else
  begin
    Application.MessageBox('无可删除数据!', '提示', 0);
    Exit;
  end;
end;

procedure TframeFSList.TbFSReplace2Click(Sender: TObject);
begin
  FillAllTextEditsWithValue(panel_fs, '防水温控', FindLastEditedTextEdit(panel_fs, '防水温控'));
end;

procedure TframeFSList.TBRafreshClick(Sender: TObject);
begin
  InitGrid();
end;

procedure TframeFSList.ToolButton3Click(Sender: TObject);
var
  RTValues: TArray<string>;
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 TframeFSList.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 TframeFSList.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_fs, 2);
      ADOQueryCmd.Post;


      with CDS_fS do
      begin
        First;
        while not Eof do
        begin

          if Trim(CDS_fS.fieldbyname('BCPID').AsString) = '' then
          begin
            if GetLSNo(ADOQueryTemp, maxsubid4, 'FS', 'Bs_Cloth_GY_Sub', 5, 1) = False then
            begin

              Application.MessageBox('取配比子流水号失败！', '提示', 0);
              Exit;
            end;
          end
          else
          begin
            maxsubid4 := Trim(CDS_fS.fieldbyname('BCPID').AsString);
          end;

          with ADOQueryCmd do
          begin
            Close;
            SQL.Clear;
            sql.Add('select * from Bs_Cloth_GY_Sub where ');
            sql.Add('  BCPID=''' + Trim(maxsubid4) + '''');
            Open;
          end;
          with ADOQueryCmd do
          begin
            if Trim(CDS_fS.fieldbyname('BCPID').AsString) = '' then
            begin
              Append;

            end
            else
            begin
              Edit;

            end;
            FieldByName('GYType').Value := '下水定型';
            FieldByName('PSID').Value := Trim(mPSID);
            FieldByName('BCPID').Value := Trim(maxsubid4);
            RTSetSaveDataCDS(ADOQueryCmd, TvFS, CDS_fS, 'Bs_Cloth_GY_Sub', 0);
            Post;
          end;
          Next;
        end;
      end;

    end;
////////////////       保存主表结束          //////////////////////



//    FPSID := maxId;
    Result := True;
  except
    Result := False;

    Application.MessageBox('保存失败!', '提示', 0);
  end;
end;


procedure TframeFSList.cxGridDBColumn19PropertiesButtonClick(Sender: TObject;
  AButtonIndex: Integer);
begin
  try
    frmProductInfoSel := TfrmProductInfoSel.Create(Application);
    with frmProductInfoSel do
    begin
      FSTKName := '助剂';
      if ShowModal = 1 then
      begin
        with Self.CDS_FS do
        begin
          Edit;
          FieldByName('fs_Name').Value := frmProductInfoSel.CDS_1.fieldbyname('P_Name').value;
          FieldByName('fs_spel').Value := frmProductInfoSel.CDS_1.fieldbyname('P_Type').value;
          FieldByName('fs_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 TframeFSList.cxGridDBColumn22PropertiesEditValueChanged(
  Sender: TObject);
var
  s: string;
  fValue: Double;
begin
  s := TcxTextEdit(Sender).EditingText;

  if (s <> '') and (s[Length(s)] <> '%') then
  begin
    try
      // 尝试将字符串转换为浮点数
      fValue := StrToFloat(s);
      // 格式化为两位小数并添加百分号
      TvFS.Controller.FocusedColumn.EditValue := FormatFloat('0.00', fValue) + '%';
    except
      on E: EConvertError do
      begin
        // 如果转换失败，保持原样并添加百分号
        TvFS.Controller.FocusedColumn.EditValue := s + '%';
      end;
    end;
  end;
end;

procedure TframeFSList.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 TframeFSList.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 TframeFSList.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.

