2002.07.211,在单元中访问DPR文件:菜单栏Project-View Source。
RaiseLastWin32Error。2,WinExec替代函数 CreateProcess
BOOL CreateProcess(
    LPCTSTR lpApplicationName, // pointer to name of executable module
    LPTSTR lpCommandLine, // pointer to command line string
    LPSECURITY_ATTRIBUTES lpProcessAttributes, // pointer to process security attributes
    LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes
    BOOL bInheritHandles, // handle inheritance flag
    DWORD dwCreationFlags, // creation flags
    LPVOID lpEnvironment, // pointer to new environment block
    LPCTSTR lpCurrentDirectory, // pointer to current directory name
    LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO
    LPPROCESS_INFORMATION lpProcessInformation  // pointer to PROCESS_INFORMATION
   );
-----------------------------------------------------------------------
参数 类型及说明
lpApplicationName String,要执行的应用程序的名字。可设为vbNullString;在这种情况下,应用程序的名字应在lpCommandLine参数的起始处出现lpCommandLine String,要执行的命令行。可用GetCommandLine函数取得一个进程使用的命令行。Windows会尽可能地根据下述搜索顺序来查找执行文件:
  (1)包含了父进程执行文件的目录
  (2)父进程当前的目录
  (3)由GetSystemDirectory返回的系统目录
  (4)仅适于windows NT:16位系统目录
  (5)由GetWindowDirectory返回的Windows目录
  (6)由PATH环境变量指定的目录lpProcessAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值)——表示采用不允许继承的默认描述符。该参数定义了进程的安全特性lpThreadAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值)——表示采用不允许继承的默认描述符。该参数定义了进程之主线程的安全特性bInheritHandles Long,TRUE表示允许当前进程中的所有句柄都由新建的子进程继承dwCreationFlags Long,来自API32.TXT文件的一个或多个下述常数之一,它们都带有前缀CREATE_。
CREATE_SEPARATE_WOW_VDM(仅适用于NT) 启动一个16位的Windows应用程序时,强迫它在自己的内存空间运行
CREATE_SHARED_WOW_VDM(仅适用于NT) 启动一个16位的Windows应用程序时,强迫它在共享的16位虚拟机(VM)内运行
CREATE_SUSPENDED 立即挂起新进程。除非调用了ResumeThread函数函数,否则它不会恢复运行
也可能是下述常数之一,用于指定优先级
IDLE_PRIORITY_CLASS 新进程应该有非常低的优先级——只有在系统空闲的时候才能运行。基本值是4
HIGH_PRIORITY_CLASS 新进程有非常高的优先级,它优先于大多数应用程序。基本值是13。注意尽量避免采用这个优先级
NORMAL_PRIORITY_CLASS 标准优先级。如进程位于前台,则基本值是9;如在后台,则优先值是7lpEnvironment Any,指向一个环境块的指针(环境缓冲区的头一个字符,或者环境块的地址)lpCurrentDriectory String,新进程的当前目录路径。调用函数的时候,可用vbNullString指定当前目录lpStartupInfo STARTUPINFO,指定一个STARTUPINFO结构,其中包含了创建进程时使用的附加信息lpProcessInformation PROCESS_INFORMATION,该结构用于容纳新进程的进程和线程标识符。大多数情况下,一旦这个函数返回,父应用程序都会关闭两个句柄。
-----------------------------------------------------------------------
例:
var
  H: HWND;
  PI: TProcessInformation;
  SI: TStartupInfo;
begin
  FillChar(SI, SizeOf(SI), 0);
  SI.cb := SizeOf(SI);
  if CreateProcess(nil, 'Notepad', nil, nil, false, 0, nil, nil, SI, PI) then
  begin
    WaitForInputIdle(PI.hProcess, INFINITE);
    H := FindWindow('Notepad', '未定标题-记事本');
    if SetForeGroundWindow(H) then;
  end
  else
    raise Exception.Create('');
end;3,Delphi提供了直接在Delphi程序中链接由其他编译器生成的OBJ文件的功能。可以通过$LINK 或$L将一个目标文件链接入你的Pascal程序中。如下:
{$L filename.obj}
在目标文件被链接后,必须对将在Pascal代码中使用的函数进行定义。使用external指示字可以指示编译器应该等到链接时再找函数名。
procedure foo; external;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
2002.07.291,触发 ADO 连接串编辑器:
uses ADOconEd;ADOConnection1.Close;
if EditConnectionString(ADOConnection1) then
begin
  ADOConnection1.GetTableNames(ComboBox1.Items, False);{不显示预定义的系统数据表}
  {ADOConnection1.GetTableNames(ComboBox1.Items, True);取得所有数据表名}
