为了实现数据控件以及代码的重用性,我们往往不能直接利用控件进行设置,而需动态设定。下面是部分代码(delphi6+win98se通过): 1.下拉列表 //初始化PickList Function TfrmDataModule.InitPickList(FieldName,TableName:String;isNull:boolean):TStrings; var Uclstring1:TStrings; ADOQuery1:TADOQuery; begin Uclstring1:=TStringList.Create; ADOQuery1:=TADOQuery.Create(self); with ADOQuery1 do begin Connection:=ADOConnection1; SQL.Add('Select Distinct '+FieldName+' From '+TableName); open; if isNull then Uclstring1.Add(''); while not Eof do begin Uclstring1.Add(Fieldbyname(FieldName).asstring); next; end; Result:=Uclstring1; Free; end; end; 调用实例: //... dbgrid1.Columns.Items[8].PickList:=frmDataModule.InitPickList('F_ware','ware',True); //... 2.弹出窗口 procedure TfrmWarManSend.FormShow(Sender: TObject); var I:integer; begin //... with DBgrid1 do begin for I:= 0 to Columns.Count-1 do Columns.Items[I].Title.Alignment:=taCenter; Columns.Items[0].ButtonStyle:=cbsEllipsis;//弹出按钮形状 OnEditButtonClick:=BitBtnCodeLookClick;//激活时,对应的事件(本人的按钮BitBtnCodeLookClick事件是弹出一个选择窗口,也即是当光标处于第一列编辑状态时,当列右则自动出现一个按钮,单击就弹出窗口) end; //... end; //另一个弹出窗口的技巧(当光标处于第一列且编辑状态时,按空格键直接弹出窗口). procedure TfrmWarManSend.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key=VK_space) and (dbgrid1.SelectedIndex=0) and (frmDataModule.DataSource1.State in [dsEdit,dsInsert]) then BitBtnCodeLookClick(sender); end;
以下是我插TDateTimePicker程序,调试已通过。 procedure TfrmProductplan.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if (gdfocused in state) or (gdSelected in state) then begin if Column.FieldName='HopeDate' then begin Dtp1.Left :=rect.Left +dbgrid1.Left ; Dtp1.Top :=rect.Top +dbgrid1.Top ; Dtp1.Width :=rect.Right -rect.Left ; Dtp1.Height :=rect.Bottom -rect.Top+3 ; Dtp1.Width:=Dbgrid1.Columns[6].Width; if trim(AQBill.FieldByName('HopeDate').AsString)<>'' then dtp1.Date:=StrToDate(Str8Date(AQBill.FieldByName('HopeDate').AsString)); Dtp1.Visible :=true; end else begin Dtp1.Visible :=False; end; end else begin Dtp1.Visible :=False; end; end;procedure TfrmProductplan.DBGrid1ColExit(Sender: TObject); begin if dbgrid1.SelectedField.FieldName <>'HopeDate' then Dtp1.Visible :=false; end;
//初始化PickList
Function TfrmDataModule.InitPickList(FieldName,TableName:String;isNull:boolean):TStrings;
var
Uclstring1:TStrings;
ADOQuery1:TADOQuery;
begin
Uclstring1:=TStringList.Create;
ADOQuery1:=TADOQuery.Create(self);
with ADOQuery1 do
begin
Connection:=ADOConnection1;
SQL.Add('Select Distinct '+FieldName+' From '+TableName);
open;
if isNull then Uclstring1.Add('');
while not Eof do
begin
Uclstring1.Add(Fieldbyname(FieldName).asstring);
next;
end;
Result:=Uclstring1;
Free;
end;
end; 调用实例:
//...
dbgrid1.Columns.Items[8].PickList:=frmDataModule.InitPickList('F_ware','ware',True);
//... 2.弹出窗口
procedure TfrmWarManSend.FormShow(Sender: TObject);
var
I:integer;
begin
//...
with DBgrid1 do
begin
for I:= 0 to Columns.Count-1 do
Columns.Items[I].Title.Alignment:=taCenter;
Columns.Items[0].ButtonStyle:=cbsEllipsis;//弹出按钮形状
OnEditButtonClick:=BitBtnCodeLookClick;//激活时,对应的事件(本人的按钮BitBtnCodeLookClick事件是弹出一个选择窗口,也即是当光标处于第一列编辑状态时,当列右则自动出现一个按钮,单击就弹出窗口)
end;
//...
end; //另一个弹出窗口的技巧(当光标处于第一列且编辑状态时,按空格键直接弹出窗口).
procedure TfrmWarManSend.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key=VK_space) and (dbgrid1.SelectedIndex=0) and (frmDataModule.DataSource1.State in [dsEdit,dsInsert]) then
BitBtnCodeLookClick(sender);
end;
另:創建一個控件你到大富翁論壇上去搜索一下,很多很多
procedure TfrmProductplan.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
if (gdfocused in state) or (gdSelected in state) then
begin
if Column.FieldName='HopeDate' then
begin
Dtp1.Left :=rect.Left +dbgrid1.Left ;
Dtp1.Top :=rect.Top +dbgrid1.Top ;
Dtp1.Width :=rect.Right -rect.Left ;
Dtp1.Height :=rect.Bottom -rect.Top+3 ;
Dtp1.Width:=Dbgrid1.Columns[6].Width;
if trim(AQBill.FieldByName('HopeDate').AsString)<>'' then
dtp1.Date:=StrToDate(Str8Date(AQBill.FieldByName('HopeDate').AsString));
Dtp1.Visible :=true;
end
else
begin
Dtp1.Visible :=False;
end;
end
else
begin
Dtp1.Visible :=False;
end;
end;procedure TfrmProductplan.DBGrid1ColExit(Sender: TObject);
begin
if dbgrid1.SelectedField.FieldName <>'HopeDate' then
Dtp1.Visible :=false;
end;