个人一点学习笔记,与大家分享,不免其中有所疏漏,请包涵。另求职深圳地区delphi +sql ERP 相关工作,有意向的与本人联系
本人姓名:信书华 手机:13286201258
非诚勿扰,谢谢合作。。1 delphi數據庫開發組件:數據集組件,數據訪問組件,數據感知組件;2 常用數據訪問接口:BDE和ADO;3 單元名必須與單元文件保持一致;4 Type 可以聲明類﹑過程﹑函數﹑類型等;5 流程控制: 記住一點,分號代表結束;6 簡單數據類型:(整型﹑字符型﹑布爾型﹑枚舉型﹑子界型):有序類型實型7 #9 Tab鍵 #10 換行 #13 回車 #8 退格 #0 為空(不作任何操作);8 定義在實現部分的變量﹑類型﹑常量 只能在單元內部使用,定義在實現部分的過程或函數在接口部分沒有聲明,則只能在單元內部使用;9 通過Query組件的AfterScroll事件可以實現主從表;10 BOM:MIS:API:11 利用SQL查詢時間時,上下午時間換算成24小時制;12 過程和函數的區別: 是否有返回值;13 位圖按鈕 的Kind 屬性 Tabcontrol 的control屬性 Showhint :是否顯示提示14 異常處理: Try except end 發生異常時執行 Try Finally end 一定執行;15 日期的相減是按天計算的,不同類型進行賦值是會沒提示(可以判斷類型錯誤),使用Params存放參數的值;16 組裝SQL語句是分段的,從第一個分號開始;17 BDE中用Tdatabase 控件去掉注冊對話框:數據庫---Tdatebase---Tdataset---TdataSource---TdataControl18 Delphi中能過當前記錄,對數據庫進行操作;19 同一個項目中不同單元的引用,可能在接口部分,也可以在實現部分(實現兩個單元的相互引用);20 多個項目EXE文件的調用:可能用WinExec(‘路徑’,’SW_SHOW’);21 創建數據模型DataModules最好在主窗體之前創建;22 fieldbyname() parambyname() 的使用,注意他們的對象;23 系統函數POS(‘’,’’):BOOL 判斷第二個參數是否包含第一個參數24 Form1.modalresult 可能用來設計登陸窗口;setfocus 的使用;25 ShellAPI函數: shell_notifyicona(用來設計最小化托盤圖標)26 Recordcount 的使用;27 打開數據庫的連接不能在FormCreate中會出錯;28 在一個的數據集中使用 fieldbyname() parambyname() 時應使用變量傳遞字段值;29 VCL中消息通常以CM_開頭;30 SQL操作時 不返回結果的操作用EXECSQL,返回結果的操作用OPEN;31 函數先聲明﹐再實現﹐后調用;32 通過FORM 的Align屬性改變內部控件的 顯示狀態;33 SQL的模糊 查詢 包括了 精確查詢;34 存儲過程的Param是從1開始的,參數不要忘帶上@;35 作系統要有一個統一的開頭標識: 窗體名以:Frm 單元名以:Ut36 使用Tquery.delete方法﹐要先把Query1.requestlive設為True;應在屬性面板上設;(缺點:在SQL中有ORDER BY 會提示出錯)37 權限的設置應在登陸窗口關閉前進行設置;38 級聯菜單:create submenu;39 trunc函數 是把實型轉換為 integer40 DecodeDate(Tdate,word,word,word)把日期拆開;DecodeTime(Ttime,word,word,word,word,word);把時間拆開;41 query 也可以執行存儲過程 Queryq.sql.add(‘exec wis_admin.tmp :a,:b’)42 對INI文件的讀寫﹕ var filename: string; myini : TiniFile; Begin Myini := TiniFile.create(‘路徑’); Myini.writestring(‘小結’,’關鍵字’,’默認值’); Myini.readstring(‘小結’.’關鍵字’.’默認值’); End; 43 SQL中聚合函數 select count(1) Select sum(1) 二者的區別﹕sql中聚合函數除count()不會忽略空值﹐其他聚合 函數會忽略空值44 SQL中 union的使用 union all不去重復,having 子句是用來對Group by 的結果進行篩選﹔45 CryStal Report 的調用和設計﹕‘打印設置圖標’﹕Crpe1.windowButtonBar.Printsetupbtn:=true; Crpe1.reportname:=’報表路徑’﹔ Crpe1.execute; Crpe1.windowstate:= ; (設置報表打開時的狀態) 水晶報表中的字段會自動延伸(同理加入一條線或一個圖標也會隨記錄延伸)46 sql 中dateadd(‘datepart’,’number’,’date’) 從指定的日期中加或減去一個時間 datepart(‘datepart’,’date’) 返回日期時間的單獨部分47 delphi中使用DLL 1﹑新建DLL框架 2﹑新建單元 3﹑聲明函數﹑過程 Stdcall 4﹑實現函數﹑過程 5﹑exports 中包含函數(在工程文件中,多個函數用逗號隔開) 6﹑編譯 DLL文件的靜態調用: External function add10(number:integer):integer;stdcall;external'MyFirstDll.dll'; 在調用的單元中的Interface 部分加入(use 子句下面) Function add10(number:integer):integer;stdcall;external ‘myfirstdll.dll’ DLL文件必須和EXE文件在一個目錄下;48﹑randomrange()的使用 必須引用Math單元; SDK軟件開發工具包;49、delphi 多個exe文件之間 傳遞參數,可通過消息機制實現; 注意:(傳遞的參數不能賦給一個變量(不知道為什麼),可以賦給一個Edit1.text) project1:
constUM_MESSAGE_COMMUNICATE = WM_USER + 100;procedure TForm1.Button1Click(Sender: TObject);var cDataParam: TCopyDataStruct; msg: string; hApp: HWND;begin hApp := FindWindow('TForm2', nil); msg := 'Hello World'; if hApp <> 0 then begin cDataParam.dwData := UM_MESSAGE_COMMUNICATE; cDataParam.cbData := length(msg)* sizeof(char) + 1; cDataParam.lpData := @msg[1]; SendMessage(hApp, WM_COPYDATA, 0, LPARAM(@cDataParam)); end; project2:const UM_MESSAGE_COMMUNICATE = WM_USER + 100; public { Public declarations } procedure WMCopyData(var msg: TWMCopyData);message WM_COPYDATA; procedure TForm2.WMCopyData(var msg: TWMCopyData);begin if msg.CopyDataStruct^.dwData = UM_MESSAGE_COMMUNICATE then begin Edit1.Text := string(msg.CopyDataStruct^.lpData); end; emd;50、delphi 中 獲取EXE可執行文件的路徑的函數: ExtractFilePath(Application.exename); 獲取的路徑後面有個“\”; GetCurrentDir(); 獲取的路徑後面沒有“\”;51、delphi 中 Pchar類型與 string 類型(忘記在哪用了):string轉換為Pchar: var mystr: string=’abc’; mypch:pchar; 可以用: edit1.text:=pchar(mystr); char 字符類類型隻佔一個字節不能 與 string 類型轉換52、 delphi的字符截取函数LeftStr, MidStr, RightStr这几个函数都包含在StrUtils中,所以需要uses StrUtils; 假设字符串是 Dstr := ’Delphi is the BEST’, 那么 LeftStr(Dstr, 5) := ’Delph’ MidStr(Dstr, 6, 7) := ’i is th’ (第一個參數代表截取的開始位置,第二個參數代表截取長度) RightStr(Dstr, 6) := ’e BEST’ 53、 SQL中substring(str,x,y): 由<str>中的第x位置开始,选出接下去的y个字符。
54、 Delphi edit控件的 CharCase屬性 可以設置鍵盤輸入的大小寫;55、 存儲過程中遊標的使用步驟:
create procedure myproc
begin
declare @ptno varchar(7)
declare @partno varchar(25)
declare @unit varchar(5)
declare @balqty numeric(15,4)
declare @adjust1698 cursor
set @adjust1698=cursor for
select ptno,partno,unit,sum(iq)-sum(oq) as balqtyfrom wis_admin.wsfgbal_test group by ptno,partno,unit having sum(iq)-sum(oq)<0 and ptno='PT-1698' order by ptno descopen @adjust1698
fetch next from @adjust1698 into @ptno,@partno,@unit,@balqty(讀取遊標中的第一條數據)
while (@@fetch_status=0) (表示遊標值返回成功)
begin
insert into wis_admin.wsfgbal_testvalues(@ptno,'A','A',@partno,'02/25/2011','N/A','06/10/2011','N/A','N/A',0,@unit,-@balqty,0,'xsh調整','Y')
fetch next from @adjust1698 into @ptno,@partno,@unit,@balqty (讀取遊標中其他的數據)end
close @adjust1698
deallocate @adjust1698
end56、 SQL中 使用Set DateFormat mdy 的使用;
57、 SQL中 表自身連接的使用(用來找不同單位零件問題)並去除重復列: select a.*,b.* from wis_admin.psitem a join wis_admin.psitem b on a.partno=b.partno where a.unit!=b.unit and a.tlno like '%2011%' and b.tlno like '%2011%' and a.unit<b.unit
58、SQL中Case when then end 的使用;
59、個人心得:在軟件維護中使用存儲過程和遊標很使用(在系統周期自動運行的存儲過程中);
60、Crystal Report 中Group,排序, 控件的使用61、創建本地Paradox表的方法(利用本地表和Crystal Report 報表 進行報表設計) fileexists()函數的使用 fdeletefile()函數的使用 var table1 : TTable;begin if not fileexists('c:\wisdb\WSDMItem1.DB') then begin table1 := TTable.Create(self); // 在客戶機創建數據表 try table1.Active := False; table1.TableName := 'c:\wisdb\WSDMItem1.DB'; table1.TableType:=ttParadox; table1.FieldDefs.Clear; table1.FieldDefs.Add('DMNo',ftString,12,False); table1.FieldDefs.Add('partno',ftfloat,0,False); table1.FieldDefs.Add('partno',ftinteger,0,False); table1.CreateTable; finally table1.Free; end; end;end;
63、存儲過程 調用,若存儲過程內外名字不一致 則是按存儲過程 外面的名字查找調用的,而不是按存儲過程內部定義的名字查找的。64、存儲過程 Set nocount on\off的使用,表示 不返回 \ 返回存儲過程 所影響的 行。65、存儲過程中 參數接受的是值。
66、水晶報表字段自動換行,字段格式屬性,COMMON選項,勾選Can Grow。67、水晶報表抑制 特定格式字段 的顯示,字段格式屬性,COMMON選項,勾選Suppress 編輯公式 進行設定。用delphi 創建的本地表字段長度與第一次插入數據時字段有關。68、 SQL中 Create table tablename delete from tablenamedrop table tablenameTable 關鍵字 隻在 更改表的結構中使用69、SQL中盡量避免遊標的使用,用面向集合的操作 代替 面向記錄的操作 可以非常有效的提高程序的運行速度。70、經測試左連接 和 右連接 左表和右表 位置換下 查詢出的結果一樣,全連接用關鍵字Full : select * from a full join b on a.id=b.id 交叉連接用關鍵字Cross : select * from a cross join b 統計數據用臨時表 很方便 臨時表定義一個 字符串類型 可以從 實際表中插入整形數據。同理 臨時表定義一個整形 也可以從實際表中插入 數字字符。71、靜態方法的調用, 對象聲明為 哪種類型,調用哪個類的靜態方法; 動態方法的調用, 對象的實際類型(不是聲明類型,而是構造產生出的類型)決定了哪個實現被調用, 也就是 誰創建誰調用。 方法隱藏,調用採用 靜態調用方式(戀情reintroduce關鍵字去掉警告) 方法的重載,同一個方法具有不同的參數,用OverLoad進行重載。72、delphi 中 Tstream 類的 使用 來讀取 磁盤文件(TFileStream)、內存(TMemoryStream)、數據庫二進制(TBlobStream)中的內容 Var MyStream:Tstream; MyStream:=Tstream.create(‘文件名加後綴名’,fmopenread); Memo1.lines.loadfromstream(MyStream);73、delphi 中 DBGrid 中縱顯示不同狀態圖表: DBGrid.DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState) DataCol代表列碼 if (Column.FieldName ='aa') then begin DBGrideh1.Canvas.FillRect(Rect); if (adoquery1.FieldByName('aa').Value='1') then ImageList1.Draw(DBGrideh1.Canvas,Rect.Left+ ((DBGrideh1.Columns[1].Width) div 2 -5) ,Rect.Top,0,True); if (adoquery1.FieldByName('aa').Value='2') then ImageList1.Draw(DBGrideh1.Canvas,Rect.Left+ ((DBGrideh1.Columns[1].Width) div 2 -5) ,Rect.Top,1,True); end else dbgrideh1.DefaultDrawColumnCell(rect,datacol,column,state);
本人姓名:信书华 手机:13286201258
非诚勿扰,谢谢合作。。1 delphi數據庫開發組件:數據集組件,數據訪問組件,數據感知組件;2 常用數據訪問接口:BDE和ADO;3 單元名必須與單元文件保持一致;4 Type 可以聲明類﹑過程﹑函數﹑類型等;5 流程控制: 記住一點,分號代表結束;6 簡單數據類型:(整型﹑字符型﹑布爾型﹑枚舉型﹑子界型):有序類型實型7 #9 Tab鍵 #10 換行 #13 回車 #8 退格 #0 為空(不作任何操作);8 定義在實現部分的變量﹑類型﹑常量 只能在單元內部使用,定義在實現部分的過程或函數在接口部分沒有聲明,則只能在單元內部使用;9 通過Query組件的AfterScroll事件可以實現主從表;10 BOM:MIS:API:11 利用SQL查詢時間時,上下午時間換算成24小時制;12 過程和函數的區別: 是否有返回值;13 位圖按鈕 的Kind 屬性 Tabcontrol 的control屬性 Showhint :是否顯示提示14 異常處理: Try except end 發生異常時執行 Try Finally end 一定執行;15 日期的相減是按天計算的,不同類型進行賦值是會沒提示(可以判斷類型錯誤),使用Params存放參數的值;16 組裝SQL語句是分段的,從第一個分號開始;17 BDE中用Tdatabase 控件去掉注冊對話框:數據庫---Tdatebase---Tdataset---TdataSource---TdataControl18 Delphi中能過當前記錄,對數據庫進行操作;19 同一個項目中不同單元的引用,可能在接口部分,也可以在實現部分(實現兩個單元的相互引用);20 多個項目EXE文件的調用:可能用WinExec(‘路徑’,’SW_SHOW’);21 創建數據模型DataModules最好在主窗體之前創建;22 fieldbyname() parambyname() 的使用,注意他們的對象;23 系統函數POS(‘’,’’):BOOL 判斷第二個參數是否包含第一個參數24 Form1.modalresult 可能用來設計登陸窗口;setfocus 的使用;25 ShellAPI函數: shell_notifyicona(用來設計最小化托盤圖標)26 Recordcount 的使用;27 打開數據庫的連接不能在FormCreate中會出錯;28 在一個的數據集中使用 fieldbyname() parambyname() 時應使用變量傳遞字段值;29 VCL中消息通常以CM_開頭;30 SQL操作時 不返回結果的操作用EXECSQL,返回結果的操作用OPEN;31 函數先聲明﹐再實現﹐后調用;32 通過FORM 的Align屬性改變內部控件的 顯示狀態;33 SQL的模糊 查詢 包括了 精確查詢;34 存儲過程的Param是從1開始的,參數不要忘帶上@;35 作系統要有一個統一的開頭標識: 窗體名以:Frm 單元名以:Ut36 使用Tquery.delete方法﹐要先把Query1.requestlive設為True;應在屬性面板上設;(缺點:在SQL中有ORDER BY 會提示出錯)37 權限的設置應在登陸窗口關閉前進行設置;38 級聯菜單:create submenu;39 trunc函數 是把實型轉換為 integer40 DecodeDate(Tdate,word,word,word)把日期拆開;DecodeTime(Ttime,word,word,word,word,word);把時間拆開;41 query 也可以執行存儲過程 Queryq.sql.add(‘exec wis_admin.tmp :a,:b’)42 對INI文件的讀寫﹕ var filename: string; myini : TiniFile; Begin Myini := TiniFile.create(‘路徑’); Myini.writestring(‘小結’,’關鍵字’,’默認值’); Myini.readstring(‘小結’.’關鍵字’.’默認值’); End; 43 SQL中聚合函數 select count(1) Select sum(1) 二者的區別﹕sql中聚合函數除count()不會忽略空值﹐其他聚合 函數會忽略空值44 SQL中 union的使用 union all不去重復,having 子句是用來對Group by 的結果進行篩選﹔45 CryStal Report 的調用和設計﹕‘打印設置圖標’﹕Crpe1.windowButtonBar.Printsetupbtn:=true; Crpe1.reportname:=’報表路徑’﹔ Crpe1.execute; Crpe1.windowstate:= ; (設置報表打開時的狀態) 水晶報表中的字段會自動延伸(同理加入一條線或一個圖標也會隨記錄延伸)46 sql 中dateadd(‘datepart’,’number’,’date’) 從指定的日期中加或減去一個時間 datepart(‘datepart’,’date’) 返回日期時間的單獨部分47 delphi中使用DLL 1﹑新建DLL框架 2﹑新建單元 3﹑聲明函數﹑過程 Stdcall 4﹑實現函數﹑過程 5﹑exports 中包含函數(在工程文件中,多個函數用逗號隔開) 6﹑編譯 DLL文件的靜態調用: External function add10(number:integer):integer;stdcall;external'MyFirstDll.dll'; 在調用的單元中的Interface 部分加入(use 子句下面) Function add10(number:integer):integer;stdcall;external ‘myfirstdll.dll’ DLL文件必須和EXE文件在一個目錄下;48﹑randomrange()的使用 必須引用Math單元; SDK軟件開發工具包;49、delphi 多個exe文件之間 傳遞參數,可通過消息機制實現; 注意:(傳遞的參數不能賦給一個變量(不知道為什麼),可以賦給一個Edit1.text) project1:
constUM_MESSAGE_COMMUNICATE = WM_USER + 100;procedure TForm1.Button1Click(Sender: TObject);var cDataParam: TCopyDataStruct; msg: string; hApp: HWND;begin hApp := FindWindow('TForm2', nil); msg := 'Hello World'; if hApp <> 0 then begin cDataParam.dwData := UM_MESSAGE_COMMUNICATE; cDataParam.cbData := length(msg)* sizeof(char) + 1; cDataParam.lpData := @msg[1]; SendMessage(hApp, WM_COPYDATA, 0, LPARAM(@cDataParam)); end; project2:const UM_MESSAGE_COMMUNICATE = WM_USER + 100; public { Public declarations } procedure WMCopyData(var msg: TWMCopyData);message WM_COPYDATA; procedure TForm2.WMCopyData(var msg: TWMCopyData);begin if msg.CopyDataStruct^.dwData = UM_MESSAGE_COMMUNICATE then begin Edit1.Text := string(msg.CopyDataStruct^.lpData); end; emd;50、delphi 中 獲取EXE可執行文件的路徑的函數: ExtractFilePath(Application.exename); 獲取的路徑後面有個“\”; GetCurrentDir(); 獲取的路徑後面沒有“\”;51、delphi 中 Pchar類型與 string 類型(忘記在哪用了):string轉換為Pchar: var mystr: string=’abc’; mypch:pchar; 可以用: edit1.text:=pchar(mystr); char 字符類類型隻佔一個字節不能 與 string 類型轉換52、 delphi的字符截取函数LeftStr, MidStr, RightStr这几个函数都包含在StrUtils中,所以需要uses StrUtils; 假设字符串是 Dstr := ’Delphi is the BEST’, 那么 LeftStr(Dstr, 5) := ’Delph’ MidStr(Dstr, 6, 7) := ’i is th’ (第一個參數代表截取的開始位置,第二個參數代表截取長度) RightStr(Dstr, 6) := ’e BEST’ 53、 SQL中substring(str,x,y): 由<str>中的第x位置开始,选出接下去的y个字符。
54、 Delphi edit控件的 CharCase屬性 可以設置鍵盤輸入的大小寫;55、 存儲過程中遊標的使用步驟:
create procedure myproc
begin
declare @ptno varchar(7)
declare @partno varchar(25)
declare @unit varchar(5)
declare @balqty numeric(15,4)
declare @adjust1698 cursor
set @adjust1698=cursor for
select ptno,partno,unit,sum(iq)-sum(oq) as balqtyfrom wis_admin.wsfgbal_test group by ptno,partno,unit having sum(iq)-sum(oq)<0 and ptno='PT-1698' order by ptno descopen @adjust1698
fetch next from @adjust1698 into @ptno,@partno,@unit,@balqty(讀取遊標中的第一條數據)
while (@@fetch_status=0) (表示遊標值返回成功)
begin
insert into wis_admin.wsfgbal_testvalues(@ptno,'A','A',@partno,'02/25/2011','N/A','06/10/2011','N/A','N/A',0,@unit,-@balqty,0,'xsh調整','Y')
fetch next from @adjust1698 into @ptno,@partno,@unit,@balqty (讀取遊標中其他的數據)end
close @adjust1698
deallocate @adjust1698
end56、 SQL中 使用Set DateFormat mdy 的使用;
57、 SQL中 表自身連接的使用(用來找不同單位零件問題)並去除重復列: select a.*,b.* from wis_admin.psitem a join wis_admin.psitem b on a.partno=b.partno where a.unit!=b.unit and a.tlno like '%2011%' and b.tlno like '%2011%' and a.unit<b.unit
58、SQL中Case when then end 的使用;
59、個人心得:在軟件維護中使用存儲過程和遊標很使用(在系統周期自動運行的存儲過程中);
60、Crystal Report 中Group,排序, 控件的使用61、創建本地Paradox表的方法(利用本地表和Crystal Report 報表 進行報表設計) fileexists()函數的使用 fdeletefile()函數的使用 var table1 : TTable;begin if not fileexists('c:\wisdb\WSDMItem1.DB') then begin table1 := TTable.Create(self); // 在客戶機創建數據表 try table1.Active := False; table1.TableName := 'c:\wisdb\WSDMItem1.DB'; table1.TableType:=ttParadox; table1.FieldDefs.Clear; table1.FieldDefs.Add('DMNo',ftString,12,False); table1.FieldDefs.Add('partno',ftfloat,0,False); table1.FieldDefs.Add('partno',ftinteger,0,False); table1.CreateTable; finally table1.Free; end; end;end;
63、存儲過程 調用,若存儲過程內外名字不一致 則是按存儲過程 外面的名字查找調用的,而不是按存儲過程內部定義的名字查找的。64、存儲過程 Set nocount on\off的使用,表示 不返回 \ 返回存儲過程 所影響的 行。65、存儲過程中 參數接受的是值。
66、水晶報表字段自動換行,字段格式屬性,COMMON選項,勾選Can Grow。67、水晶報表抑制 特定格式字段 的顯示,字段格式屬性,COMMON選項,勾選Suppress 編輯公式 進行設定。用delphi 創建的本地表字段長度與第一次插入數據時字段有關。68、 SQL中 Create table tablename delete from tablenamedrop table tablenameTable 關鍵字 隻在 更改表的結構中使用69、SQL中盡量避免遊標的使用,用面向集合的操作 代替 面向記錄的操作 可以非常有效的提高程序的運行速度。70、經測試左連接 和 右連接 左表和右表 位置換下 查詢出的結果一樣,全連接用關鍵字Full : select * from a full join b on a.id=b.id 交叉連接用關鍵字Cross : select * from a cross join b 統計數據用臨時表 很方便 臨時表定義一個 字符串類型 可以從 實際表中插入整形數據。同理 臨時表定義一個整形 也可以從實際表中插入 數字字符。71、靜態方法的調用, 對象聲明為 哪種類型,調用哪個類的靜態方法; 動態方法的調用, 對象的實際類型(不是聲明類型,而是構造產生出的類型)決定了哪個實現被調用, 也就是 誰創建誰調用。 方法隱藏,調用採用 靜態調用方式(戀情reintroduce關鍵字去掉警告) 方法的重載,同一個方法具有不同的參數,用OverLoad進行重載。72、delphi 中 Tstream 類的 使用 來讀取 磁盤文件(TFileStream)、內存(TMemoryStream)、數據庫二進制(TBlobStream)中的內容 Var MyStream:Tstream; MyStream:=Tstream.create(‘文件名加後綴名’,fmopenread); Memo1.lines.loadfromstream(MyStream);73、delphi 中 DBGrid 中縱顯示不同狀態圖表: DBGrid.DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState) DataCol代表列碼 if (Column.FieldName ='aa') then begin DBGrideh1.Canvas.FillRect(Rect); if (adoquery1.FieldByName('aa').Value='1') then ImageList1.Draw(DBGrideh1.Canvas,Rect.Left+ ((DBGrideh1.Columns[1].Width) div 2 -5) ,Rect.Top,0,True); if (adoquery1.FieldByName('aa').Value='2') then ImageList1.Draw(DBGrideh1.Canvas,Rect.Left+ ((DBGrideh1.Columns[1].Width) div 2 -5) ,Rect.Top,1,True); end else dbgrideh1.DefaultDrawColumnCell(rect,datacol,column,state);
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货