DELPHI开发经验心得_第1页
DELPHI开发经验心得_第2页
DELPHI开发经验心得_第3页
DELPHI开发经验心得_第4页
DELPHI开发经验心得_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

本文格式为Word版,下载可任意编辑——DELPHI开发经验心得必要函數:

functionCreateObject:TObject;exportsCreateObject;functionDestroyObject:Boolean;exportsDestroyObject;

functionCreateObject:TObject;begin

Frm_BMS_JSW_SetRpFieldIn:=

TFrm_BMS_JSW_SetRpFieldIn.Create(Application);Frm_BMS_JSW_SetRpFieldInB:=

TFrm_BMS_JSW_SetRpFieldInB.Create(Application);dm_BMS_JSW_SetRpFieldIn:=

Tdm_BMS_JSW_SetRpFieldIn.Create(Application);Result:=Frm_BMS_JSW_SetRpFieldIn;end;

functionDestroyObject:Boolean;begin

Frm_BMS_JSW_SetRpFieldIn.Free;Frm_BMS_JSW_SetRpFieldInB.Free;dm_BMS_JSW_SetRpFieldIn.Free;

Result:=True;end;

必要的公用單元:

comUser

procedurelc_TempTable_Drop();procedurelc_TempTable_Create();

//建立臨時表方法

procedureTdm_BMS_JSW_SetRpFieldIn.lc_TempTable_Create;Var

Sql_Text:String;Begin

lc_TempTable_Drop;Try

Sql_Text:='';

adc_temp.CommandText:=Sql_Text;

adc_temp.Execute;Except

OnE:ExceptionDoBegin

showinfo('建立臨時表出錯,錯誤原因:'+E.Message);exit;End;End;End;

//刪除臨時表方法

procedureTdm_BMS_JSW_SetRpFieldIn.lc_TempTable_Drop;Var

Sql_Text:String;BeginTry

Sql_Text:='IFOBJECT_ID(''TEMPDB.DBO.#TEMP_BMS_JSW_FE_FIELD'')ISNOTNULL'

+'DROPTABLE#TEMP_BMS_JSW_FE_FIELD';adc_temp.CommandText:=Sql_Text;

adc_temp.Execute;Except

OnE:ExceptionDoBegin

showinfo('刪除臨時表出錯,錯誤原因:'+E.Message);exit;End;End;End;

//網格定位

procedureTdm_BMS_JSW_SetRpFieldIn.lc_procSetFocus;Var

vRecNo:Integer;Begin

vRecNo:=ads_jsw_fe_RpSet.RecNo;IfvRecNo=vRecNoThenBegin

ads_jsw_fe_RpSet.RecNo:=vRecNo;EndElseBegin

ads_jsw_fe_RpSet.RecNo:=vRecNo;End;

vRecNo:=ads_jsw_fe_Field.RecNo;IfvRecNo=vRecNoThenBegin

ads_jsw_fe_Field.RecNo:=vRecNo;EndElseBegin

ads_jsw_fe_Field.RecNo:=vRecNo;End;End;

給dbgrid設置默認值:

在dbgrid.datasource.dataset的onNewRecord事件中,給要設置的字段添加默認值就可以.例子:

procedureTdm_IdNoData.ads_idNoDataNewRecord(DataSet:TDataSet);begin

dataset.fieldbyname('INT_FACT').value:=0;

dataset.fieldbyname('ID_VALID').value:=1;

end;

根據dbgrid單元下拉菜單選擇后觸發事件:

方法一:使用lookupdata,例子:常宏ERP系統--ID卡定義(下拉菜單)//該方法也用于制作dbgrid單元下拉菜單可以在onsettext,ongettext,onchang設置觸發事件

方法二:使用dbgrid.datasource.dataset的onCalcFields事件例子:

functionlc_funcGetcontrolname(i_zubei_seq:Integer):string;

procedureTFrm_IdNoData.ads_idNoDataCalcFields(DataSet:TDataSet);var

i:integer;

begin

ifdataset.FieldByName('ZUBEI_SEQ').IsNullthenexit;i:=dataset.FieldByName('ZUBEI_SEQ').asinteger;

dataset.FieldByName('AAAA').asstring:=lc_funcGetcontrolname(i);end;

functionTFrm_IdNoData.lc_funcGetcontrolname(i_zubei_seq:Integer):string;begin

withads_tempdobeginclose;

