delphi 2010 简单小问题,请教

zixing 2010-09-15 09:21:49
我见别人写个程序,一打开,先出现登陆的窗口,输入密码以后,提示连接数据库失败,但是我怎么也没找到数据库连接在哪里写着。
在窗口列表中只有一个mainform,双击就出来mainform的代码,没看见那个登陆窗口的窗体和代码在哪里写着。而且f8单步调试也没看见执行到连接数据库的那一句。我是刚用delphi,以前用vs,请大家帮忙分析下。
记得跟帖啊。。。我下边还有问题要问。
在线等着呢。
...全文
317 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
ecjtu5208 2010-09-21
  • 打赏
  • 举报
回复
很好,我记住这个ID了:zixing。
不结贴的人真多啊。
过分。
goodhj 2010-09-17
  • 打赏
  • 举报
回复
use
....
UnitYangGuangConst, UnitYangGuangDb;
从这里看,你程序的单元列表里就不应该只有一个单元,你怎么说打开单元列表只有一个单元呢?

function DoLogin(。。。下面

UnitYangGuangDb.InitConnection;

找到这句话,按住键盘的CTRL键,然后用鼠标左键点InitConnection,点不过去就是你少单元了,点过去了就把那段代码贴出来,那里应该就是初始数据连接的代码,

ecjtu5208 2010-09-17
  • 打赏
  • 举报
回复
把goodhj捉到派出所去。
理由:抢劫
goodhj 2010-09-17
  • 打赏
  • 举报
回复
ReadDSN(GetDSNFileName, YangGuangDSN);
从这句看,应该是通过ODBC建立的数据源,在管理工具下的Data Sources (ODBC)的 File DSN选项卡里找找看有没有,知道怎么用ODBC就没问题,配置下那个数据源就能改密码了
ecjtu5208 2010-09-17
  • 打赏
  • 举报
回复
楼上有点过分了,抢分啊?
楼主给我全分啊。
结贴啊。
ecjtu5208 2010-09-16
  • 打赏
  • 举报
回复
只是你没找到而已。
根据你所说只看到一个Mainform,但是事实上程序开启是有登录窗体的,那么说明登录窗体是在别的文件夹里的,是引用过来的。
(1)选view source进入工程文件,查看uses下面的那些'xxxx.pas'中是否有一个叫login.pas的单元文件(一般来说都会这样命名,反正去找那个和登录有关的英文名就是了)。
(2)找到之后,看它的所在的路径('c:/xxx/xxxxx/login.pas'),然后你去打开这个单元文件。

还有就是或许你进入login.pas也不一定找得到连接数据库的句子,因为很可能直接写在了控件里面的strings属性当中。

还找不到的话,看看有没有加载dll文件,或者加载了ini。

goodhj 2010-09-16
  • 打赏
  • 举报
回复
那不是只有一个单元吗?那你把那单元的implementation以上部分的代码都贴出来,让大家帮你找
zixing 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 goodhj 的回复:]
连数据库用的什么组件?ADO,BDE,还是通过ODBC?又或者是其他的?先弄清楚这个再说,找到后你再看看其设置
[/Quote]

我也不晓得是用什么连接的。所以才来问呀。
ecjtu5208 2010-09-16
  • 打赏
  • 举报
回复
找到那连接数据库的句子很简单。就这么多东西。慢慢找哈。
ecjtu5208 2010-09-16
  • 打赏
  • 举报
回复
ReadDSN(GetDSNFileName, YangGuangDSN);
UnitYangGuangDb.InitConnection;
这里是关键哈。按住ctrl,然后鼠标点击InitConnection应该可以看到了。

ecjtu5208 2010-09-16
  • 打赏
  • 举报
回复
RegFile := TRegIniFile.Create(HDBOH_COMPANY + '\数据库连结');


使用TRegINIFile
如果你习惯INI文件但要将配置信息改为存储到注册表,可使用TRegINIFile类。TRegINIFile设计为使注册表项看上去像INI文件项。所有的TINIFile的方法(读和写)都存在于TRegINIFile。当构造TRegINIFile对象时,传入的参数(对INIFile对象来说是文件名)成为注册表根部的用户键值,所有节及值都由此分支。实际上,该对象极大地简化了注册表的接口,因此更多信息参见VCL帮助TReyINfile主题。可以根本不用改变现有代码就可用它来代替TRegistry组件。


去注册表看,找到这个TRegIniFile.Create(HDBOH_COMPANY + '\数据库连结');中的HDBOH_COMPANY
是否有收获,接下来全靠你了,我下班了,回去Happy。



zixing 2010-09-16
  • 打赏
  • 举报
