⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jcamtablevieweditor.pas

📁 销售软件
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    // TODO: 检查是否符合信息规格
    for n := 0 to sbxInfoList.ComponentCount - 1 do
    begin
      cmp := sbxInfoList.Components[ n ];
      if ( ( cmp is TCustomEdit ) or ( cmp is TRzComboBox ) ) and TControl(
        cmp ).Enabled then
      begin
        pfp := PFieldProp( Pointer( GetOrdProp( cmp, 'Tag' ) ) );
        if cmp is TRzComboBox then
          sFieldValue := TRzComboBox( cmp ).Text
        else
          sFieldValue := TCustomEdit( cmp ).Text; //GetStrProp( cmp, 'Text' );
        tf.FieldName := pfp^.FieldName;
        sFieldChs := tf.FieldChs;

        // TODO: 检查字段是否为空
        if ( sFieldValue = EmptyStr ) and not pfp^.AllowNull then
        begin
          Screen.Cursor := crDefault;
          MessageBox( Self.Handle, PChar( Format(
            RSTR_MANAGER_INFOSAVE_NOTALLOWNULL, [ sFieldChs ] ) ),
            PChar( STR_APPTITLE ), MB_ICONEXCLAMATION );
          TWinControl( cmp ).SetFocus;
          Exit;
        end;

        // TODO: 检查字段是否重复
        if not pfp^.AllowRepeated then
          for nCheckField := n + 2 to sbxInfoList.ComponentCount - 1 do
          begin
            cmpCheckField := sbxInfoList.Components[ n ];
            if ( ( cmpCheckField is TCustomEdit ) or ( cmpCheckField is
              TCustomComboBox ) ) and ( GetStrProp( cmpCheckField, 'Text' ) =
              sFieldValue ) and TControl( cmpCheckField ).Enabled then
            begin
              Screen.Cursor := crDefault;
              MessageBox( Self.Handle, PChar( Format(
                RSTR_MANAGER_INFOSAVE_NOTALLOWREPEATED, [ sFieldChs ] ) ),
                PChar( STR_APPTITLE ), MB_ICONEXCLAMATION );
              TWinControl( cmp ).SetFocus;
              Exit;
            end;
          end;

        // TODO: 检查字段长度
        if Length( sFieldValue ) > pfp^.MaxLength then
        begin
          Screen.Cursor := crDefault;
          MessageBox( Self.Handle, PChar( Format(
            RSTR_MANAGER_INFOSAVE_OUTOFMAXLENGTH, [ sFieldChs ] ) ),
            PChar( STR_APPTITLE ), MB_ICONEXCLAMATION );
          TWinControl( cmp ).SetFocus;
          Exit;
        end;
      end;
    end;

    // TODO: 开始保存
    cmd := CoCommand.Create;
    cmd.Set_ActiveConnection( Self.Connection );
    cmd.CommandText := SaveInfoProcName;
    cmd.CommandType := adCmdStoredProc;

    // TODO: 添加变量
    par := cmd.CreateParameter
      ( PVSTR_RETURN, adBoolean, adParamReturnValue, 1, EmptyParam );
    cmd.Parameters.Append( par );
    par := cmd.CreateParameter
      ( PVSTR_ISINFOADD, adBoolean, adParamInput, 1, m_bInfoAdding );
    cmd.Parameters.Append( par );
    par := cmd.CreateParameter
      ( PVSTR_INKEYFIELDVALUE, adVarChar, adParamInput, 100, m_nCurrentIdx );
    cmd.Parameters.Append( par );
    par := cmd.CreateParameter
      ( PVSTR_OUTKEYFIELDVALUE, adVarChar, adParamOutput, 100, EmptyParam );
    cmd.Parameters.Append( par );

    // TODO: 循环获取控件
    for n := 0 to sbxInfoList.ComponentCount - 1 do
    begin
      cmp := sbxInfoList.Components[ n ];
      if ( cmp is TCustomEdit ) or ( cmp is TCustomComboBox ) then
      begin
        pfp := PFieldProp( Pointer( GetOrdProp( cmp, 'Tag' ) ) );
        sFieldName := pfp^.FieldName;
        if cmp is TRzComboBox then
          sFieldValue := TRzComboBox( cmp ).Text
        else
          sFieldValue := TCustomEdit( cmp ).Text; //GetStrProp( cmp, 'Text' );
        if sFieldValue = EmptyStr then
          varFieldValue := Null
        else
          varFieldValue := sFieldValue;
        if sFieldName <> KeyFieldName then
        begin
          par := cmd.CreateParameter
            ( sFieldName, adVarChar, adParamInput, 100, varFieldValue );
          cmd.Parameters.Append( par );
        end;
      end;
    end;

    // TODO: 运行过程
    cmd.Execute( EmptyParam, EmptyParam, adCmdStoredProc + adExecuteNoRecords );
    bProcResult := cmd.Parameters[ PVSTR_RETURN ].Value;
    nOutKeyFieldValue := cmd.Parameters[ PVSTR_OUTKEYFIELDVALUE ].Value;

    if not bProcResult then
    begin
      Screen.Cursor := crDefault;
      MessageBox( Self.Handle, PChar( RSTR_MANAGER_INFOSAVE_FAILED ),
        PChar( STR_APPTITLE ), MB_ICONEXCLAMATION );
    end;

    cmd := nil;
    par := nil;

    // TODO: 设置按钮状态
    SetAllEditReadOnly( True );

    ActionAdd.Enabled := m_bBtnAddEnabled and UserCanModify;
    ActionDelete.Enabled := m_bBtnDeleteEnabled and UserCanModify;
    ActionEdit.Enabled := m_bBtnEditEnabled and UserCanModify;
    ActionSave.Enabled := m_bBtnSaveEnabled and UserCanModify;
    ActionCancel.Enabled := m_bBtnCancelEnabled and UserCanModify;

    DBListView.StartFillData( False );
    li := DBListView.GetItemByKeyFieldValue( nOutKeyFieldValue );
    if li <> nil then
    begin
      li.MakeVisible( True );
      li.Focused := True;
      DBListView.Selected := li;
    end;

    DBListView.Enabled := True;
    DBListView.SetFocus;
    m_bInfoAdding := False;

    Screen.Cursor := crDefault;
  end;

  // TODO: 处理外部的事件过程
  if Assigned( OnButtonSaveClick ) then
    OnButtonSaveClick( Sender );
