線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1134
推到 Plurk!
推到 Facebook!

這是什麼問題.....?

尚未結案
corey
一般會員


發表:34
回覆:44
積分:14
註冊:2003-04-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-13 14:25:58 IP:211.78.xxx.xxx 未訂閱
首先說明一下這個問題如何發生的    本人寫了一個簡單小程式,將有關DATABASE部份都包入DLL中 於程式一開始會經由DLL去CREATE DATABASE將資料導出,這方面沒問題 但是當程式關閉時就出現下面的錯誤訊息,有關DATABASE CONNECTION AND RECORESET 都有做CLOSE動作    請教各位大大這是那方面的問題     這是於DEBUG AP時出現的問題 POS一下程式,請幫幫我解決 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, ToolWin, ComObj, StrUtils, ADODB; type TForm1 = class(TForm) CoolBar1: TCoolBar; ToolBar1: TToolBar; Panel1: TPanel; ToolButton1: TToolButton; Label1: TLabel; ComboBox1: TComboBox; TreeView1: TTreeView; StatusBar1: TStatusBar; procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); procedure ToolButton1Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end; var Form1: TForm1; function StrateConnection: Boolean; far; external 'ADODll.dll' function GetRsQuery(strSql: String): _Recordset; far; external 'ADODll.dll' procedure CloseConnection; far external 'ADODll.dll' implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin if not StrateConnection then Close; end; procedure TForm1.FormShow(Sender: TObject); var DBQuery: _Recordset; begin DBQuery := GetRsQuery('Select Cp_Unit_Seq,Cp_Unit_Edit From CNGPROC Order By Cp_Unit_Seq'); ComboBox1.Clear; while not DBQuery.Eof do begin ComboBox1.Items.Add(IntToStr(DBQuery.fields['Cp_Unit_Seq'].value) + '-' + Trim(DBQuery.fields['Cp_Unit_Edit'].value)); DBQuery.MoveNext; end; DBQuery.Close; ComboBox1.ItemIndex := 0; end; procedure TForm1.ToolButton1Click(Sender: TObject); var strT: String; p, Array_Ct: Integer; DBQuery: _Recordset; begin p := Pos('-',ComboBox1.Text); with TreeView1.Items do begin if Count > 0 then TreeView1.Items[0].Delete; Add(Nil,RightStr(ComboBox1.Text,Length(ComboBox1.Text)-p)); //新增 Root 節點 strT := Copy(ComboBox1.Text,1,p-1); DBQuery := GetRsQuery('Select * From ACCFILE Where AF_Unit_Seq=' + strT + ' Order by AF_Nods'); Array_Ct := 0; While not DBQuery.Eof do begin Array_Ct := DBQuery.fields['AF_Parent_Nods'].value; AddChild(TreeView1.Items[Array_Ct],Trim(DBQuery.fields['AF_Memo'].value)); DBQuery.MoveNext; end; if Count > 1 then TreeView1.Selected := Item[1]; end; TreeView1.SetFocus; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin CloseConnection; end; end. 發表人 - corey 於 2003/11/13 14:30:51 發表人 - corey 於 2003/11/13 14:49:43
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-13 14:56:52 IP:147.8.xxx.xxx 未訂閱
Yave used string as parameters, so please use ShareMem (or other memory manger list the excellent ShareMemRep http://aiming.ynxx.com/ShareMemRep.htm)
corey
一般會員


發表:34
回覆:44
積分:14
註冊:2003-04-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-13 17:01:58 IP:211.78.xxx.xxx 未訂閱
首先謝謝 william回應 本人還是有點不懂,所有值都是經由ap傳值到dll,沒有所謂共用的情形,不知道大大所說,可否在詳述一下 POS一下dll程式,請大大們看一下 unit UnitDB; interface uses ADODB_TLB, ComObj; function StrateConnection(strConn: String): Boolean; export; function GetRsQuery(strSql: String): _Recordset; export; procedure CloseConnection; export var ADOConnection1:_Connection; DSLocal:_Recordset; implementation function StrateConnection(strConn: String): Boolean; begin Result := True; try ADOConnection1 := CreateOleObject('ADODB.Connection') as _Connection; DSLocal := CreateOleObject('ADODB.Recordset') as _Recordset; except Result := False; end; with ADOConnection1 do begin if state <> AdStateClosed then Close; if strConn <> '' then begin try Open(strConn,'','',adConnectUnspecified); except Result := False; end; end; end; end; function GetRsQuery(strSql: String): _Recordset; var Source: OleVariant; begin with DSLocal do begin if state <> AdStateClosed then Close; Source := strSql; Open(Source,ADOConnection1, AdOpenForwardOnly, AdLockReadOnly,adCmdText); end; Result := DSLocal; end; procedure CloseConnection; begin with DSLocal do begin if state = adStateOpen then Close; end; with ADOConnection1 do begin if state = adStateOpen then Close; end; end; end.
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-13 17:11:23 IP:147.8.xxx.xxx 未訂閱
The problem is string... Delphi has its own string handling. In short uses ShareMem as the FIRST unit in both your dll and the host application. Or you may change the string parameter to PChar to make the dll more compatiable with other development tools (e.g. VB/VC ).
corey
一般會員


發表:34
回覆:44
積分:14
註冊:2003-04-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-14 16:11:20 IP:211.78.xxx.xxx 未訂閱
william 大大你好 個人再寫一小程式測試後,在關閉ap程式時不會出現前述問題...? 好像不太像是string的問題呢! 我的程式如下,不知是否我個人觀念問題還是.... unit Unit1; interface uses SysUtils, Classes; //function CheckAscii(strText: PChar): Boolean; export; function CheckAscii(strText: String): Boolean; export; //function RightTOLeft(StrRight: PChar): PChar; export; function RightTOLeft(StrRight: String): PChar; export; implementation function CheckAscii(strText: String): Boolean; var s: String; i: Integer; begin Result := True; // s := StrPas(strText); s := strText; // for i := 1 to StrLen(strText) do for i := 1 to Length(strText) do begin if not (((Ord(s[i]) >= 65) and (Ord(s[i]) <= 90)) or ((Ord(s[i]) >= 48) and (Ord(s[i]) <= 57))) then Result := False; end; end; function RightTOLeft(StrRight: String): PChar; var s,p: String; i: Integer; begin // s := StrPas(StrRight); s := StrRight; p := ''; // for i:= StrLen(StrRight) downto 1 do for i:= Length(StrRight) downto 1 do begin p := p s[i]; end; Result := PChar(p); end; end. DLL程式 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Label1: TLabel; Button1: TButton; Edit2: TEdit; Button2: TButton; Label2: TLabel; procedure FormShow(Sender: TObject); procedure Edit1Exit(Sender: TObject); procedure Edit2Exit(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; function CheckAscii(strText: String): Boolean; far; external 'Project2.dll' function RightTOLeft(StrRight: String): PChar; far; external 'Project2.dll' implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); begin Edit1.Text := ''; Edit2.Text := ''; Label1.Caption := ''; Label2.Caption := ''; end; procedure TForm1.Edit1Exit(Sender: TObject); var p: PChar; begin p := PChar(Edit1.Text Char(0)); // if CheckAscii(StrUpper(p)) then if CheckAscii(UpperCase(Edit1.Text)) then Label1.Caption := 'OK'; end; procedure TForm1.Edit2Exit(Sender: TObject); var p: PChar; begin p := PChar(Edit2.Text Char(0)); // if CheckAscii(StrUpper(p)) then if CheckAscii(UpperCase(Edit2.Text)) then Label2.Caption := 'OK'; end; procedure TForm1.Button1Click(Sender: TObject); begin // Edit2.Text := StrPas(RightTOLeft(PChar(Edit1.Text Char(0)))); Edit2.Text := StrPas(RightTOLeft(Edit1.Text)); end; procedure TForm1.Button2Click(Sender: TObject); begin // Edit1.Text := StrPas(RightTOLeft(PChar(Edit2.Text Char(0)))); Edit1.Text := StrPas(RightTOLeft(Edit2.Text)); end; end.
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-14 16:53:40 IP:147.8.xxx.xxx 未訂閱
String is a problem for sure, try search online help using ShareMem.... and your use of far is useless in Win32, in most case a stdcall is better.
系統時間:2024-04-29 6:33:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!