end;2,建立索引:
Create Index IndexName On TableName(IndexField1,IndexField2,..)3,编译指令
→{$J-} 型態常數唯讀
不論是{$J+}或{$J-}, 以const VarName = const value; 定義的常數(沒有加上型別宣告), 是一個真正的常數, 其他的程式不可以改變其內容。
例:
{$J+}
const i: Integer = 1;
begin
  i := 0;
end;
→{$WARNINGS ON} 編譯器警告
→{$T-} @指標型態檢查
→{$R檔案名稱} 資源檔
→{$U-} Pentium CPU浮點運算安全檢查
→{$Q-} 滿溢檢查, {$R-} 範圍檢查
→{$O+} 最佳化開關
→{$P+} 開放字串參數
→{$Z1} 最小列舉大小
→{$M 16386, 1048576} 記憶體配置大小
→{$H+} 長字串宣告
→{$L+} 區域符號資訊
→{$L檔案名稱} 連結目標檔
→{$I+}  EInOutError檢查
→{$I檔案名稱} 含入檔案
→{$IMAGEBASE檔案基礎位址}
→{$IFOPT 開關}
→{$A+} 欄位對齊
→{$APPTYPE GDI} 應用程式型態
→{$B-} 布林評估
→{$D+} 除錯資訊
→{$DEFINE條件名稱} 定義條件名稱
→{$DESCRIPTION  描述內容}
→{$X+}  擴充語法
→{$HINTS OFF}  提示訊息4,渐变颜色
{ blue to black }
procedure TCyan.FormPaint(Sender: TObject);
var
  i: word;
  c,y: real;
begin
  c := ClientHeight/256;
  y := 0;
  for i := 255 downto 0 do begin
    canvas.Brush.Color := i * $10000;
    canvas.FillRect(rect(0, round(y), ClientWidth, round(y + c)));
    y := y + c;
  end;
end;procedure TCyan.FormResize(Sender: TObject);
begin
  FormPaint;
end;5,当使用ADO在分布式多层应用系统中存取数据时,不管这个多层应用系统是MIDAS的应用程序服务器还是使用MTS/COM+技术的多层应用系统,一定要尽量使用ADO本身的功能,让MIDAS负责数据的存取和修改数据的传递,而把最后修改数据回数据库的工作交由ADO来处理。6,
→双击窗体上的ADOQuery组件(或其他如ADODataSet),在Fields编辑列表中按Ctrl+F选择数据表所有字段(或右键单击选择)按住Shift键选中所有字段,然后把它们拖动至窗体,窗体上会自动为每个字段生成一个Label和绑定控件。
→利用临时表加快查询:
select * into #temptable from table1 innerjoin table2 on table1.field=table2.field
select * from #temptable7,发布基于MicroSoft SQL Server 的应用程序时,不安装SQL Server Client的做法:
→Step1:用Install Shield Express制作安装盘时,首先从系统目录下找到下列文件:
Dbmssocn.dll    TCP/IP 支持文件
Dbmsspxn.dll    IPX 支持文件
Dbnmpntw.dll    命名管道支持文件
Ntwdblib.dll    SQLServer核心文件
然后在Fpecify Components and Files的Groups and Files中,将这几个文件添加到Program Files中去.
→Step2:修改注册表
HKEY_LOCAL_MACHINE\HKEY_LOCAL_MACHINE\SoftWare\MicroSoft\MSSQLServer\Client\ConnectTo 修改其键值为服务器别名。8,Windows启动时运行程序:修改注册表键值:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run。9,数据表的快速更新(适用于一次更新大量数据)
例:
if cdsMaster.ChangeCount > 0 then
  begin
    try
      cdsMaster.DisableControls;//大量更新数据时提高更新速度
      DataSource1.DataSet := nil;//同上
      cdsMaster.ApplyUpdates(0);
      cdsMaster.Refresh;
    finally
      cdsMaster.EnableControls;
      DataSource1.DataSet := cdsMaster;
    end;
  end;
  if cdsDetail.ChangeCount > 0 then
  begin
    try
      cdsDetail.DisableControls;
      DataSource2.DataSet := nil;
      cdsDetail.ApplyUpdates(0);
    finally
      cdsDetail.EnableControls;
      DataSource2.DataSet := cdsDetail;
    end;
  end;
注:cds开头的即ClientDataSet组件。

