TDBPanel = class(TPanel)
private
{ Private declarations }
FLeft: Integer;
FTop: Integer;
maxTextLen: Integer;
maxLabelLen: Integer;
FScrollBox: TScrollBox; {滚动控件}
FLineHeight: Integer;
FClick: TNotifyEvent;
Editors: array of TDBComboBox;
- >具体进行编辑所用的数据控件数组,动态生成
Labels: array of TLabel;
- >各字段的标题,动态生成
OkButton: TButton;
- >最后增加的确定按钮,用于实现提交动作。
{ 数据源}
FDataSource: TDataSource;
FColumns: Integer;
- >输入表格的列数
protected
{ Protected declarations }
procedure FreeEditors;
- >释放数据输入控件的内存
public
procedure CreateEditors;//
(DS: TDataSource; ColCount: Integer);
- >创建各字段的数据输入控件
constructor Create(AOwner:
TComponent); override;
destructor Destroy; override;
procedure AKeyPress(Sender:
TObject; var Key: Char);
procedure AKeyDown(Sender:
TObject; var Key: Word; Shift:
TShiftState);
procedure ClearHits(ItemIndex: Integer);
procedure AddHits(ItemIndex:
Integer; Hits: array of string);
function Editor(Index: Integer):
TDBComboBox;
{ Public declarations }
published
property LeftLimit: Integer read
FLeft write FLeft default 10;
property TopLimit: Integer read
FTop write FTop default 10;
property EditorLen: Integer read
maxTextLen write maxTextLen;
property LabelLen: Integer read
maxLabelLen write maxLabelLen default 100;
property LineHeight: Integer read
FLineHeight write FLineHeight default 15;
property OnOkClick: TNotifyEvent
read FClick write FClick;
property DataSource: TDataSource
read FDataSource write FDataSource;
- >数据源
property Columns: Integer read
FColumns write FColumns;- >表列数
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Additional', [TDBPanel]);
end;
{ 为第I字段增加提示信息的方法}
procedure TDBPanel.AddHits(ItemIndex:
Integer; Hits: array of string);
var
m,n,i: Integer;
begin
n := Length(Editors);
m := Length(Hits);
if ItemIndex< n then begin
for i:=0 to m-1 do Editors[ItemIndex].Items.Add(Hits[i]);
end;
end;
procedure TDBPanel.AKeyDown
(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Sender is TDBComboBox) then begin
case Key of
VK_Next: (Sender as TDBComboBox)
.DataSource.DataSet.Next;
VK_PRIOR: (Sender as TDBComboBox)
.DataSource.DataSet.Prior;
end;
end;
end;
procedure TDBPanel.AKeyPress(Sender: TObject; var Key: Char);
begin
if (Sender is TDBComboBox) then begin
if Key=#13 then (Owner as TForm).Perform(WM_NEXTDLGCTL, 0, 0);
end;
end;
procedure TDBPanel.ClearHits(ItemIndex: Integer);
var
n: Integer;
begin
n := Length(Editors);
if ItemIndex< n then Editors[ItemIndex].Items.Clear;
end;
constructor TDBPanel.Create(AOwner: TComponent);
begin
Inherited Create(AOWner);
FLeft :=10;
FTop := 10;
maxTextLen := 100;
maxLabelLen := 100;
FLineHeight := 15;
end;
{ 创建各字段的数据输入控件的方法}
procedure TDBPanel.CreateEditors;//
(DS: TDataSource; ColCount: Integer);
var
i, n, RowCount: Integer;
TextHeight: Integer;
begin
if DataSource.DataSet.Active then begin
n := DataSource.DataSet.FieldCount;
{ 计算最大的标题长度及显示长度}
DataSource.DataSet.First;
{ 计算高度}
TextHeight := Canvas.TextHeight(DataSource
.DataSet.Fields[0].DisplayLabel) + FLineHeight; //10;
{ 计算行列数}
RowCount := n div Columns;
if n mod Columns < > 0 then inc(RowCount);
{ 分配内