unit Unit2; interface 
uses Windows, Messages, SysUtils, Variants,classes,dbclient,unit3; 
  type 
  tuser=class(tobject) 
  private 
  datamod:tdatamodfrm; 
  public 
  function getpowe(Name:string):string; 
  constructor create; 
  destructor destroy;override; 
  end; 
implementation 
constructor tuser.create; 
begin 
datamod:=tdatamodfrm.Create(nil); 
end ; 
destructor tuser.destroy; 
begin 
freeandnil(datamod); 
inherited; 
end; 
function tuser.getpowe(Name:string):string; 
  begin 
  with datamodfrm.ADOQuery1 do 
    begin 
    close; 
    sql.Clear; 
    sql.Add('select * from yonghu where uq='''+Name+''''); 
    open; 
    end; 
    result:=datamodfrm.ADOQuery1.fieldbyname('powe').AsString; 
  end; 
这是类的设计部分 
unit Unit1; interface uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, unit2,StdCtrls; type 
  TForm1 = class(TForm) 
    Edit1: TEdit; 
    Edit2: TEdit; 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
  private 
  user:tuser; 
    { Private declarations } 
  public 
    { Public declarations } 
  end; var 
  Form1: TForm1; implementation 
{$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin 
user:=tuser.Create; 
if (edit1.text='') or (edit2.text='') then 
  begin 
  showmessage('请输入完整'); 
  exit; 
  end; 
if user.getpowe(edit1.Text)=edit2.text then 
begin 
showmessage('成功'); 
end 
else 
begin 
showmessage('不成功'); 
end; 
user.Free; 
end; end. 
类的使用 这是个简单的类的实现列子 通过用户名验证密码 可是我输入的用户名 密码全正确 理应该显示 
showmessage('成功'); 
可是显示的却是 
showmessage('不成功'); 
请问各位高手 问题出在哪啊 小弟刚接触DELPHI 以前学的都是VB 对类的理解有限 帮帮解决下
用户名数据类型VARCHAR(15) 密码数据类型VARCHAR(20)能不能帮我解决下 要能实现的 或者直接给我个代码能实现的也可以
非常急 自己做个软件 如果不用类 要重复的堆代码 太累了 可维护性也差 哪位大侠就帮我解决下吧 最好在机器上实验过了 谢谢

解决方案 »

  1.   

    好像没什么问题,你可以跟踪一下,看看user.getpowe(edit1.Text)的返回值是什么?还有要注意没有空格之类的
      

  2.   

    我也觉得没什么问题,我也找不到什么问题,可是就是实现不了预期的效果 你们谁有现成的 能不能给我一个 我试验下 其实只要一个能实现了 其他的我自己就能做了 这是我第一次设计类 以前都堆代码 可是堆的太累了 到时候想维护 找起来也麻烦 我真的很急 找不到问题在哪 太郁闷了 有现成的给我一个吧 今天刚毕业的 计算机毕业的人太多了 曾经有人说 招聘会楼塌的话 砸死10个 9个是计算机系毕业的 听起来真让人难受 就业形式太难了 在学校学的最好的VB目前也没人用了 自学的DELPHI 没人教 都靠自己 遇到问题 没法解决 只能求助大家了 我梦想当个程序员 可路在何方?现在是步履维艰啊 
    最好哪位仁兄 能把在机器上可以无问题的代码给我个 好心人也可以把我这个代码在机器上测试下 谢谢了 等到晚上10点 
      

  3.   

    user.getpowe(edit1.Text)返回的是空的字符串 问题出在哪 哪位告诉我下啊
      

  4.   

    如果我要验证用户名是否存在 function getusername(name:string):boolean;那
     result:=datamodfrm.ADOQuery1.fieldbyname('powe').AsString;的返回查询值的语句该怎么写呢?因为返回的是BOOLEAN型 而RESULT是STRING型的 请高手帮我解答下 
      

  5.   

    没用过ado,不过大概知道一点,要实现boolean类型返回值,可以这样:function tuser.getpowe(Name:string; out password: string):boolean;
      begin
      with datamodfrm.ADOQuery1 do
        begin
        close;
        sql.Clear;
        sql.Add('select * from yonghu where uq='''+Name+'''');
        open;
        end;
        result := not (datamodfrm.ADOQuery1.bof and datamodfrm.ADOQuery1.eof); //Query.bof and Query.eof为真时,数据集没有记录,也就是找不到该用户名
        if (result) then
         password:=datamodfrm.ADOQuery1.fieldbyname('powe').AsString;
        else
         password := '';
      end; 调用时
    var
      pwd: string;
      ...
    begin
      ...
      user := ...;try
    if not user.getpowe(edit1.Text, pwd) then
    begin
      showmessage('用户不存在');
      exit;
    end;if (pwd <> edit2.text) then 
    begin
      showmessage('password错误');
      exit;
    end;
    finally
      user.destroy();
    end;showmessage('Ok');你可能还有两个问题是,
    1,sql.Add('select * from yonghu where uq='''+Name+'''');
    如果你的用户名是忽略大小写的,这里没有处理2,你原来的实现
    procedure TForm1.Button1Click(Sender: TObject);begin
    user:=tuser.Create;
    if (edit1.text='') or (edit2.text='') then
      begin
      showmessage('请输入完整');
      exit;
      end;
    if user.getpowe(edit1.Text)=edit2.text then
    begin
    showmessage('成功');
    end
    else
    begin
    showmessage('不成功');
    end;
    user.Free;
    end; 当if (edit1.text='') or (edit2.text='') then时,user变量造成内存泄露(没有free)
      

  6.   

    如果是输入SQL语言进行删除 修改 查询等操作 该怎么写呢 请ALPHAX帮我解答下 你解答的上个问题已经解决了 比方说
    procedure updatexinxi(updatesql:string);
    就拿修改做个列子吧 哪个高手给个代码 给一个 我自己就能理解明白了 其他的就解决了
      

  7.   

      你这个类感觉都没什么用, 完全的摆设
    修改  
      AdoQuery1.Close;
      AdoQuery1.Clear;
      AdoQuery1.Sql.text := 'UpDate Table set Field = ..';
      AdoQuery1.ExecSql;
      

  8.   

    if user.getpowe(edit1.Text)= Trim(dit2.text) then