SQL客户端软件的设定问题 |
答題得分者是:malanlk
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
把登錄資料放在一個 INI 檔案內, 或者是 用 Windows 本身的登錄檔, 在命令行內打 regedit 就會看到 "登錄編輯程式" 不知道簡體版叫什麼... 在圖中你可以看到 \HKEY_CURRENT_USER\Software\Cyberhood\D2D Software 下面可以看到你安裝的許多軟體, 上圖是ㄧ個 Cyberhood 發行的軟體叫做 D2D, 右邊則是他的登錄項目, 其實也就是程式啟動時要設定的資料 這些資料都可以透過 TRegistry 這個 Delphi 內建的類別來讀取及設定 另外一種就是將資料放在 .INI 的檔案內, 由 TIniFile 這個類別來讀取及設定. 程式啟動後就會將資料讀出, 並顯示在登入視窗上, 登入成功後就會將資料寫回, 以便下次讀取. 如果有記憶密碼功能的話通常會用 MD5 編碼再寫入. ntjrr 兄可以先去研究 這兩個類別的用法...
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
如你所言 連線 Setup 的時機應該在 程式運行前
因此程式應該放在專案檔的前面部份 Project-->View Source 你會看到如下的內容
program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}, UnitSetup in 'UnitSetup.pas' {SetupForm}, {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); // 自動建立 Application.CreateForm(TForm2, Form2); // 自動建立 Application.Run; end.這張圖是 Project-->Options 開啟後的內容 左邊 Form1,Form2 是 設定為 Auto-Create 所以你會在上述專案檔看到 delphi 自動幫你加的程式碼; 右邊 是 Available Form 是程式中會用到但是不是每次都會用到的Form (如網路連線設定的 Form) 當 Project 檔運行到 Application.Run 時你的主 Form 就會開始運作. 所以要檢查連線是否設定的時機就是在 Application.Run 之前 var bConnectOk: Boolean; begin Application.Initialize; Application.CreateForm(TForm1, Form1); // 自動建立 Application.CreateForm(TForm2, Form2); // 自動建立 SetupForm := TSetupForm.Create(Application); try if not SetupForm.CheckSetupDataOk then begin SetupForm.ShowModal; bConnectOk := SetupForm.ConnectionTestOk; // 連線測試結果 end; finally SetupForm.Free; end; if bConnectOk then Application.Run;程式的調子大概是這樣 SetupForm.CheckSetupDataOk 要負責檢查, 連線設定是否存在及連線是否成功 若否, 就跳出設定視窗, 要求修改或輸入連線設定, 並做連線測試.... 這樣應該就滿足你的需求了 發表人 - malanlk 於 2005/08/30 08:58:11 |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
malanlk兄,我今天花了些时间对注册表的一些语法学习了一下,有一点熟悉了,您也确定了我的ONSHOW的方法是正确的,那么下面我就请教我所想的思路的具体代码了,您在上文中其实就是说明了代码插入的位置,还未涉及到具体的代码。我是这样想的,(我先讲出来,对错由您再指正)在我的用户登录窗口ONSHOW中加入判断if 读注册表数据,如果存在则赋给ADO连接的参数,如果连接成功,那么设置的窗口就不跳出,用户登录就SHOW了,如果没有参数或者参数不正确,则跳出设置窗口,要求填入各项目内容,测试连结成功后保存到注册到。不知道思路对不,还有就是具体的代码如何组织?
------
我的编程起步于ktop,我将永远支持ktop |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
思路 ok!
這段放到 登入視窗的 OnShow 內
if not SetupForm.CheckSetupDataOk then begin SetupForm.ShowModal; if not SetupForm.ConnectionTestOk then Application.terminate; end;SetupForm.CheckSetupDataOk 要負責檢查, 連線設定是否存在及連線是否成功 若否, 就跳出設定視窗, 要求修改或輸入連線設定, 並做連線測試, 測試成功就寫入資料並將ConnectionTestOk設為 TRUE |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
用户登录框中ONSHOW代码已理解。那么就是SEUTPFORM的问题了,我以前程序中有一个FORM叫DATAMODULE,这个窗口也只有一个控件:ADOCONNECTION,所有窗口的连接都是从这上面相连的,那么我在想就把那个DATAMODULE窗口改做叫SETUPFORM了,在上面再加几个控件,LABEL和EDIT框,分别填入服务器名用户名密码和数据库名四个内容。以及测试连接和取消两个BUTTON。您觉得思路如何?那么那个SETUPFORM中的代码该如何设计?
------
我的编程起步于ktop,我将永远支持ktop |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
抱歉!不行ㄟ... DATAMODULE 如果是 TDataModule 類別就無法 ShowModal哦.... 因為他不是個 Form, 還是另外建一個新的 Form 吧.... CheckSetupDataOk 是 SetupForm 內的 Public function TSetupForm = class(TForm)
....
private
{ Private declarations }
....
FConnectionTestOk: Boolean;
....
public
{ Public declarations }
....
function CheckSetupDataOk: Boolean;
property ConnectionTestOk: Boolean read FConnectionTestOk write FConnectionTestOk;
end;
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
抱歉!不行ㄟ... DATAMODULE 如果是 TDataModule 類別就無法 ShowModal哦.... 因為他不是個 Form, 還是另外建一個新的 Form 吧.... CheckSetupDataOk 是 SetupForm 內的 Public function TSetupForm = class(TForm)
....
private
{ Private declarations }
....
FConnectionTestOk: Boolean;
....
public
{ Public declarations }
....
function CheckSetupDataOk: Boolean;
property ConnectionTestOk: Boolean read FConnectionTestOk write FConnectionTestOk;
end;
... function TSetupForm.CheckSetupDataOk: Boolean;
begin
// 連線設定是否存在及連線是否成功
// 若連線成功 Result := True
end;
[/code] FConnectionTestOk 在 OnShow 時設為 False; 在 測試連線的 button 的 OnClick 中 做連線測試, 如果通過, 寫入註冊表, FConnectionTestOk 設為 True, Close Form.
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
DATAMODULE 如果是 TDataModule 類別就無法 ShowModal,我不是这个类别,是一个FORM,只是叫了那个名字,其实叫任意的一个名字都没事的。
您的代码如下:
private
{ Private declarations }
FConnectionTestOk: Boolean;
public
{ Public declarations }
function CheckSetupDataOk:Boolean;
property ConnectionTestOk:Boolean read FConnectionTestOk write FConnectionTestOk; end; var
datamoduleform: Tdatamoduleform; implementation {$R *.dfm}
function Tdatamoduleform.CheckSetupDataOk: Boolean;
begin
//
end;
出错如下:
[Warning] datamodule.pas(41): Return value of function 'Tdatamoduleform.CheckSetupDataOk' might be undefined
------
我的编程起步于ktop,我将永远支持ktop |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
function TSetupForm.CheckSetupDataOk: Boolean; var reg: TRegistry; begin reg := TRegistry.Create; try reg.RootKey := HKEY_CURRENT_USER; if Reg.OpenKey('\Software\Cyberhood',False) then begin Result := reg.ValueExists('Host'); if Result then EditHost.Text := reg.ReadString('Host') else Exit; Result := reg.ValueExists('LoginName'); if Result then EditLoginName.Text := reg.ReadString('LoginName') else Exit; Result := reg.ValueExists('Password'); if Result then EditPassword.Text := reg.ReadString('Password') else Exit; .... with DataModule.ADOConnection do begin //帶入連線參數 try // 連線 // 連線成功 Result := True; except // 連線失敗 Result := False; end; end; end else Result := False; finally reg.Free; end; end; |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
现在编绎没错误了,Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=mzsfwlb;Data Source=ntsj1;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=NTSJ1;Use Encryption for Data=False;Tag with column collation when possible=False
我本来是这么写的连线,(其实也不是用代码写的,是我设置好了后拷下来的)我在书上看到好象要=‘ edit(上面的内容),具体参数如何套入上面的?
------
我的编程起步于ktop,我将永远支持ktop |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
connectStr := 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=%s;Initial Catalog=mzsfwlb;Data Source=%s;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=%s;Use Encryption for Data=False;Tag with column collation when possible=False';
Format(connectStr,[EditUsedId.Text,EditDataSource.Text,EditWorkstation.Text]); 我手邊沒 SQL 測
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
try
ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=%s;Initial Catalog=mzsfwlb;Data Source=%s;Use Procedure for Prepare=1;Auto Translate=True;' 'Packet Size=4096;Workstation ID=%s;Use Encryption for Data=False;Tag with column collation when possible=False'; Format(ConnectionString,[EditLoginName.Text,EditHost.Text,EditHost.Text]); if ADOCOnnection1.Connected=true then Result := True; except // 連線失敗 Result := False; end;正常运行了,我发现上面少了一个密码输入的内容。这整个的程式我想是第一步,这个是为其它设下伏笔的,然后第二步如何呢,大大我今晚先下了,明天进一步做,我自己也在看看相关资料,再学学。再加上您指点,我想肯定会攻下这一关。
------
我的编程起步于ktop,我将永远支持ktop |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
你是在每一個 Form 上放 ADOConnection?
所以你應該加一個 TDataModule (File-->New-->Data Module)
並將此 Data Module 的 Name 設為 MyDM, 存檔為 UnitMyDM (紅色是我隨意取的, 方便下面引用) 然後將 SetupForm 上的 ADOConnection1 搬過去, 在 SetupForm, 及每一個要連線的 Form 上 implementation {$R *.dfm} uses UnitMyDM; 然後將每一個 Form 內用到的 ADOConnection1 都改用 MyDM.ADOConnection1 就可以全部集中用一個 ADOConnection 了....
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
前辈,呵呵,想想真好玩,我以前的概念搞错了,您这么一说我就懂了,看来很多事情要多问多做就不怕不懂了,我以前是这么做的,就是新建了一个FORM,我把他的名字叫datamodule,然后上面只放了一个adoconnection控件,其它FORM的连接都通过这的,也就是说整个软件只有一个adoconnection,而不是每个都有的。但我搞错了,可能要象您所说的新建datamodule,而不是新建FORM把他的名字叫datamodule,我再试,前辈,我一般在早晨、中午各上半小时网左右,然后晚上5点后一直上网了,中间我不在网上的,所以回复的可能不及时,请谅! 發表人 - ntjrr 於 2005/08/31 12:01:29
------
我的编程起步于ktop,我将永远支持ktop |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
好的,我按照您的方法做了,就是新建了一个DATAMODUL,不过为了和以前的兼容,减少改动,我就把这个名字叫做,DATAMODULEFORM了,单元名叫DATAMODULE,这样我以前的引用这个窗口就什么都不要改变了,否则我要一个一个窗口改名了。
在源程序窗口中的代码如下:
Application.Initialize; Application.CreateForm(Tzjmform, zjmform); Application.CreateForm(TDataModuleform, DataModuleform); Application.CreateForm(Tsqlsetupform, sqlsetupform); if sqlsetupform.CheckSetupDataOk=true then begin Application.CreateForm(TLogoinForm, LogoinForm); ...... Application.CreateForm(Txtzcform, xtzcform); end else begin sqlsetupform.ShowModal; end; Application.Run; end.现在我一步一步来,要做的就是填入正确的参数后,写入注册表,然后下次就不出现这窗口了,我先做,不懂我再来问。谢谢
------
我的编程起步于ktop,我将永远支持ktop |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
procedure Tsqlsetupform.ConnectTestBtnClick(Sender: TObject); var reg: TRegistry; begin try ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=%s;Initial Catalog=mzsfwlb;Data Source=%s;Use Procedure for Prepare=1;Auto Translate=True;' 'Packet Size=4096;Workstation ID=%s;Use Encryption for Data=False;Tag with column collation when possible=False'; Format(ConnectionString,[EditLoginName.Text,EditHost.Text,EditHost.Text]); ADOCOnnection1.Connected := true; except // 連線失敗 end; if ADOCOnnection1.Connected then begin ShowMessage('Connection Success!'); FConnectionTestOk := True; reg := TRegistry.Create; try reg.RootKey := HKEY_CURRENT_USER; if Reg.OpenKey('\Software\Cyberhood',True) then // 第二個參數設為True 才可新增 begin reg.WriteString('LoginName','"' EditLoginName.Text '"'); reg.WriteString('Host','"' EditHost.Text '"'); reg.CloseKey; end; finally reg.Free; end; Close; end else begin ShowMessage('Connection fail!'); end end; |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
是不是这一段?
{$R *.res} begin Application.Initialize; sqlSetupForm := TsqlSetupForm.Create(Application); try if not sqlsetupform.CheckSetupDataOk then begin sqlsetupform.ShowModal; end; finally sqlSetupForm.Free; end; if sqlsetupform.CheckSetupDataOk then begin Application.CreateForm(Tzjmform, zjmform); Application.CreateForm(TDataModuleform, DataModuleform); Application.CreateForm(TLogoinForm, LogoinForm); Application.CreateForm(Tsfform, sfform); Application.CreateForm(Tyszlform, yszlform); Application.CreateForm(Tbrzlform, brzlform); Application.CreateForm(Txjxmform, xjxmform); Application.CreateForm(Tsfcxform, sfcxform); Application.CreateForm(Tllzlform, llzlform); Application.CreateForm(Tkszlform, kszlform); Application.CreateForm(Tprintform, printform); Application.CreateForm(Tpjzfform, pjzfform); Application.CreateForm(Txmzlform, xmzlform); Application.CreateForm(Tbqxmform, bqxmform); Application.CreateForm(Tsjhfform, sjhfform); Application.CreateForm(Tsjbfform, sjbfform); Application.CreateForm(Tuserform, userform); Application.CreateForm(Taboutform, aboutform); Application.CreateForm(Tdwzlform, dwzlform); Application.CreateForm(Tcxsrform, cxsrform); Application.CreateForm(Tpjzfcxform, pjzfcxform); Application.CreateForm(Typxhtjform, ypxhtjform); Application.CreateForm(Trbform, rbform); Application.CreateForm(Txmxhtjform, xmxhtjform); Application.CreateForm(Tyhcxform, yhcxform); Application.CreateForm(Tgnbform, gnbform); Application.CreateForm(Thintform, hintform); Application.CreateForm(Tsjzlform, sjzlform); Application.CreateForm(Trkform, rkform); Application.CreateForm(Trkcxform, rkcxform); Application.CreateForm(Txtzcform, xtzcform); Application.Run; end; end.
------
我的编程起步于ktop,我将永远支持ktop |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
出现以下错误提示:
[Hint] SJMZSF.DPR(51): Value assigned to 'bConnectOk' never used
另外我发现前辈将代码移到了最下面,那么就会出现这样的问题了:
请问前辈在DATAMODULE中的ADOCONNECTION在设计时要不要连接数据库?也就是它的CONNECTED是否在设计时是否为TRUE,如果在设计时不为TRUE的话,那么下面的所有窗口的CREAT都成了问题,因为很多窗口的CREAT事件中都要用到DATAMODULE中的ADOCONNECTION,否则就是不断的报错了。因为在大多数窗口的CREAT事件中我用了ADOTABLE或ADOQUERY在执行一些操作。
------
我的编程起步于ktop,我将永远支持ktop |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |