个人一点学习笔记,与大家分享,不免其中有所疏漏,请包涵。另求职深圳地区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);