解决方案 »

  1.   

    10,TBlobField和字段类型
    在VCL中有一个封装了BLOB字段的TField派生对象-TBlobField,TBlobField
    有一个TBlob Type类型的属性Blob Type,该属性用于表明保存于BLOB字段的数据类型。在DB单元中,TBlob Type的声明如下:
    TBlobType = ftBlob..ftOraClob字段类型数据类型
    ftBlob 无类型的或用户定义的数据类型
    ftMemo 文本类型
    ftGraphicWindows位图类型
    ftFmtMemoParadox的格式化备注类型
    ftParadoxOleParadox OLE对象类型
    ftDBase OLE DBASE OLE 对象类型
    ftTyped Binary 已存在类型的原始数据表示类型
    ftCursor. . ftDataset 不是合法的BLOB类型
    ftOraBlob Oracle 8表中的BLOB字段
    ftOraClob Oracle 8表中的CLOB字段11,创建快捷方式到桌面:
    uses ComObj;
    procedure TCyan.MMCreateShortCutClick(Sender: TObject);
    var
      s1,s2: string;
      procedure CreateShortcut( sName,sPath:string);
      var
        objShortcut, objShell: variant;
        strDesk: string;
      begin
        objShell := CreateOleObject('Wscript.Shell');
        strDesk := objShell.SpecialFolders.Item('Desktop');
        objShortcut := objShell.CreateShortcut(strDesk  + '\' + sName + '.lnk');
        objShortcut.Targetpath := sPath;
        objShortcut.Save;
        objShell := UnAssigned;
        objShortcut := UnAssigned;
      end;
    begin
      if OpenDialog1.Execute then
      begin
        s1 := OpenDialog1.FileName;
        s2 := GetFileName(s1);
        s2 := Copy(s2, 0, Pos('.', s2) - 1);
        CreateShortcut(S2, s1);
      end;
    end;{此处可用ExtractFileName()函数替换;}
    function TCyan.GetFileName(var sFilePath: string): string;
    var
      i: integer;
      s: string;
    begin
      i := Pos('\', sFilePath) + 1;
      s := Copy(sFilePath, i, Length(sFilePath));
      while Pos('\', s) <> 0 do
        s := GetFileName(s);
      result := s;
    end;12,读写Ini文件
    uses IniFiles;const sPath: PChar = 'C:\Cyan.ini';begin
      MyIni := TIniFile.Create(sPath);
      try
        MyIni.WriteString('trc', 'Line1', 'cyan');//写,如不存在则创建文件
        Edit1.Text := MyIni.ReadString('trc', 'Line1', '');//读
      finally
        MyIni.Free;
      end;
    end;13,改变PageControl控件TabSheet标题栏颜色:
    →1)设置PageControl的OwnerDraw属性为True;
    →2)在PageControl的OnDrawTab事件中添加:
    var
      yText: string;
      yPoint: TPoint;
    begin
      with (Control as TPageControl).Canvas do
      begin
        Brush.Color := clred;//TabSheet的颜色
        FillRect(Rect);
        yText := TPageControl(Control).Pages[TabIndex].Caption;
        with Control.Canvas do
        begin
          yPoint.x := (Rect.Right - Rect.Left) div 2 - TextWidth(yText) div 2;//因设置PageControl的OwnerDraw属性为True时TabSheet的标题也必须重画,
    //如可以确认其坐标位置,此处可直接用TextOut()函数
          yPoint.y := (Rect.Bottom - Rect.Top) div 2 - TextHeight(yText) div 2;
          TextRect(Rect, Rect.Left + yPoint.x, Rect.Top + yPoint.y, yText);
        end;
      end;
    end;14,SELECT_SQL语句的语法:
    SELECT [ALL|DISTINCT] [TOP nExpr[PERCENT]]
    [Alias.]Select-Item[AS Column_Name]
    [,[Alias.]Select_Item[AS Column_Name]...]
    FROM [FORCE]
    [DatabaseName] Table [[AS] Local_Alias]
    [[INNER|LEFT[OUTER]|RIGHT[OUTER]|FULL[OUTER] JION
    DatabaseName] Table [[AS] Local_Alias]
    [ON JionCondition...]
    [[INTO Destination]
    |[TO FILE FileName[ADDITIVE]|TO PRINTER[PROMPT]
    |TO SCREEN]]
    [PREFERENCE PreferenceName]
    [NOCONSOLE]
    [PLAIN]
    [NOWAIT]
    [WHERE JionCondition[AND JionCondition...]
    [AND|OR FilterCondition[AND|OR FilterCondition...]]]
    [GROUP BY GroupColumn[,GroupColumn...]]
    [HavING FilterCondition]
    [UNION [ALL]SELECTCommand]
    [ORDER BY Order_Item[ASC|DESC][,Order_Item[ASC|DESC]...]]
      

  2.   

    15,√√√分布式多层应用系统√√√
    →分布
    客户端应用程序:处理图形用户界面
                   处理用户输入
                   进行简单的计算和检查
                   调用应用程序服务器提供的
    应用程序服务器:更新数据
                   执行企业法则
                   实际世界中的对象
                   进行逻辑判断
                   协调不同的对象
                   计算或提供公用服务
    →取得COM/DCOM接口
    var
      iRoot: IUnkown;
      vObj: IMyInterface;
      sName: WideString;
      vRole: IRoleInterface;
      sRole: WideString;
    begin
      iRoot := CreateComObject(PorgIDToClassID('PsampleCom.MyInterface'));
      vObj := iRoot as IMyInterface;
      vObj.GetName(sName);
      ShowMessage(sName);
      vRloe := iRoot as IRoleInterface;
      vRole.GetRole(sRole);
      ShowMessage(sRole);
    end;
    →ADO组件设置
    1),CacheSize属性 100-1000;
    2),CrusorLocation通常情况下应设为clUseClient;
    3),CurSorType几种设置执行效率差别不大;
    4),Execute Options属性:是否异步执行方式;
    5),LockType属性通常情况下应设定为ltBatchOptimistic或ltOptimistic;
    6),DataSetProvider组件的ResolveToDataSet属性为True,则由应用程序服务器端的ADO组件更新数据,Options属性的PoAllowCommand属性决定是否可以在客户端对ClientDataSet组件执行SQL命令。
    7),Master/Detail:连接Detail数据表的ClientDataSet组件的PacketRecords属性不可设为0。
    8),在客户端的OnCreate中设置DCOMConnection组件的Connected属性为True;
    9),不更新某个字段到数据表
    在服务器端DataSetProvider组件的BeforeUpdateRecord事件中添加:
    var
      I: Integer;
    begin
      for I := 0 to DeltaDS.RecordCount - 1 do
      begin
        if (pfInUpdate in DeltaDS.FieldByName('ID').ProviderFlags) then
          begin
            DeltaDS.FieldByName('ID').ProviderFlags :=
              DeltaDS.FieldByName('ID').ProviderFlags - [pfInUpdate];
          end;
      end;
    end;
    10),不要先运行应用程序服务器再设置客户端的TDCOMConnection组件的Connected属性为True,应通过其Connected属性设置自动运行应用程序服务器。
    11),远程数据模块中:View-Type Library设置添加方法、接口等,选择Register Type Library注册,客户端调用:DCOMConnection.AppServer.Method()。
    12)DBGrid.Columns[0].PickList属性 下拉选择
    重载PickList:
    procedure TForm1.ADOQ1AfterOpen(DataSet: TDataSet);
    begin
      AddPickList;
    end;procedure TForm1.AddPickList;
    var
      I: Integer;
    begin
      dbg.Columns.RebuildColumns;
      if ADOQ1.FieldCount > 3 then
      if dbg.Columns[3].Title.Caption = sTitle then
      begin
        for I := 0 to 24 do
          dbg.Columns[3].PickList.Add(sPickList[I]);
      end;
    end;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    2002.08.06
    →Midas远程调用,数据更新:
    procedure TzjFrmEdit.ApplyDelta(cds: TClientDataSet);
    var
      iErrCount: Integer;
      dspName: WideString;
      vDisp: iMainRDMDisp; { Disp Interface }
      vDelta, vOwner: OleVariant;
    begin
      //if cds.ChangeCount > 0 then
      vDelta := cds.Delta;
      vDisp := iMainRDMDisp(IDispatch(LocalDM.DCOMX.AppServer));
      dspName := cds.ProviderName;
      vDisp.AS_ApplyUpdates(dspName, vDelta, -1, iErrCount, vOwner);
    end;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━部分内容参照
    Steve Teixeira,Xavier Pacheco《Delphi5开发人员指南》
    李维《Delphi 5.X ADO_MTS_COM+高级程序设计篇》
    李维《Delphi 5.x分布式多层应用系统篇》
    《Delphi5编程实例与技巧》
    錢達智《編譯指令與說明》━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    √√√一郎认同√√√资源网站:
    www.vcl.vclxx.org
    www.id163.com
    www.shuku.net梁艳:
    →我对生命所赋予的一切,都心存感激。我能够看到,能够感知,能够自由的呼吸,还有幸从事着自己喜爱的职业,在乐趣中忘我工作,在工作中找寻快乐。
    →关于生活
      “宠辱不惊,闲看庭前花开花落;去留无意,漫随天外云卷云舒”
      在这个缺憾的世界中,就有缺憾的人生。不裹足于失败,不痛苦于失去。人生,
    不是活在别人眼中,而是活在自己心中。
    →关于爱情
      “得之,我幸;不得,我命。”
      我希望与我所爱的人,携手走过一生。不管贫穷、疾病、痛苦、灾难,只要我们
    能永远相依相伴。因为看重,所以谨慎。「 一郎 Email:[email protected] 」
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━