回复
上边是我找到的unitlogon.pas的代码
zixing 2010-09-16
  • 打赏
  • 举报
回复

unit UnitYangGuangLogon;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, Menus, ShellApi, IniFiles, Registry,
UnitAkTypes, UnitYangGuangConst, UnitYangGuangDb;

type
TFormLogon = class(TForm)
EditUserId: TEdit;
Label2: TLabel;
EditUserPassword: TEdit;
Label1: TLabel;
ButtonLogon: TButton;
ButtonQuit: TButton;
Image2: TImage;
Image1: TImage;
PopupMenu: TPopupMenu;
N1: TMenuItem;
CheckBoxSaveUserId: TCheckBox;
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure ButtonLogonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure Image1Click(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
DbMustInitialized: Boolean;
public
{ Public declarations }
end;

function CheckPasswd(const sTitle: string = ''; OpCode: Integer = 0; const Password: string = ''; DbMustInitialized: Boolean = True): Boolean;
function CmdLogon(DbMustInitialized: Boolean = True): Boolean;
function CheckPasswdNoLogo(const sTitle: string; OpCode: Integer = 0; const Password: string = ''; DbMustInitialized: Boolean = True): Boolean;

function DoLogin(UserCode: Integer; const Password: string; DbMustInitialized: Boolean = True): Boolean;

implementation

{$R *.dfm}

uses AdoDB;

procedure TFormLogon.Image1Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', YangGuang_WEBHOME, nil, nil, SW_SHOW)
end;

procedure TFormLogon.N1Click(Sender: TObject);
var
DSN: WideString;
begin
if FileExists(GetDSNFileName) then
ReadDSN(GetDSNFileName, YangGuangDSN)
else
YangGuangDsn := '';
DSN := YangGuangDsn;
DSN := AdoDB.PromptDataSource(Self.Handle, DSN);
YangGuangDsn := DSN;
WriteDSN(GetDSNFileName, YangGuangDSN);
end;

procedure TFormLogon.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
OldKey: Word;
begin
OldKey := Key;
Key := 0;
case OldKey of
VK_DOWN: if not (ssAlt in Shift) and not (ActiveControl is TCustomListControl) then
SelectNext(ActiveControl, True, True)
else
Key := OldKey;
VK_UP: if not (ssAlt in Shift) and not (ActiveControl is TCustomListControl) then
SelectNext(ActiveControl, False, True)
else
Key := OldKey;
VK_RETURN: SelectNext(ActiveControl, True, true);
else
Key := OldKey;
end;
end;

function CheckPasswd(const sTitle: string = ''; OpCode: Integer = 0; const Password: string = ''; DbMustInitialized: Boolean = True): Boolean;
var
FormLogon: TFormLogon;
begin
FormLogon := TFormLogon.Create(Application);
try
if sTitle > '' then
FormLogon.Caption := sTitle
else
FormLogon.Caption := Application.Title;
if OpCode > 0 then FormLogon.EditUserId.Text := IntToStr(OpCode);
if Password > '' then FormLogon.EditUserPassword.Text := Password;
FormLogon.DbMustInitialized := DbMustInitialized;
Result := FormLogon.ShowModal = mrOK;
finally
FormLogon.Free;
end;
end;

function CheckPasswdNoLogo(const sTitle: string; OpCode: Integer = 0; const Password: string = ''; DbMustInitialized: Boolean = True): Boolean;
var
FormLogon: TFormLogon;
begin
FormLogon := TFormLogon.Create(Application);
try
FormLogon.Image1.Visible := False;
FormLogon.Image2.Visible := False;;

FormLogon.Caption := sTitle;
if OpCode > 0 then FormLogon.EditUserId.Text := IntToStr(OpCode);
if Password > '' then FormLogon.EditUserPassword.Text := Password;
FormLogon.DbMustInitialized := DbMustInitialized;
Result := FormLogon.ShowModal = mrOK;
finally
FormLogon.Free;
end;
end;

procedure TFormLogon.ButtonLogonClick(Sender: TObject);
var
UserName, Password: string;
UserCode: Integer;
begin
UserName := Trim(EditUserId.Text);
Password := EditUserPassword.Text;
if (UserName = '') or (StrToIntDef(UserName, 0) = 0) then
begin
ShowMessage('your id');
Self.EditUserId.SetFocus;
Exit;
end;
UserCode := StrToInt(UserName);
if DoLogin(UserCode, Password, Self.DbMustInitialized) then
Self.ModalResult := mrOK;
end;

procedure TFormLogon.FormActivate(Sender: TObject);
begin
if Self.EditUserId.Text = '' then
Self.EditUserId.SetFocus
else
Self.EditUserPassword.SetFocus;
end;

procedure TFormLogon.FormCreate(Sender: TObject);
var
RegFile: TRegIniFile;
begin
RegFile := TRegIniFile.Create(HDBOH_COMPANY + '\数据库连结');
try
Self.CheckBoxSaveUserId.Checked := RegFile.ReadBool('LastLogin', 'SaveLastUserName', False);
if Self.CheckBoxSaveUserId.Checked then
Self.EditUserId.Text := RegFile.ReadString('LastLogin', 'UserId', '')
else
Self.EditUserId.Text := '';
finally
RegFile.Free;
end;
end;

procedure TFormLogon.FormDestroy(Sender: TObject);
var
RegFile: TRegIniFile;
begin
RegFile := TRegIniFile.Create(HDBOH_COMPANY + '\数据库连结');
try
RegFile.WriteBool('LastLogin', 'SaveLastUserName', Self.CheckBoxSaveUserId.Checked);
if Self.CheckBoxSaveUserId.Checked then
RegFile.WriteString('LastLogin', 'UserId', Self.EditUserId.Text)
else
RegFile.WriteString('LastLogin', 'UserId', '');
finally
RegFile.Free;
end;
end;

function CmdLogon(DbMustInitialized: Boolean = True): Boolean;
var
UserCode: Integer;
Password: string;
begin
Result := False;
if ParamCount < 2 then Exit;
UserCode := StrToIntDef(ParamStr(1), 0);
Password := ParamStr(2);
Result := DoLogin(UserCode, Password, DbMustInitialized);
end;

procedure TFormLogon.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then Key := #0;
end;

function DoLogin(UserCode: Integer; const Password: string; DbMustInitialized: Boolean = True): Boolean;
var
ErrorCode: Integer;
ServerDate: TYangGuangDate;
ServerTime: TYangGuangTime;
begin
Result := False;
ReadDSN(GetDSNFileName, YangGuangDSN);
UnitYangGuangDb.InitConnection;
try
ErrorCode := UnitYangGuangDb.Login(UserCode, Password, ServerDate, ServerTime);
if ErrorCode = 0 then
begin
if AkDate(Now) <> ServerDate then
raise Exception.CreateFmt('xxxxxxxx', [ServerDate, AkDate(Now)])
else
if ABS(AkSeconds(AkTime(Now)) - AkSeconds(ServerTime)) > 300 then begin
if MessageDLG(Format('xxxxxxx', [ServerDate, AkDate(Now)]), mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then
DoCorrectSystemTime
else
raise Exception.CreateFmt('xxxxxx', [ServerDate, AkDate(Now)]);
end;
if DbMustInitialized then
begin
if UnitYangGuangDB.IsNeedInitDb(UnitYangGuangDB.GetSysInfo) then
if MessageDlg('xxx'#13#10#13#10#13#10'xxxxx', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
ErrorCode := InitYangGuangNowDB;
if ErrorCode = 0 then
ShowMessage('ok')
else
raise Exception.Create(GetErrorMessage(ErrorCode));
end;
end;
Result := True;
end
else
ShowMessage(UnitYangGuangDb.GetErrorMessage(ErrorCode));
except
on E: Exception do
begin
UnitYangGuangDb.CloseConnection;
ShowMessage(E.Message);
end;
end;
end;

end.
一剑飘雪 2010-09-15
  • 打赏
  • 举报
回复
在代码里面按ctrl + f, 写提示的密码错误信息。 然后选择find in files
zixing 2010-09-15
  • 打赏
  • 举报
回复
提示sa密码错误。我想改改,奇怪的是就是没找到密码在哪里写着。
kye_jufei 2010-09-15
  • 打赏
  • 举报
回复
認真找找,即使有連接失敗的提示,就一定有代碼。。。
zixing 2010-09-15
  • 打赏
  • 举报
回复
ctrl+f12,里面就一个单元。
------------
请问一下dephi 2010 里面的所有与程序有关的代码都在哪里?

或者是不是可以引用外部的单元。比如 引用外部另外一个项目中的代码?
goodhj 2010-09-15
  • 打赏
  • 举报
回复
应该是没写代码来动态连接,直接在控件里静态设置好了,所以你找不到连接代码,你打开单元列表(Ctrl+F12)看看,应该不只一个单元
  • 打赏
  • 举报
回复
找什么找。要是直接写在ADOQUERY控件里面,你能找到才怪。

不是一般的人不会写在里面……额……

你在代码里面按ctrl + f,然后选择find in files,查找 ADO 看看,有没有ADO控件。
Mit1208 2010-09-15
  • 打赏
  • 举报
回复
找到提示连接数据库失败的语句!
然后在边上找相关代码吧!
加载更多回复(17)

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