C++ Builder 主界面,登錄界面,SQL服務器連接設置界面 切換問題


    使用的控件:ADOConnection,ADOquery
    想實現的效果:執行后首先出現登錄界面,然后點擊登錄界面上的“連接服務器”按鈕,打開SQL服務器連接設置界面(即是對ADOConnectionString的設置),待連接成功后,又返回登錄界面,輸入用戶名及密碼后,進行登錄操作。登錄成功后主界面出現。
    疑問:借鑒了妖哥在 http://bbs.csdn.net/topics/390466656 內的提示,實現了先出現登錄界面。
          但是當點擊“連接服務器”按鈕時,報錯!
    access violation at address 400EE72E in module'vcl60.bpl' .  read of address 000002EC


       請問,應該怎樣實現我想要的!謝謝大家!不勝感激!剛剛接觸不久,希望大家幫幫忙!

11 个解决方案

#1


你的思路很清楚啊,關鍵是代碼怎么組織的,來吧,發代碼看看吧。

#2


哇塞!我好激動啊!妖哥回復我!== 我馬上發!

#3



主界面的:(完全復制妖哥的)


#include "Main.h"
#include "Login.h"
#include "SQLServer.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    // 設置應用程序不顯示主窗體
    Application->ShowMainForm = false;
    // 顯示登錄窗體並通過返回的ModalResult判斷登錄結果
    TfrmLogin *frmLogin = new TfrmLogin(this);
    //TfrmSQLServer *frmSQLServer = new TfrmSQLServer(this);
    int nModalResult = frmLogin->ShowModal();
    //int nModalResult = frmSQLServer->ShowModal();
    // delete frmSQLServer;
   delete frmLogin;



    if (nModalResult == mrOk)
    {     // 如果登錄成功,則設置應用程序顯示主窗體
        Application->ShowMainForm = true;
    }
    else
    {
         // 登錄失敗則通知主窗體關閉,應用程序也就關閉了
         ::PostMessage(Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
    }

登錄界面:

#include <vcl.h>
#pragma hdrstop

#include "Login.h"
#include "SQLServer.h"
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmLogin *frmLogin;
//---------------------------------------------------------------------------
__fastcall TfrmLogin::TfrmLogin(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfrmLogin::Button2Click(TObject *Sender)//登錄按鈕
{
    AnsiString sql;
    if (Edit1->Text=="")
    {
        ShowMessage("請輸入用戶名") ;
        return;
    }
    else if(Edit2->Text=="")
    {
        ShowMessage("請輸入密碼");
        return;
    }
    /*else if(frmSQLServer->Edit3->Text=="")
    {
        ShowMessage("您必須先設置SQL服務器信息");
        return;
    }  */

    AnsiString putUser =Trim(Edit1->Text);
    AnsiString putPwd=Trim(Edit2->Text);
    AnsiString SQLUser,SQLPwd,SQLUserType;
    sql="select * from [User] where UserName='"+putUser+"'";
    ADOQuery1->Close();
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add(sql);
    ADOQuery1->Open();
    SQLUser =ADOQuery1->FieldByName("UserName")->AsString ;
    SQLPwd= ADOQuery1->FieldByName("UserPwd")->AsString ;
    SQLUserType=ADOQuery1->FieldByName("UserType")->AsString  ;
    if(SQLUser=="")
    {
        ShowMessage("無此用戶名,請重新輸入!");
        return;
    }
    else
    {


        if(SQLPwd==putPwd)
        {
            if (SQLUser=="操作員")
            {
                ShowMessage("請輸入管理員或高級管理員用戶!");
                Edit1->Text="";
                Edit2->Text="";
                //Edit1->SetFoucs();
            }
            else
            {
            ShowMessage("登錄成功!");
            Form1->Show();
            frmLogin->Close();

            }
        }
        else
        {
           ShowMessage("密碼錯誤,請重新輸入!");
           Edit2->Text="";
           return;
        }
    }
        
}
//---------------------------------------------------------------------------
void __fastcall TfrmLogin::Button1Click(TObject *Sender)//連接SQL服務器按鈕
{
frmSQLServer->Show();
}
//---------------------------------------------------------------------------

SQLServer 服務器連接設置界面

void __fastcall TfrmSQLServer::Button1Click(TObject *Sender)
{
    if (Edit1->Text=="")
    {
        ShowMessage("必須填寫SQL服務器信息或IP地址");
        //Edit1->SetFoucs();

    }
    else if(Edit2->Text=="")
    {
        ShowMessage("請輸入用戶名");
         //Edit2->SetFoucs();
    }
    else if(Edit3->Text=="")
    {
        ShowMessage("請輸入密碼");
        // Edit3->SetFoucs();
    }
    else if(Edit4->Text=="")
    {
        ShowMessage("請輸入數據庫名稱");
        // Edit4->SetFoucs();
    }
    else
    {
        AnsiString strPwd ,strSouce, strCatg,strUser;
        strPwd=Edit3->Text;
        strUser=Edit2->Text;
        strSouce=Edit1->Text;
        strCatg=Edit4->Text;
        Form1-> ADOConnection1-> Close();
        Form1-> ADOConnection1-> LoginPrompt=false;
        Form1-> ADOConnection1-> ConnectionString = "Provider=SQLOLEDB.1;Password='"+strPwd+"';Persist Security Info=True;User ID='"+strUser+"';Initial Catalog='"+strCatg+"';Data Source='"+strSouce+"'";
        Form1-> ADOConnection1-> ConnectionTimeout=5;
        Form1-> ADOConnection1-> Open();
        ShowMessage("數據庫連接成功!");
        frmSQLServer->Close();
        
    }        
}

#4


代碼看了看,有幾個問題。

1. frmLogin 單元中 Button1 的點擊事件中你直接 Show 出 frmSQLServer,這個 frmSQLServer 窗體自動創建了沒有?如果沒有創建就直接 Show 出來,肯定要AV的。我的建議是:除主窗體外和數據模塊或必要的窗體外,其他窗體不要自動創建,而是在用的時候new一個實例,合適的時間銷毀它。

2. 類似ADOConnection這樣的組件,你既然在多個窗體中都直接或間接的用到了,建議你在工程中添加一個數據模塊(DataModule),然后將公用的這些對象放在數據模塊中,並且,讓這個數據模塊在工程中第一個自動創建(在主窗體前創建),這樣在主窗體的構造函數中,才能正常的使用這些對象。

3. 每一個對象的名字,最好起的有意義一些,不要泛用Edit1,Edit2之類的自動命名。

#5


非常感激妖哥的回復。
但是我還是不太明白,我是小小白。還希望妖哥講解的淺顯些!謝謝哈!

frmSQLServer 窗體自動創建了沒有? 自動創建了!,您后面的意思是frmSQLServer 要自動創建還是要new一個呢?

 類似ADOConnection這樣的組件,你既然在多個窗體中都直接或間接的用到了,建議你在工程中添加一 個數據模塊(DataModule),然后將公用的這些對象放在數據模塊中,並且, 讓這個數據模塊在工程中第一個自動創建(在主窗體前創建),這樣在主窗體的構造函數中,才能正常的使用這些對象。
  這個不會啊!還望指教啊!
謝謝妖哥!感激涕零啊!

#6


這樣吧,我用 C++Builder 6.0 給你做一個簡單的示例,你留個信箱,一會發給你。

#7


恩!謝謝妖哥!非常感謝!我的郵箱289445739@qq.com

#8


我來了,昨天喝多了。你檢查郵箱吧,有驚喜。

#9


非常非常感謝妖哥的熱情幫助!已經完美的實現我想要的!非常感謝!

#10


引用 8 樓 ccrun 的回復:
我來了,昨天喝多了。你檢查郵箱吧,有驚喜。

給我發一份可好?正在學.感謝每一位大神!!!

#11


引用 10 樓 aJustFly 的回復:
Quote: 引用 8 樓 ccrun 的回復:

我來了,昨天喝多了。你檢查郵箱吧,有驚喜。

給我發一份可好?正在學.感謝每一位大神!!!


引用 10 樓 aJustFly 的回復:
Quote: 引用 8 樓 ccrun 的回復:

我來了,昨天喝多了。你檢查郵箱吧,有驚喜。

給我發一份可好?正在學.感謝每一位大神!!!

我郵箱:373738633@qq.com

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com