Delphi实用技巧经验(图文).doc_第1页
Delphi实用技巧经验(图文).doc_第2页
Delphi实用技巧经验(图文).doc_第3页
Delphi实用技巧经验(图文).doc_第4页
Delphi实用技巧经验(图文).doc_第5页
已阅读5页,还剩23页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

空 空格空格调整对齐方式窗体的visible属性设置相当于showmodalaq一行一行执行,所以要把一些语句写在循环里(除了在grid添加数据)Caption,Text:显示名 Name:系统名Sql表:create,drop,alter 数据:insert,delete,update数据模块在uses里时用文件名,调用时用系统名全局变量:用于不同表单间的传值。如在public中定义变量a,使用时把值赋给form.a,具体可参考设置第一列为下拉式菜单Delphi设置 切换窗体project-options-forms 字体tools-options-display问题处理属性栏消失按F11Image提示“unknown picture file extension(.jpg) ” 在 uses中加 Jpeg重建某个窗体(如unit2):新建unit1unit2,退出再重建,使之产生dcu文件,再将这三个文件复制到所需目录下,同时删除history文件夹DBGrid某列的小数位数(at默认会去掉末尾的0,如1.00-1) TFloatField(dbGrid1.Columns2.Field).DisplayFormat := 0.00;函数定位posex(str1, str2,n) 在str1在str2从n的位置开始的位置,默认从1开始,输出int类型,必须在uses中加入StrUtils posex(b,abcabcabc,3)=5复制copy(str,2,3),输入输出都是str,如copy(inttostr(1234),2,2)=23长度length(str) 输出int重复dupestring(chr(9),10) 将Tab重复10次,必须在uses中加入StrUtils左取leftstr(str,2),rightstr(str,2) ,必须在uses中加入StrUtils保留小数位数(2位),会四舍五入 FormatFloat(0.00,1.111),str类型格式小数小数定义成real,转换floattoint,inttofloat; floattostr ,strtofloat Asfloat验证trystrtofloat(同理trystrtoint)Vars: string;x:double;begin s:=123.45x;if not trystrtofloat(s,x) then showmessage(数据类型转换出错);end保留小数位数(2位),会四舍五入 FormatFloat(0.00,1.111),str类型DBGrid某列的小数位数(默认会去掉末尾的0,如1.00-1,下面语句只改变DBGrid显示格式,若从at取出数据给edit,显示的还是去0,但是sql表中定义成money类型而delphi中提交如1,则sql表中自动转换为1.00) TFloatField(dbGrid1.Columns2.Field).DisplayFormat := 0.00;日期定义成date1:TDateTime,转换用datetostr, strtodate if not TryStrToDate(str,date1) then. AsDateTime常见键值vbKeyBack 8 BACKSPACE 键 vbKeyTab 9 TAB 键 vbKeyReturn 13 ENTER 键 警告窗口application.MessageBox(输入内容,标题 , MB_ICONEXCLAMATION);1. 指定讯息视窗上的图示1.1 MB_ICONEXCLAMATION 或 MB_ICONWARNING 出现黄三角形内有一个惊叹号图示1.2 MB_ICONINFORMATION 或 MB_ICONASTERISK 出现白色椭圆内有一个蓝色小写 i图示1.3 MB_ICONQUESTION 出现问号图示1.4 MB_ICONSTOP 或 MB_ICONERROR 或 MB_ICONHAND 出现红色X图示2. 指定讯息视窗出现的按钮2.1 MB_ABORTRETRYIGNORE 出现AbortRetryIgnore三个按钮2.2 MB_OK 出现Ok按钮,为预设值。2.3 MB_OKCANCEL 出现OkCancel两个按钮2.4 MB_RETRYCANCEL 出现RetryCancel两个按钮2.5 MB_YESNO 出现YesNo两个按钮2.6 MB_YESNOCANCEL 出现YesNoCancel三个按钮3. 可指定预设Focus在哪一个按钮3.1 MB_DEFBUTTON1 指定focus在左边第一个按钮,这是预设值。3.2 MB_DEFBUTTON2、MB_DEFBUTTON3、MB_DEFBUTTON4 以此类推,指定focus在左边第二、三、四个按钮4. 可指定是否 Modal4.1 MB_APPLMODAL 对于应用程式而言,是 modal form4.2 MB_SYSTEMMODAL 对于作业系统而言,是 modal form4.3 MB_TASKMODAL5. 其他5.1 MB_TOPMOST 将讯息视窗提至最前面5.2 MB_RIGHT 将讯息文字向右对齐IF语句IF e1 THEN (没分号)ELSE IF e2 THEN (没分号)ELSE ;表达式用“=”或布尔类型,如not ADOQuery1.EOF存在问题 aq,recordcount清空文本框edit1.clear;edit1.Text:=;控件介绍DBGrid(可直接修改表,默认会去掉列数据末尾的0)事件:keydown,keypress,与aq,at联动的afterscroll列名Columns0.Title.Caption列数columns.count /recordcount(aq,at)列数据源Columns0.Fieldname (aq,at) /fieldbyname(列名).AsString (aq,at)当前列号,从零开始DBGrid1. SelectedIndex (当前列号,从1开始) ADOTable1.recno表对齐align 列数据对齐columns0.Alignment列标题对齐Columns0.Title.Alignment :=taCenter表只读DBGrid1.ReadOnly:=true; 或可视化里options双击,将DBEditing设为false 列只读columns0.ReadOnlyfont.Name:=宋体;font.Size:=9;Columns.clearColumns.AddDBGrid,Form布局Columns0.Width:=8*10 columns0.Alignment:=taRightJUstify;columns0.Title.Alignment:=taRightJUstify;Columns0.Font.Name:= 宋体columns0.Title Font.Name:=t 宋体宽度x:=GetSystemMetrics(SM_CYVSCROLL)+18;for i:=0 to dbgrid1.columns.count-1 do begin x:=x+dbgrid1.columnsi.width+1; end;width:=x+7;DBGrid数据源ac创建临时表with adocommand1 dobegin CommandText:=drop table tmp select productid into tmp from products; execute;end;with adotable1 dobegin Close; TableName:=tmp; Open;end;aq查询,在Grid中增加列with adoquery1 dobegin Close; SQL.Text:=select Productid from products; Open;end;Columns0.Title.Caption:=产品编码;Columns0.Fieldname:=Productid;/若select修改了列名,则要用修改后的列名,同时可以去掉Columns0.Title.Caption:=产品编码;DBGridEh(与Grid类似,可通过aq,at连1)行高 Rowheight:=19;多重标题 TitleLines:=2; UseMultiTitle:=true;Columns0.Title.Caption:=a|b;Columns1.Title.Caption:=a|c;列数据源 columns0.FieldName:=Productid;第一列固定dbgrideh1.FrozenCols:=1;合计汇总DBGridEh1.SumList.Active:=True;DBGridEh1.FooterRowCount:=1;DBGridEh1.Columns0.Footers.add;DBGridEh1.Columns0.Footers0.ValueType:=fvtStaticText;DBGridEh1.Columns0.Footers0.Value:=合计;DBGridEh1.Columns3.Footers.add;DBGridEh1.Columns3.Footers0.ValueType:=fvtSum; /求平均fvtavgDBGridEh1.Columns3.Footers0.FieldName:=quantity; /列名Combobox(OnChang事件) 赋值with adoquery1 dobegin Close; SQL.Text:=select * from products; Open; while not Eof do begin combobox1.Items.Add(trim(FieldByName(productname).AsString); Next; end;end;或者adoquery1.Close;adoquery1.SQL.Text:=select * from products;adoquery1.Open;while not adoquery1.Eof dobegincombobox1.Items.Add(trim(adoquery1.FieldByName(productname).AsString);adoquery1.Next;end;从文件中读取ComboBox1.Items.LoadFromFile();取值(OnChange事件)edit1.Text:=combobox1.Text; /当前行行数Combobox1.Items.Count直接调用某行(循环用)edit1.Text:=combobox1.Itemsi ; /某行显示某行ComboBox1.ItemIndex:=0;AfterScrollfor i := 0 to Combobox1.Items.Count - 1 dobegin if combobox1.Itemsi=ADOTable1.FieldByName(类别名称).AsString then break;end;ComboBox1.ItemIndex:=i;DBLookupComboBox赋值(设置listsourse不是DateSource,能与Grid联动,CloseUp事件)赋值(aq,at)adoquery1.Close;adoquery1.SQL.Text:= select * from products;adoquery1.Open;/DBLookupComboBox1.ListField:=productid;productname;/显示名DBLookupComboBox1.KeyField:=productname;/关键字,这句一定要有DBLookupComboBox1.KeyValue:=adoquery1.FieldByName(productname).AsString;取值Edit1.Text:=DBLookupComboBox1.ListSource.DataSet.FieldByName(productname).AsString;ListBox(与Combobox类似)TreeView(OnExpended,OnChange,OnClick事件)要点当前节点的名称(用于与Grid联动) treeview1.Selected.Text;当前节点的层次,从0开始(判断层次) treeview1.Selected.Level;当前节点的父母节点的名称(判断层次) treeview1.Selected.Parent.Text;节点数TreeView1.items.Count循环取节点名称TreeView1.itemsi.Text全展开treeview1.FullExpand;第一个根节点展开treeview1.items0.Expanded:=true;树选中treeview1.SetFocus;节点选中(根节点0到子节点1) treeview1.itemsi.selected:=true;保存到文件treeview1.SaveToFile(d:123.txt);新增,编辑,删除,其它方法一:在aq的循环中xnode:=treeview1.items.AddChild(nil, FieldByName);或treeview1方法二:treeview1.LoadFromFile(d:123.txt);在大批量添加数据到Treeview中时最好使用TreeView.Items.BeginUpdate;添加节点TreeView.Items.EndUpdateTreeview.Selected.EditTextTreeview1.Selected.Delete;Z1.data:判断节点如图,一个根节点,添加子节点要赋值,change事件方法一:treeview1.Selected.Level方法二:根节点if treeview1.Selected.Text=根节点treeview1.Selected.Parent=子节点(父母节点不为空) treeview1.Selected.Parent第一层子节点if treeview1.Selected.Parent.Text=根节点第二层子节点(有父母节点但父母不是根节点) if (treeview1.Selected.Parent)and(treeview1. Selected.Parent根节点)双循环(第一层取出某一列与第二层对应)procedure TForm1.FormShow(Sender: TObject);varnode:ttreenode;t:string;begin/ adoquery1执行一句,adoquery2执行一遍 with adoquery1 do beginClose;/取类 sql.Text:=select * from productcategories where level=1; open; while not eof do beginnode:=treeview1.Items.AddChild(nil,trim(fieldbyname(productname).asstring); /记录类的productid,用于aq2的parentnodeid与其对应 t:=trim(fieldbyname(productid).asstring); with adoquery2 do begin close; sql.text:=select * from productcategories where level=2 and parentnodeid=:p1; parameters.ParamByName(p1).Value:=t; open; while not eof do begin treeview1.Items.addchild(node,fieldbyname(productname).asstring); next; end; end; Next; end; end;end;与Grid联动procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);vars:string;begin /当前节点名称s:=treeview1.Selected.Text;/在子节点的情况下执行 if treeview1.Selected.Parentnil then begin with adoquery3 do begin close; sql.text:=select * from products where productname=:p1; parameters.ParamByName(p1).Value:=s; open; end; end;end;添加图片ImageList双击添加图片,再将treeview的images设为ImageList(toolbar也适用)Data域在implementation与第一个事件之间定义结构type PNodeData = TNodeData; TNodeData = record xid:string;end;Chart(在uses中加Series)从表中取数据,可以先存到combobox里,再赋值给数组折线图Chart1.SeriesList.Clear;Chart1.Title.Caption:= 2012年销售情况;vari:integer;xline: TFastlineseries;amt:array1.3 of integer;beginChart1.Title.Caption:= 折线图; xline:=TFastLineSeries.Create(self); Chart1.AddSeries(xline); /增加线条 amt1:=10; amt2:=20; amt3:=10; /变量赋值 for i:=1 to 3 do beginxline.AddXY(x:数值,y:数值); / xline.addx(i,inttostr(i),clblack);/ X轴:数值;图例显示:字符;颜色(后两个可省) /xline.yValuei-1:=amti; /Y轴:数值。合成xline.AddXY(i,amti); end;end;直方图vari:integer;xbar: TBarseries;amt:array1.3 of real;begin Chart1.Title.Caption:= 直方图; xbar:=TBarseries.Create(self); Chart1.AddSeries(xbar); /增加bar amt1:=10; amt2:=20; amt3:=10; /变量赋值 for i:=1 to 3 do beginxbar.AddBar(amti,inttostr(i),clyellow); / AddBar(Y:数值,X:字符,颜色)end;end;饼图vari:integer;xpie: TPieseries;amt:array1.3 of integer;name:array1.3 of string;begin xpie:=TPieSeries.Create(self); Chart1.AddSeries(xpie); amt1:=10; amt2:=20; amt3:=10; name1:=a; name2:=b; name3:=c; for i := 1 to 3 dobeginxpie.AddPie(amti,namei); / xpie.AddPie(内层:数值, 外层:字符) end;end;DBEdit(设置DateSource,DateField:=列名)DBText(设置DateSource,DateField:=列名)ToolBar(将showcaptions设置成true,右键添加按钮,修改按钮名称)DBNavigator(设置DateSource,VisibleButton设置按钮个数)TimerInterval 间隔毫秒 OnTimer 每间隔一定时间执行一次ImagePicture 选择图片 image1.Picture.LoadFromFile(路径); Stretch 自动缩放 image1.Stretch:=true;Cursor 小手图标MediaPlayerMediaplayer1.Close;Mediaplayer1.FileName:=opendialog1.FileName;Mediaplayer1.Open;Mediaplayer1.Play;OpenDialog opendialog1.Execute;a:=opendialog1.FileName;ProgressBarprogressbar1.Max:=273;/和端口数量一致progressbar1.Position:=0;progressbar1.Step :=1;progressbar1.StepIt;progressbar1.StepBy(1);StringGridStringGrid1.RowCountStringGrid1.ColCountStringGrid1.CellsStringGrid1.Cells列,行MemoMemo1.Lines.LoadFromFile(d:123.txt);MainMenu(标题栏及下拉栏,其单击事件要在mm中双击)DateTimePicker(日期)ImageList(TreeView,ToolBar)ToolBar和ImageList用多个,避免黏在一起;设置ImageList的height和width(图片的高和宽),避免图片过小Splitter(分隔线)Align设为bottom在设为none,就可以上下移动;调整颜色案例记录追加(aq,at,ac)with adotable1 dobegin append; edit; fieldbyname(productname).asstring:=aaa; post;end;with adoquery1 dobegin close; sql.Text:=select * from tmp; open; append; edit; fieldbyname(productname).asstring:=aaa; post;end;with adocommand1 dobegin commandtext:=insert into tmp values(:p1); parameters.ParamByName(p1).Value:=aaa; execute; adotable1.Close; adotable1.Open;end;删除(用tmp,无主键约束)if application.MessageBox(输入内容,标题 , MB_YESNOCANCEL)= mrYes thenbeginAdotable1.Delete;end;过滤filter语句(aq,at),1.固定列名 if (edit1.Text) then begin adoquery1.filtered:=False; adoquery1.filter:= 列名 like %+trim(edit1.text)+%; adoquery1.filtered:=True; end else begin adoquery1.Close; adoquery1.SQL.Text:=select * from products; adoquery1.Open;adoquery1.filtered:=False; end; if (edit1.Text) then begin ADOTable1.filtered:=False; ADOTable1.filter:= 拼音码 like %+trim(edit1.text)+%; ADOTable1.filtered:=True; end else begin ADOTable1.Close; ADOTable1.TableName:=Commodities; ADOTable1.Open; ADOTable1.filtered:=False; end;2. 不固定列名 s:=; if trim(edit1.text) then begin for i:=0 to dbgrid1.columns.count do begin f:=lowercase(dbgrid1.Columnsi.FieldName); if(funitprice) and (fproductid) then begin if(s) then s:=s+ or ; s:=s+dbgrid1.Columnsi.FieldName+like%+trim(edit1.text)+%; end; end; adotable1.Filtered:=false; adotable1.filter:=s; adotable1.Filtered:=true; end;aq搜索 s:=; adoquery1.Close; if (edit1.Text) then begin for i:=0 to dbgrid1.Columns.Count - 1 do begin s1:=dbgrid1.Columnsi.FieldName+Like %+trim(edit1.text)+%; if (s) then s:=s+ or ; s:=s+(+s1+); end; adoquery1.SQL.Text:=select * from Customers where +s; end else adoquery1.SQL.Text:=select * from Customers; adoquery1.Open;刷新(aq,at)adotable1.Close;adotable1.TableName:=tmp;adotable1.Open;数据验证(DBGrid一开始是空表)Try型(赋值)Vars: string;x: real;begins:=123.45x;if not trystrtofloat(s,x) then showmessage(数据类型转换出错);endDBGrid一开始是空表,所以先建表procedure TForm1.FormShow(Sender: TObject);vari:integer;s:string;begin s:= IF OBJECT_ID(tmp) IS NOT NULL; s:=s+ DROP TABLE tmp; s:=s+ create table tmp (; s:=s+ ProductID int,; s:=s+ ProductName varchar(50),; s:=s+ QuantityPerUnit varchar(20),; s:=s+ Quantity int,UnitPrice decimal(10,2),Amount decimal(10,2),; s:=s+ sysid int identity primary key ); ADOCommand1.CommandText:=s; ADOCommand1.Execute; ADOCommand1.CommandText:=insert into tmp default values; for i:=1 to 10 do ADOCommand1.Execute; adotable1.Close; adotable1.TableName:=tmp; adotable1.Open;end;只能输字母(KeyPress事件或定义char类型变量,将值赋给它)if (not (key in a.z,A.Z) then ShowMessage(只能输入字母);只能输数字procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);begin if dbgrid1.SelectedIndex=0 then begin if not (Key in 0.9,.,#8,#13) then /退格;tab begin Key := #0; ShowMessage(只能输入数字); end; end;end;只能输时间(2012-12)定义date1:TDateTime;if (trystrtodate(Edit1.Text+-01,date1)=false) then ShowMessage(只能输入时间);DBGrid符合要求自动填充其他列/ FormShow事件中,需在private加入procedure pTestProductID(Sender: TField; const Text: String);adotable1.FieldByName(productid).OnSetText:=pTestProductID;/主函数procedure TForm1.pTestProductID(Sender: TField; const Text: String);vars:string;begin /获得ProductID输入的值 s:=text; with adoquery1 do begin close; sql.clear; sql.Text:=select * from Products where ProductID=:p1; parameters.ParamByName(p1).Value:=s; open; if recordcount=0 then begin showmessage(产品编码输入错误!); abort; /取消原输入的值,abort必须放在最后 end else begin /qty和unitprice的onsettext和激活,否则会死循环 adotable1.FieldByName(ProductID).OnSetText:=nil; tfield(sender).Text:=s; adotable1.edit;/如果产品编码合法,则将产品名称、规格型号、计量单位填充到dbgrid1中去 adotable1.FieldByName(ProductName).AsString:=adoquery1.fieldbyname(productname).asstring; adotable1.FieldByName(QuantityPerUnit).AsString:=adoquery1.fieldbyname(QuantityPerUnit).asstring; adotable1.post; end; /恢复onsettext的设置,这是必须的 adotable1.FieldByName(ProductID).OnSetText:=pTestProductID; end;end;设置第一列为下拉式菜单columns0.buttonstyle:=cbsAuto;(默认)/新建表,DateSource连Table,用aq添加数据,一开始是空表 s:= IF OBJECT_ID(tmp) IS NOT NULL; s:=s+ DROP TABLE tmp; s:=s+ create table tmp (; s:=s+ ProductID int,; s:=s+ ProductName varchar(50),; s:=s+ QuantityPerUnit varchar(20),; s:=s+ Quantity int,UnitPrice decimal(10,2),Amount decimal(10,2),; s:=s+ sysid int identity primary key ); ADOCommand1.CommandText:=s; ADOCommand1.Execute;adotable1.Close; adotable1.TableName:=tmp; adotable1.Open; dbgrid1.Columns1.Title.Caption:=产品名称; dbgrid1.columns1.FieldName:=productname; with ADOQuery1 do begin close; sql.text:=select * from Products; open; while not eof do begin dbgrid1.Columns1.PickList.Add(trim(fieldbyname(ProductName).asstring); Next; end; end;设置第一列为小按钮columns0.buttonstyle:=cbsEllipsis;同上,并在Grid中使用OnEditButtonClick事件,在form2中定义全局变量传值,form2的DateSource连aq,用aq的值赋给form1的at,如form2 Form.a:=adoquery1.FieldByName(ProductID).AsString;form1ADOTable1.Edit;ADOTable1FieldByName(ProductID).AsString:=form2.a;ADOTable1.Post;联动,将Grid的当前单元格赋给Edit(同小按钮,在aq,at的AfterScroll事件或Grid的CellClick事件)edit1.Text:=adoquery1.FieldByName(ProductID).AsString;Grid之间的联动Grid2,DataSource2 Adotable2连好 adotable2.MasterSource:=datasource1;adotable2.MasterFields:=CustomerID;/随之变动而变动的值,两表共有按回车跳列跳行KeyDown,KeyPress # ,箭头到底不能继续if key=13 then begin /将当前列先赋值给x,再在x的基础上加,SelectedIndex从0开始x:=DBGrid1.SelectedIndex; DBGrid1.SelectedIndex:=x+1; if x+1=DBGrid1.columns.count then begin DBGrid1.DataSource.DataSet.Next; DBGrid1.SelectedIndex:=0; end; /阻止新增行 if key=40 then /箭头向下 begin if adotable1.RecNo=adotable1.RecordCount then/是否是最后一条 abort; /取消原来的操作 end; end;按回车,箭头在控件间切换KeyPress,按回车或箭头在控件间切换SetFocueEdit-Tab Order由上至下设置循序,这样按Tab键就可以切换光标了如果还想用Enter键代替Tab键(不是很推荐)窗口的KeyPreView设为True在窗口的OnKeyPress事件里加入 if key=#13 then /如果按Enter键 begin key:=#0; /不处理按Enter键 Perform(WM_NEXTDLGCTL, 0, 0); /发送一个消息跳到下一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论