end;

procedure TfrmTableViewEditorForm.BlankAllEdit;
begin
  FillAllEditString;
end;

procedure TfrmTableViewEditorForm.pBTEChange( Sender: TObject );
var
  pfp: PFieldProp;
  rs: _Recordset;
begin
  if ( Sender is TCustomEdit ) and ( m_acEditor <> nil ) and ( TCustomEdit(
    Sender ).Text <> EmptyStr ) then
  begin
    rs := CoRecordset.Create;
    pfp := PFieldProp( Pointer( TCustomEdit( Sender ).Tag ) );
    with pfp^ do
    begin
      rs.Open( 'SELECT [' + FieldName + '] FROM [' + CodeTable + '] WHERE [' +
        FieldName + '] LIKE ''' + TCustomEdit( Sender ).Text + '%''',
        Connection, adOpenForwardOnly, adLockReadOnly, adCmdText );
      if RecordsetValid( rs ) then
      begin
        repeat
          m_acEditor.AddString( rs.Fields[ FieldName ].Value );
          rs.MoveNext;
        until rs.EOF;
        rs.Close;
      end;
      rs := nil;
    end;
  end;
end;

procedure TfrmTableViewEditorForm.pBTNClick( Sender: TObject );
var
  cboInfo: TRzComboBox;
  pfp: PFieldProp;
begin
  { 编辑框按钮按下 }

  if Sender is TRzBitBtn then
  begin
    cboInfo := TRzComboBox( sbxInfoList.Components[ TRzBitBtn( Sender ).Tag ] );
    frmFieldValuesList := TfrmFieldValuesList.Create( Self );
    with frmFieldValuesList do
    begin
      Connection := Self.Connection;
      ReadOnly := cboInfo.ReadOnly;
      pfp := PFieldProp( Pointer( cboInfo.Tag ) );
      TableViewName := Self.TableViewName;
      FieldName := pfp.FieldName;
      FieldValue := cboInfo.Text;
      StartSurf;
      ShowModal;

      // TODO: 设置返回值
      if ( ModalResult = mrOk ) and not cboInfo.ReadOnly then
        cboInfo.Text := FieldValue;
    end;
    FreeAndNil( frmFieldValuesList );
    if cboInfo.Enabled then
      cboInfo.SetFocus;
  end;
end;

procedure TfrmTableViewEditorForm.CheckBtnVisible;
begin
  { 检查是否每个按钮都不可见 }

  tbrBtns.Visible := ( btnAdd.Visible ) or ( btnDelete.Visible ) or
    ( btnEdit.Visible ) or ( btnSave.Visible ) or ( btnCancel.Visible );
end;

procedure TfrmTableViewEditorForm.pCBODropDown( Sender: TObject );
var
  pfp: PFieldProp;
  rs: _Recordset;
  sSQLString: string;
begin
  { 下拉菜单列出关系字段可选值 }

  if Sender is TCustomComboBox then
    with TCustomComboBox( Sender ) do
    begin
      Items.Clear;
      pfp := PFieldProp( Pointer( TCustomComboBox( Sender ).Tag ) );
      with pfp^ do
      begin
        if CodeTable = EmptyStr then
          sSQLString := 'SELECT DISTINCT [' + FieldName + '] FROM [' +
            TableViewName + ']'
        else
          sSQLString := 'SELECT [' + NameFromCode + '] FROM [' + CodeTable +
            ']';
      end;

      rs := CoRecordset.Create;
      rs.Open( sSQLString, Connection, adOpenForwardOnly, adLockReadOnly,
        adCmdText );
      if RecordsetValid( rs ) then
      begin
        repeat
          Items.Add( VarToStr( rs.Fields[ 0 ].Value ) );
          rs.MoveNext;
        until rs.EOF;
        rs.Close;
      end;
      rs := nil;
    end;
end;

procedure TfrmTableViewEditorForm.pColumnSort( const nColumnIdx: Integer );
begin
  { 处理列表头排序 }

  if nColumnIdx = m_nColumnSortIdx then
    m_bColumnSortAscend := not m_bColumnSortAscend
  else
    m_bColumnSortAscend := True;

  m_nColumnSortIdx := nColumnIdx;
  DBListView.AlphaSort;
end;

procedure TfrmTableViewEditorForm.pDestroyComponents;
var
  cmpContained: TComponent;
  n: Integer;
begin
  { 清空面板上的控件 }

  if sbxInfoList.ComponentCount > 0 then
    for n := sbxInfoList.ComponentCount - 1 downto 0 do
    begin
      cmpContained := sbxInfoList.Components[ n ];
      if ( cmpContained is TLabel ) or ( cmpContained is TRzLabel ) then
        FreeAndNil( cmpContained );
      if ( cmpContained is TCustomEdit ) or ( cmpContained is TCustomComboBox )
        then
      begin
        Dispose( PFieldProp( Pointer( TControl( cmpContained ).Tag ) ) );
        FreeAndNil( cmpContained );
      end;
    end;
end;

procedure TfrmTableViewEditorForm.pDVWColumnClick( Sender: TObject;
  Column: TListColumn );
begin
  pColumnSort( Column.Index );

  if Assigned( m_eOldDVWColumnClick ) then
    m_eOldDVWColumnClick( Sender, Column );
end;

procedure TfrmTableViewEditorForm.pDVWDataStateChange( Sender: TObject;
  StartIndex, EndIndex: Integer; OldState, NewState: TItemStates );
begin
  if ( Abs( StartIndex - EndIndex ) > 0 ) and ( isSelected in OldState ) then
  begin
    ActionDelete.Enabled := True and UserCanModify;
    ActionEdit.Enabled := False;
    ActionSave.Enabled := False;
    ActionCancel.Enabled := False;

    InfoMultiSelected;
  end;

  if Assigned( m_eOldDVWDataStateChange ) then
    m_eOldDVWDataStateChange( Sender, StartIndex, EndIndex, OldState, NewState
      );
end;

procedure TfrmTableViewEditorForm.pDVWInfoTip( Sender: TObject; Item: TListItem;
  var InfoTip: string );
var
  tf: TTableField;
  rs: _Recordset;
  sInfoHint, sSQLString: string;
  n, nKeyFieldValue: Integer;
begin
  { 显示项目的对应的信息 }

  if ( DBListView <> nil ) and ( Item <> nil ) and m_bShowListItemInfoHint then
    with DBListView do
    begin
      sInfoHint := EmptyStr;
      nKeyFieldValue := ItemKeyFieldValue( Item.Index );

      // TODO: 通过当前鼠标指向项目的ID获取记录集
      sSQLString := MakeSQLString( EmptyStr, TableViewName, '[' +
        KeyFieldName + ']=' + IntToStr( nKeyFieldValue ) );
      rs := CoRecordset.Create;
      rs.Open( sSQLString, Self.Connection, adOpenForwardOnly, adLockReadOnly,
        adCmdText );

      tf := TTableField.Create;
      tf.Connection := Self.Connection;
      if RecordsetValid( rs ) then
        for n := 0 to rs.Fields.Count - 1 do
          if rs.Fields[ n ].Name <> KeyFieldName then
          begin
            tf.FieldName := rs.Fields[ n ].Name;
            sInfoHint := sInfoHint + tf.FieldChs + ': ' +
              VarToStr( rs.Fields[ n ].Value ) + STR_NEWLINE;
          end;

      rs := nil;
      FreeAndNil( tf );
      InfoTip := sInfoHint;
    end;