commandtext:='SELECTCONTROL_NAMEFROMINF_CONTROL_ZUBEIy'+'JOININF_GROUP_CONTROLxONx.CONTROL_SEQ=y.CONTROL_SEQ'+'WHEREY.ZUBEI_SEQ='+inttostr(i_zubei_seq);Open;

result:=Fields[0].asstring;end;end;

制作dbgrid單元下拉菜單,也可以使用lookupdata的方法來制作下拉菜單withads_tempdobegin

ifdbg_ass_workgroup.SelectedIndex=2thenbeginClose;

str_sql:='select''[''+REPLACE(class_code,'''','''')+'']''+REPLACE(class_name,'''','''')asgroup_type'+'fromchd_code'+'whereparam_id=4'+'orderby1';commandtext:=str_sql;Open;

dbg_ass_workgroup.Columns[2].PickList.Clear;whilenotEofdobegin

dbg_ass_workgroup.Columns[2].PickList.Add(FieldbyName('group_type').AsString);next;end;end;end;

DBGRID新增記錄時,位數不夠,補零,也可以使用10000000000+s的方法,然后從其次位開始截取10位

在lookupdata的onsettext事件里設置

procedureTFrm_IdNoData.ads_idNoDataID_NOSetText(Sender:TField;constText:String);var

s:string;begin

iftext=''thenexit;s:=text;

caselength(s)of0..9:begin

s:=copy('0000000000',1,10-length(s))+s;sender.Value:=s;end;

10:sender.Value:=s;else

begin

messagebox(0,'ID長度不能大於10!','提醒',0);abort;end;end;

end;

遍歷dbgrid數據集中是否存在重復記錄(定位法)var

mylist:Tstringlist;

mylist:=Tstringlist.Create;ads_idNoData.First;

whilenotads_idNoData.Eofdobegin

ifmylist.IndexOf(ads_idNoData.fieldbyname('ID_NO').asstring)=-1then//該值只能為-1或者非-1

mylist.Add(ads_idNoData.fieldbyname('ID_NO').asstring)elsebegin

result:=4;break;end;

ads_idNoData.Next;end;

該過程用于控制dbgrid里面的Enter鍵輸入

procedureTFrm_IdNoData.DBGrid1KeyDown(Sender:TObject;varKey:Word;Shift:TShiftState);

begin

ifkey=13thenbegin

if(senderasTdbgrid).SelectedIndex=(senderasTdbgrid).Columns.Count-1then

begin

if(senderasTdbgrid).DataSource.DataSet.Eofthenbegin

(senderasTdbgrid).DataSource.DataSet.First;(senderasTdbgrid).SelectedIndex:=0;endelsebegin(senderasTdbgrid).DataSource.DataSet.next;(senderasTdbgrid).SelectedIndex:=0;end;endelse

(senderasTdbgrid).SelectedIndex:=(senderasTdbgrid).SelectedIndex+1;end;

end;

控制鍵盤的輸入

//限制第一個欄位的鍵盤輸入ifDBGrid1.SelectedIndex=0thenbegin

ifnot(Keyin['0'..'9',#8,#13])thenKey:=#0;end;

//限制其次個欄位的鍵盤輸入ifDBGrid1.SelectedIndex=1thenbegin

Key:=#0;end;

//限制第五個欄位的鍵盤輸入ifDBGrid1.SelectedIndex=4thenbegin

ifnot(Keyin['0','1',#8,#13])thenKey:=#0;

end;

Navigator刪除提醒框:

ifMessageBox(Handle,'該刪除動作會連同其下的關鍵控制點一同刪除,確定要刪除?','提醒',MB_YESNOorMB_ICONQUESTION=ID_NOthenAbortelsebegin

dm_CollectDevicedata.lc_procNavigatoraction;

dm_CollectDevicedata.ads_INF_COLLECT_SET.Delete;Abort;end;

兩個dbgrid,根據dbgrid1的數據來查找dbgrid2里的數據

做法:在dbgrid1的AfterScroll事件里面,根據某個字段來過濾dbgrid2里面的數據

例子:

//數據採集器編號數據集的滾動事件2023-11-1cjradd

procedureTdm_BMS_JSW_SetRpFieldIn.ads_jsw_fe_RpSetAfterScroll(DataSet:TDataSet);Var

Col_Seq:Integer;begin

Col_Seq:=ads_jsw_fe_RpSet.fieldbyname('rp_seq').AsInteger;ads_jsw_fe_Field.Filtered:=False;

ads_jsw_fe_Field.Filter:='rp_seq='+IntToStr(Col_Seq);ads_jsw_fe_Field.Filtered:=True;end;

新增DBGRID記錄時,假使dbgrid2的某個字段的值來源於dbgrid1,則可以這樣賦值:

例子:

procedureTdm_CollectDevicedata.ads_INF_COLLECT_DTLNewRecord(DataSet:TDataSet);begin

dataset.FieldByName('COL_SEQ').value:=ads_INF_COLLECT_SET.fieldbyname('COL_SEQ').asinteger;end;

sql語句:用于檢查數據表中是否存在重復記錄例子:

//檢查一致數據採集器編號下是否存在一致的關鍵控制點str_sql:='SELECTcol_seq,control_seq'

+'FROM#Temp_INF_COLLECT_DTL'+'GROUPBYcol_seq,control_seq'+'HAVINGCOUNT(*)>1';ads_temp.Close;

ads_temp.CommandText:=str_sql;ads_temp.Open;

ifads_temp.RecordCount>0thenbegin

result:=6;

exit;end;

制作遞增字段的過程:例子:

functionTdm_CollectDevicedata.lc_funcGetseqnobytype(i_type:integer):integer;begin

withads_tempdobegin

close;

commandtext:='SELECTMAX(SEQ_NO)ASSEQ_NOFROMINF_CONTROL'+'WHEREI_TYPE='+inttostr(i_type);Open;ifeofthenresult:=1else

result:=Fields[0].asinteger+1;

ifresult=1thenbegin

adc_temp.CommandText:='INSERTINTOINF_CONTROLVALUES('+inttostr(i_type)+','

+inttostr(result)+')';adc_temp.Execute;endelsebegin

adc_temp.CommandText:='UPDATEINF_CONTROLSETSEQ_NO='+inttostr(result)

+'WHEREI_TYPE='+inttostr(i_type);adc_temp.Execute;end;

end;end;

//設置默認值2023-11-1cjradd

procedureTdm_CollectDevicedata.ads_INF_COLLECT_SETNewRecord(DataSet:TDataSet);begin

dataset.FieldByName('int_fact').Value:=0;

ads_INF_COLLECT_SET.FieldByName('COL_SEQ').value:=lc_funcGetseqnobytype(50);//這里進行遞增

end;

假使要在臨時表中插入一個字段,用於區分數據,可以使用自增字段

SEQINTNOTNULLIDENTITY

假使要去掉兩個表中一致的記錄,可以用EXCEPT,但前提是兩個表必須有一致的字段例子:

SELECT*FROMAAAEXCEPT

SELECT*FROMBBB

得到的結果是:去掉AAA里面BBB的記錄后,剩下的AAA里面的記錄.

Delphi控制導出Excel文檔的所有列寬,字體樣式例子:

App.ActiveSheet.Cells.Font.Name:='標楷體';App.ActiveSheet.Cells.Font.Size:=12;App.ActiveSheet.Cells.ColumnWidth:=15;

App.ActiveSheet.Cells.ColumnWidth:=15;

如何在quickreport的頁腳對每一頁進行合計

可以添加一個PageFootBand在上面,在Band上参与QrExpr控件并把QrExpr的ResetAfterPrint設置為True

假使是多層報表打印小計與合計,則可以利用QRGroup,設置QRGroup的Expression的值,該值就是用來區分小計與合計的值

quickreport實現每頁一個小計,一個累計,緊隨最终一條記錄:做法:

在PageFooterBand中放兩個QRExpr,上下擺放,

增加一個SummaryBand,SummaryBand中放兩個QRLabel,位置和

PageFooterBand

中的兩個QRExpr一致,然后在SummaryBand的BeforePrint事件中寫上:PageFooterBand.Enabled:=False;//記得將屬性設置為True,不然下次打印就不出來了

QRLabel1.Caption:=FloatToStr(QRExpr1.Value.dblResult);QRLabel2.Caption:=FloatToStr(QRExpr2.Value.dblResult);

動態為ComboBox添加下拉菜單:例子:

//添加進度狀態下拉菜單2023-7-20cjr

dtp_prog_statedesc.Items.Clear;

dtp_prog_statedesc.Items.Add('ALL');

str_sql:='selectprog_statedescfromdbo.pss_progStateorderbyprog_stateasc';withads_prog_statedobeginClose;

CommandText:=str_sql;Open;

whilenoteofdobegin

dtp_prog_statedesc.Items.Add(Fields[0].AsString);Next;end;Close;

end;

ifdtp_prog_statedesc.Items.Count>0thendtp_prog_statedesc.ItemIndex:=0;

設置按Enter鍵焦點進入到下一個控件1.form的KeyPreview屬性設置為true2.在form的onKeydown或者onKeyPress事件里面添加以下代碼:Ifkey=13Then

self.Perform(WM_NEXTDLGCTL,0,0);

QuickReport打印報表時強制換頁:例子:

ifnotdm_SAL_MidLastInspSumRp.qry_rep.EofthenRep.NewPage;注意:數據集必須已經orderby

db2里面為數據表新增字段例子:

ALTERTABLEGSFAB.FAB_STKINADDIN_STATECHAR(1)

ADDSEND_PERSONVARCHAR(20)ADDSEND_TIMETIMESTAMPADDCHECK_DEPTVARCHAR(20)ADDCHECK_PERSONVARCHAR(20)ADDCHECK_TIMETIMESTAMP

點擊dbgrid的標題欄,對結果集進行排序//連接的是bde/query例子:

procedureTfrm_Fab_AdvFabCodeIn.DBGrid1TitleClick(Column:TColumn);var

x:integer;

TheField:string;begin

x:=column.Index+1;

TheField:=qry_Temp.Fields[x].FieldName;

qry_Temp.Close;

qry_Temp.SQL.Clear;

qry_Temp.SQL.Text:='select*fromGSFAB.FAB_FCODEorderby'+TheField;qry_Temp.Open;

end;

//單擊dBGRID的標題進行排序

procedureTFrm_BMS_JSW_SetRpFieldInB.dbg_jsw_fe_basic_columnTitleClick(Column:TColumn);

begin

Withdm_BMS_JSW_SetRpFieldInDoBegin

IfNotads_bms_jsw_fe_basic_column.ActiveThenexit;Ifads_bms_jsw_fe_basic_column.IndexFieldNames=Column.Field.FieldNameThen

ads_bms_jsw_fe_basic_column.IndexFieldNames:=Column.Field.FieldName+'DESC'Else

ads_bms_jsw_fe_basic_column.IndexFieldNames:=Column.Field.FieldName;End;end;

DB2創建數據表例子:

createtableGSSAL.SAL_INFERIOR

(

GROUP_SEQSMALLINTnotnull,SALE_COMPCHAR(10)notnull,ITEMCHAR(20)notnull,LOG_IDSMALLINTnotnull,TRN_DATEDATEnotnull,TRN_QTYINTEGERWITHDEFAULT0,

TIME_STAMPTIMESTAMPdefaultcurrentTIMESTAMP,

constraintPK_SAL_INFERIORprimarykey

(GROUP_SEQ,SALE_COMP,ITEM,LOG_ID,TRN_DATE))

inUSERSPACE1

indexinUSERSPACE1

longinUSERSPACE1

createtableGSSAL.SAL_SALEQTY(

GROUP_SEQSMALLINTnotnull,SALE_COMPCHAR(10)notnull,ITEMCHAR(20)notnull,LOG_IDSMALLINTnotnull,SALE_DATEDATEnotnull,SALE_QTYINTEGERWITHDEFAULT0,

TIME_STAMPTIMESTAMPdefaultcurrentTIMESTAMP,constraintPK_SAL_SALEQTYprimarykey

(GROUP_SEQ,SALE_COMP,ITEM,LOG_ID,SALE_DATE))

inUSERSPACE1

indexinUSERSPACE1

longinUSERSPACE1

DecodeDate、DecodeTime...DecodeDateTime...分解時間方法SysUtils.DecodeDate();

SysUtils.DecodeDateFully();SysUtils.DecodeTime();

DateUtils.DecodeDateTime();

DateUtils.DecodeDateDay();DateUtils.DecodeDateWeek();

DateUtils.DecodeDateMonthWeek();DateUtils.DecodeDayOfWeekInMonth();

unitUnit1;

interface

uses

Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;

type

TForm1=class(TForm)

procedureFormCreate(Sender:TObject);end;var

Form1:TForm1;

implementation

{$R*.dfm}

usesDateUtils;

procedureTForm1.FormCreate(Sender:TObject);var

t:TDateTime;

Year,Month,Day,Week:Word;Hour,Min,Sec,MSec:Word;begin

t:=EncodeDateTime(2023,5,21,11,22,33,999);

DecodeDate(t,Year,Month,Day);

ShowMessageFmt('%d,%d,%d',[Year,Month,Day]);//2023,5,21

DecodeDateFully(t,Year,Month,Day,Week);

ShowMessageFmt('%d,%d,%d,%d',[Year,Month,Day,Week]);//2023,5,21,5;最终的5表示周四

DecodeTime(t,Hour,Min,Sec,MSec);

ShowMessageFmt('%d,%d,%d,%d',[Hour,Min,Sec,MSec]);//11,22,33,999

DecodeDateTime(t,Year,Month,Day,Hour,Min,Sec,MSec);

SELECTROUND(1.56),ROUND(1.56,1),ROUND(12.34,-2)FROMdual;

導出excel,假使是圖形字符串,則需要轉換例子:

CAST(C.UNIT_CADDR||C.UNIT_CADDR2||C.UNIT_CADDR3||C.UNIT_CADDR4ASVARCHAR(254))ASDETAILDDR

POS和ANSIPOS的主要作用在于,POS可以多用于是一個字符,而ANSIPOS多用于是多個字符

例如:i:=pos('a','sssssas');

i:=ansipos('abc','sdabcss');

AnsiPos是以Ansi字符做為Pos單位,例如AnsiPos('|','王韡|')得到的值是5

Pos是以字符作為Pos單位,例如Pos('|','王韡|')得到的值是4,因“韡〞是由兩個字組成,而其低位是“|〞所以Pos后的結果為4

另外AnsiPos和Pos都可以Pos多字符目標,例如:AnsiPos('Abs','123Abs78')=4AnsiPos('Abs','123A5678')=0

Pos('Abs','123Abs78')=4Pos('Abs','123A5678')=0

Sleep()函數:

作用:程序暫停若干時間,單位是毫秒.例如:

Sleep(500);

就是到這里停半秒,然后繼續向下運行.

用結果集定位:例子:

withqryCOLORdobeginclose;

SQL.Clear;

SQL.Add('SELECTCOLOR_NO,MAX(COLOR_ENG_NAME)COLOR_NAME');

SQL.Add('FROMGSINF.INF_PNASS_DTLC');SQL.Add('WHEREPO_NO=:P_PO');SQL.Add('GROUPBYCOLOR_NO');

Parambyname('P_PO').asstring:=s_po;open;end;if

qrycolor.Locate('COLOR_NO',qryDETAIL.FieldByName('COLOR_NO').asstring,[])then

col:=qrycolor.FieldByName('COLOR_NAME').asstringelse

col:='';

如何得到checklistbox中選項的值例子:

checklistbox1.Items.Strings[i];

選中選項:例子:

checklistbox1.checked[i]:=True;

//雙擊DBGRID選擇

procedureTFrm_BMS_JSW_SetRpFieldInB.dbg_jsw_fe_basic_columnDblClick(Sender:TObject);begin

Ifdbg_jsw_fe_basic_column.SelectedIndex=0ThenBegin

Withdm_BMS_JSW_SetRpFieldIn.ads_bms_jsw_fe_basic_columnDoBeginEdit;

If(Trim(FieldByName('COLUMN_FLAG').AsString)='N')Or(Trim(FieldByName('COLUMN_FLAG').AsString)='n')ThenBegin

FieldByName('COLUMN_FLAG').AsString:='Y';EndElseBegin

FieldByName('COLUMN_FLAG').AsString:='N';

End;Post;End;End;end;

特别符號可以插入物理表,SQL語句使用參數插入,可以解決這個問題

給DBGRID填寫記錄時,不一定要指定DBGRID的明細字段,只要給DBGRID的數據源賦值,DBGRID會自動顯示數據源中所有的字段.

ExtractFileDir:根据參數內容(絕對文件名)獲取該文件所在的路徑(不含最终面的那個斜杠)

getcurrentdir:獲取當前路徑,但是注意,此項值在調用OPENDIALOG或者SAVEDIALOG之后會被動態改變.

delphi里的當前路徑是什么意思:是指EXE可執行文件所在路徑

ExtractFilePath(ParamStr(0))表示什么路徑:表示該可執行文件所在路徑(完整路徑)

delphi中當前路徑的上一層,怎么表示:請參照以下函數//以下代碼純手工輸入,在DELPHI7下測試通過//在USES里增加引用如下單元:StrUtilsfunctiongetParentDirectory:String;

var

cPath:String;begin

cPath:=ExtractFilePath(ParamStr(0));ifRightStr(cPath,1)='\\'thenbegin

cPath:=LeftStr(cPath,Length(cPath)-1);end;

whileRightStr(cPath,1)'\\'do

begin

cPath:=LeftStr(cPath,Length(cPath)-1);end;

Result:=cPath;

end;

Delphi中messagedlg标签:Delphi

ifMessageDlg('WelcometomyDelphiapplication.Exitnow?',mtConfirmation,[mbYes,mbNo],0)=mrYesthenbegin

Close;end;

IfMessageDlg('確定進行章節回收?',mtConfirmation,[mbYes,mbNo],1)mrYESThenBeginExit;End;

MessageDlg用法

对话框类型:

mtwarning——含有慨叹号的警告对话框mterror——含有红色叉符号的错误对话框

mtinformation——含有蓝色i符号的信息对话框mtconfirmation——含有绿色问号的确认对话框

mtcustom——不含图标的一般对话框,对话框的标题是程序的名称

按钮组中的按钮:mbYes——mrYes或6mbNo——mrNo或7mbOk——mrOk或1

mbCancel——mrCancel或2mbHelp——help按钮

mbAbort——mrAbort或3mbRetry——mrRetry或4mbIgnore——mrIgnore或5mbAll——mrAll或8mbNoToAll——9

mbYesToAll——10

procedureTForm1.Button1Click(Sender:TObject);var

S:string;begin

ifMessageDlg('提醒框',mtInformation,[mbok,mbyes],0)=mryesthen

messagebeep(MB_ICONEXCLAMATION);end;

TMsgDlgType=(mtWarning,mtError,mtInformation,mtConfirmation,mtCustom);

TMsgDlgBtn=(mbYes,mbNo,mbOK,mbCancel,mbAbort,mbRetry,mbIgnore,mbAll,mbNoToAll,mbYesToAll,mbHelp);

const

mrNone=0;mrOk=idOk;mrCancel=idCancel;mrAbort=idAbort;mrRetry=idRetry;mrIgnore=idIgnore;mrYes=idYes;mrNo=idNo;mrAll=mrNo+1;mrNoToAll=mrAll+1;

mrYesToAll=mrNoToAll+1;

MessageDlg()信息的汉化

Delphi中的常量都放在consts.pas中,修改它可以达到汉化的目的.如:MessageDlg()显示的窗口标题及其中的

按钮标题都是英文,虽然不影响使用,但在一个中文软件中总显得有些不协调.为此在consts.pas中查找以下内容:\把

SMsgDlgWarning='Warning';SMsgDlgError='Error';

SMsgDlgInformation='Information';SMsgDlgConfirm='Confirm';SMsgDlgYes='SMsgDlgNo='SMsgDlgOK='OK';

SMsgDlgCancel='Cancel';

SMsgDlgHelp='

SMsgDlgHelpNone='Nohelpavailable';SMsgDlgHelpHelp='Help';SMsgDlgAbort='SMsgDlgRetry='SMsgDlgIgnore='SMsgDlgAll='

SMsgDlgNoToAll='NSMsgDlgYesToAll='Yesto改成

SMsgDlgWarning='警告';SMsgDlgError='错误';

SMsgDlgInformation='提醒';SMsgDlgConfirm='确认';SMsgDlgYes='是(SMsgDlgNo='不(

SMsgDlgOK='确定';SMsgDlgCancel='取消';SMsgDlgHelp='帮助(

SMsgDlgHelpNone='没有该帮助信息';SMsgDlgHelpHelp='帮助';SMsgDlgAbort='放弃(SMsgDlgRetry='重试(SMsgDlgIgnore='忽略(

SMsgDlgAll='全部(

SMsgDlgNoToAll='全都不(SMsgDlgYesToAll='全都是(

然后重新编译Consts.pas,把Consts.duc

拷到delphi的lib和slib子目录下,就一劳永逸啦!

封掉DBGRID的按向下鍵或者按TAB鍵不新增記錄:

procedureTFrm_PPS_De_AccIn.dbg_GS_ROLEKeyDown(Sender:TObject;varKey:Word;Shift:TShiftState);begin

If(KeyIn[VK_DOWN,VK_TAB])

And(dbg_GS_ROLE.DataSource.DataSet.recno=dbg_GS_ROLE.DataSource.DataSet.recordcount)Then

dbg_GS_ROLE.Options:=dbg_GS_ROLE.Options-[dgEditing]Else

dbg_GS_ROLE.Options:=dbg_GS_ROLE.Options+[dgEditing];end;

Delphi計算兩個日期之間相隔的天數:

使用DaysBetween()函數,需要引用單元:DateUtils

格式化數字之千分位+小數

FormatFloat('#,##0.00',StrToFloat(Value));Sql語句行轉列

例子:

WITHAAAAS(

SELECTSUBSTRING(F41,1,4)ASYEA_ID,SUBSTRING(F41,6,2)ASMON_ID,ISNULL(COUNT(PROJ_ID),0)ASPROJ_COUNT,ISNULL(SUM(ISNULL(F13,0)),0)ASPROJ_PRICEFROMBMS_V_JSW_FE_BASIC_DATAWHEREF41''

GROUPBYSUBSTRING(F41,1,4),SUBSTRING(F41,6,2))

SELECTYEA_ID

,ISNULL(MAX(CASEWHENMON_ID='01'THENPROJ_COUNTEND),0)ASMON1PROJ_COUNT

,ISNULL(MAX(CASEWHENMON_ID='01'THENPROJ_PRICEEND),0)ASMON1PROJ_PRICE

,ISNULL(MAX(CASEWHENMON_ID='02'THENPROJ_COUNTEND),0)ASMON2PROJ_COUNT

,ISNULL(MAX(CASEWHENMON_ID='02'THENPROJ_PRICEEND),0)ASMON2PROJ_PRICE

,ISNULL(MAX(CASEWHENMON_ID='03'THENPROJ_COUNTEND),0)ASMON3PROJ_COUNT

,ISNULL(MAX(CASEWHENMON_ID='03'THENPROJ_PRICEEND),0)ASMON3PROJ_PRICE

,ISNULL(MAX(CASEWHENMON_ID='04'THENPROJ_COUNTEND),0)ASMON4PROJ_COUNT

,ISNULL(MAX(CASEWHENMON_ID='04'THENPROJ_PRICEEND),0)ASMON4PROJ_PRICE

,ISNULL(MAX(CASEWHENMON_ID='05'THENPROJ_COUNTEND),0)ASMON5PROJ_COUNT

,ISNULL(MAX(CASEWHENMON_ID='05'THENPROJ_PRICEEND),0)ASMON5PROJ_PRICE

,ISNULL(MAX(CASEWHENMON_ID='06'THENPROJ_COUNTEND),0)ASMON6PROJ_COUNT

,ISNULL(MAX(CASEWHENMON_ID='06'THENPROJ_PRICEEND),0)ASMON6PROJ_PRICE

,ISNULL(MAX(CASEWHENMON_ID='07'THENPROJ_COUNTEND),0)ASMON7PROJ_COUNT

,ISNULL(MAX(CASEWHENMON_ID='07'THENPROJ_PRICEEND),0)ASMON7PROJ_PRICE

,ISNULL(MAX(CASEWHENMON_ID='08'THENPROJ_COUNTEND),0)ASMON8PROJ_COUNT

,ISNULL(MAX(CASEWHENMON_ID='08'THENPROJ_PRICEEND),0)ASMON8PROJ_PRICE

,ISNULL(MAX(CASEWHENMON_ID='09'THENPROJ_COUNTEND),0)ASMON9PROJ_COUNT

,ISNULL(MAX(CASEWHENMON_ID='09'THENPROJ_PRICEEND),0)ASMON9PROJ_PRICE

,ISNULL(MAX(CASEWHENMON_ID='10'THENPROJ_COUNTEND),0)ASMON10PROJ_COUNT

,ISNULL(MAX(CASEWHENMON_ID='10'THENPROJ_PRICEEND),0)ASMON10PROJ_PRICE

,ISNULL(MAX(CASEWHENMON_ID='11'THENPROJ_COUNTEND),0)ASMON11PROJ_COUNT

,ISNULL(MAX(CASEWHENMON_ID='11'THENPROJ_PRICEEND),0)

温馨提示

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

最新文档

评论

0/150

提交评论