📄 jcamtablevieweditor.pas
字号:
// 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 + -