end;

procedure TfrmTableViewEditorForm.pDVWSelectItem( Sender: TObject;
  Item: TListItem; Selected: Boolean );
begin
  BlankAllEdit;

  // TODO: 判断选择了多少项做相应的处理
  case DBListView.SelCount of
    0: pDVWSelectNone;

    1:
      if Item <> nil then
      begin
        ActionDelete.Enabled := True and UserCanModify;
        ActionEdit.Enabled := True and UserCanModify;
        ActionSave.Enabled := False;
        ActionCancel.Enabled := False;

        pFillInfoByItemIndex( Item.Index );
      end;

  else
    begin
      ActionDelete.Enabled := True and UserCanModify;
      ActionEdit.Enabled := False;
      ActionSave.Enabled := False;
      ActionCancel.Enabled := False;

      InfoMultiSelected;
    end;
  end;

  if Assigned( m_eOldDVWSelectItem ) then
    m_eOldDVWSelectItem( Sender, Item, Selected );
  if Owner is TfrmJCAMManagerForm then
    TfrmJCAMManagerForm( Owner ).UpdateStatusCaption;
end;

procedure TfrmTableViewEditorForm.pDVWSelectNone;
begin
  ActionDelete.Enabled := False;
  ActionEdit.Enabled := False;
  ActionSave.Enabled := False;
  ActionCancel.Enabled := False;
end;

procedure TfrmTableViewEditorForm.pEDTChange( Sender: TObject );
var
  pfp: PFieldProp;
  rs: _Recordset;
begin
  if ( Sender is TCustomEdit ) and ( m_acEditor <> nil ) and ( TCustomEdit(
    Sender ).Text <> EmptyStr ) then
  begin
    rs := CoRecordset.Create;
    pfp := PFieldProp( Pointer( TCustomEdit( Sender ).Tag ) );
    with pfp^ do
    begin
      rs.Open( 'SELECT [' + FieldName + '] FROM [' + TableViewName + '] WHERE ['
        + FieldName + '] LIKE ''' + TCustomEdit( Sender ).Text + '%''',
        Connection, adOpenForwardOnly, adLockReadOnly, adCmdText );
      if RecordsetValid( rs ) then
      begin
        repeat
          m_acEditor.AddString( rs.Fields[ FieldName ].Value );
          rs.MoveNext;
        until rs.EOF;
        rs.Close;
      end;
      rs := nil;
    end;
  end;
end;

procedure TfrmTableViewEditorForm.pEDTEnter( Sender: TObject );
var
  hWnd: THandle;
begin
  if Sender is TCustomEdit then
  begin
    //hWnd := ComboBoxEditHandle( TCustomEdit( Sender ).Handle );
    if m_acEditor <> nil then
      FreeAndNil( m_acEditor );
    hWnd := TCustomEdit( Sender ).Handle;
    m_acEditor := TJSAutoComplete.Create( hWnd );
  end;
end;

procedure TfrmTableViewEditorForm.pEDTExit( Sender: TObject );
begin
  if Sender is TCustomEdit then
    if m_acEditor <> nil then
      FreeAndNil( m_acEditor );
end;

procedure TfrmTableViewEditorForm.FillAllEditString( const sFillStr: string );
var
  cmp: TComponent;
  n: Integer;
begin
  for n := 0 to sbxInfoList.ComponentCount - 1 do
  begin
    cmp := sbxInfoList.Components[ n ];
    if cmp is TCustomEdit then
      TCustomEdit( cmp ).Text := sFillStr;
    if cmp is TRzComboBox then
      TRzComboBox( cmp ).Text := sFillStr;
  end;
end;

procedure TfrmTableViewEditorForm.pFillInfoByItemIndex( const nItemIndex:
  Integer );
var
  nKeyFieldID: Integer;
begin
  { 列出内容由Item的Index }

  if DBListView <> nil then
  begin
    nKeyFieldID := DBListView.ItemKeyFieldValue( nItemIndex );
    pFillInfoByKeyFieldID( nKeyFieldID );
  end;
end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -