




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理风险与患者安全管理
- 人教版数学六年级下册全优达标训练之解决问题(试题)
- 2025年江苏省徐州市丰县中学高三3月第一次模拟考试数学试题文试题含解析
- 福建省三明市永安市重点中学2024-2025学年初三化学试题下学期4月模拟训练试题(二)含解析
- 浙江工商职业技术学院《中国文化概要》2023-2024学年第一学期期末试卷
- 广西民族大学相思湖学院《城市滨水景观规划设计》2023-2024学年第一学期期末试卷
- 东阳市2025年小升初复习数学模拟试卷含解析
- 2025年黑龙江省齐齐哈尔市物理试题高考冲刺卷(七)含解析
- 株洲师范高等专科学校《多媒体出版》2023-2024学年第二学期期末试卷
- 安徽省定远县2024-2025学年初三一模(期末)英语试题含答案
- 社会心理学(西安交通大学)智慧树知到期末考试答案2024年
- 行政管理学#-形考任务4-国开(ZJ)-参考资料
- 2024中国餐饮加盟行业白皮书-ccfax美团-202404
- 2024年山东省济南市莱芜区中考一模语文试卷
- 用工审批单(模板)
- 极光大数据:王者荣耀研究报告
- 【基于层次分析法的极兔快递配送网点选址的案例分析10000字(论文)】
- 古诗词诵读《客至》高二语文课件(统编版选择性必修下册)
- 【我国“独角兽”企业的发展问题及优化建议分析-以字节跳动为例16000字(论文)】
- 高压氧治疗注意事项及操作规范指南
- 《老年护理》教学教案
评论
0/150
提交评论