高手们,帮帮忙,小弟感激不尽:
看看,代码出错在哪:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
year,month,day:word;
str1,str2,str3:string;
i:integer;
  AChar:char;
  MemStreamA:TMemoryStream;
  MemStreamB:TMemoryStream;
begin
  MemStreamA:=TMemoryStream.Create;
  MemStreamB:=TMemoryStream.Create;
  RichEdit1.Lines.SaveToStream(MemStreamA);
  MemStreamA.Position:=0;
  MemStreamB.Position:=0;
  for i :=  0 to MemStreamA.Size-1 do
  begin
  MemStreamA.Read(AChar,1);
  AChar:=chr(ord(AChar) xor $61);//异或加密,数字可自定,在$00-$FF之间,同解密数字  MemStreamb.Write(AChar,1);  end;
  MemStreamB.Position:=0;
  richedit1.Lines.LoadFromStream(MemStreamB);
  MemStreamA.Free;
  MemStreamB.Free;
decodedate(Now,year,month,day);
str1:=inttostr(year);
str2:=inttostr(month);
str3:=inttostr(day);
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('INSERT INTO diray VALUES(:year,:month,:day,:rj)');
adoquery1.Parameters.ParamByName('year').value:=str1;
adoquery1.Parameters.ParamByName('month').value:=str2;
adoquery1.Parameters.ParamByName('day').value:=str3;
adoquery1.Parameters.ParamByName('rj').value:=richedit1.text;
adoquery1.execsql;
end;
运行后,无论编辑什么内容,数据库保存的’rj'字段内容均为:’=p='
procedure TForm1.TreeView1Click(Sender: TObject);
var
str1,str2,str3:string;
mynode,mynode1,mynode2:TTreeNode;
i:integer;
  AChar:char;
  MemStreamA:TMemoryStream;
  MemStreamB:TMemoryStream;
  stream:TMemorystream;
begin
if treeview1.Selected.count<>0
then begin
     end
else begin
     mynode:=treeview1.Selected;
     str1:=mynode.Text;
     mynode1:=mynode.Parent;
     str2:=mynode1.Text;
     mynode2:=mynode1.Parent;
     str3:=mynode2.Text;
     adoquery1.Close;
     adoquery1.SQL.Clear;
     adoquery1.SQL.Add('select * from diray');
     adoquery1.SQL.Add('where year=:str3 and month=:str2 and day=:str1');
     adoquery1.Parameters.ParamByName('str3').Value:=str3;
     adoquery1.Parameters.ParamByName('str2').Value:=str2;
     adoquery1.Parameters.ParamByName('str1').Value:=str1;
     adoquery1.Open;
     end;
     
  MemStreamA:=TMemoryStream.Create;
  MemStreamB:=TMemoryStream.Create;
  RichEdit1.Lines.SaveToStream(memstreama);
  MemStreamA.Position:=0;
  MemStreamB.Position:=0;
  for i :=  0 to MemStreamA.Size-1 do
  begin
  MemStreamA.Read(AChar,1);
  AChar:=chr(ord(AChar) xor $61);//异或解密,数字可自定,在$00-$FF之间,同加密数字
  MemStreamb.Write(AChar,1);
  end;
  richedit1.Lines.LoadFromStream(memstreamb);
  MemStreamA.Free;
  MemStreamB.Free;end;
运行点击,显示仍:’=p='快帮我看看,行家们

解决方案 »

  1.   

    >>adoquery1.Parameters.ParamByName('rj').value:=richedit1.text;
    richedit1.text;顯示的內容正常嗎??
      

  2.   

    读取之前是不是要加一个:
    MemStreamB.Position:=0;
    ??????
      

  3.   

    procedure TForm1.TreeView1Click(Sender: TObject);
    ...
    ...AChar:=chr(ord(AChar) xor $61);//异或解密,数字可自定,在$00-$FF之间,同加密数字
      MemStreamb.Write(AChar,1);
      end;
      MemStreamb.Position:=0;  //是要加這個
      richedit1.Lines.LoadFromStream(memstreamb);
      

  4.   

    richedit1.text;顯示的內容不正常MemStreamb.Position:=0;  //这个我也加了
      richedit1.Lines.LoadFromStream(memstreamb);现在情况是这样的,无论编辑什么内容,保存后在数据表中显示全为:‘=p=’,
    点击浏览也全为:‘=p=’
      

  5.   

    顯示的內容不正常的原因我找到了,因为你用的是RichEdit,RichEdit.Lines中的内容不仅是文本内容,还有格式信息,SaveToStream时,保持不是纯文本
    换成Memo后就可以了,我试过了
      

  6.   

    这样应该OK了
    procedure TForm1.TreeView1Click(Sender: TObject);
    var
      year,month,day:word;
      str1,str2,str3:string;
      i, Size:integer;
      AChar:char;
      TempStr: String;
      MemStreamA:TMemoryStream;
      MemStreamB:TMemoryStream;
    begin
      MemStreamA:=TMemoryStream.Create;
      MemStreamB:=TMemoryStream.Create;
      try
        RichEdit1.Lines.SaveToStream(MemStreamA);
        Size := MemStreamA.Size;
        MemStreamA.Position := 0;
        MemStreamB.Position := 0;
        for i :=  0 to Size-1 do
        begin
          MemStreamA.Read(AChar,1);
          AChar:=chr(ord(AChar) xor $61);//异或加密,数字可自定,在$00-$FF之间,同解密数字      MemStreamb.Write(AChar,1);
        end;
        MemStreamB.Position:=0;
        SetLength(TempStr, Size);
        MemStreamB.Read(TempStr[1], Size);
      finally
        MemStreamA.Free;
        MemStreamB.Free;
      end;
      decodedate(Now,year,month,day);
      str1:=inttostr(year);
      str2:=inttostr(month);
      str3:=inttostr(day);
      adoquery1.Close;
      adoquery1.SQL.Clear;
      adoquery1.SQL.Add('INSERT INTO diray VALUES(:year,:month,:day,:rj)');
      adoquery1.Parameters.ParamByName('year').value:=str1;
      adoquery1.Parameters.ParamByName('month').value:=str2;
      adoquery1.Parameters.ParamByName('day').value:=str3;
      adoquery1.Parameters.ParamByName('rj').value:= TempStr;
      adoquery1.execsql;
    end
      

  7.   

    反过程,解密:
    procedure TForm1.TreeView1Click(Sender: TObject);
    var
      str1,str2,str3:string;
      mynode,mynode1,mynode2:TTreeNode;
      i, Size:integer;
      AChar:char;
      TempStr: String;
      MemStreamA:TMemoryStream;
      MemStreamB:TMemoryStream;
      stream:TMemorystream;
    begin
      if treeview1.Selected.count<>0 then begin  end else begin
         mynode:=treeview1.Selected;
         str1:=mynode.Text;
         mynode1:=mynode.Parent;
         str2:=mynode1.Text;
         mynode2:=mynode1.Parent;
         str3:=mynode2.Text;
         adoquery1.Close;
         adoquery1.SQL.Clear;
         adoquery1.SQL.Add('select * from diray');
         adoquery1.SQL.Add('where year=:str3 and month=:str2 and day=:str1');
         adoquery1.Parameters.ParamByName('str3').Value:=str3;
         adoquery1.Parameters.ParamByName('str2').Value:=str2;
         adoquery1.Parameters.ParamByName('str1').Value:=str1;
         adoquery1.Open;
      end;
      
      TempStr := adoquery1.FieldByName('rj').AsString;
      Size := Length(TempStr);
      MemStreamA := TMemoryStream.Create;
      MemStreamB := TMemoryStream.Create;
      try
        MemStreamA.Write(TempStr[1], Size);    MemStreamA.Position := 0;
        MemStreamB.Position := 0;
        for i :=  0 to Size-1 do
        begin
          MemStreamA.Read(AChar,1);
          AChar:= chr(ord(AChar) xor $61);//解密
          MemStreamB.Write(AChar,1);
        end;    MemStreamB.Position := 0;
        RichEdit1.Lines.LoadFromStream(MemStreamB);
      finally
        MemStreamA.Free;
        MemStreamB.Free;
      end
    end;
      

  8.   

    tianxiake(天下客):谢谢 
    我试过了,还和以前一样
    存入数据表中和提出显示都仍为::‘=p=’
      

  9.   

    我发的第一页是加密过程。
    应该是
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    beginend;
    事件的执行体, 我在Copy时错把它到
    procedure TForm1.TreeView1Click(Sender: TObject);
    你看一下是不是这个问题.
      

  10.   

    我把我的验证加密解密正确性的代码Copy出来.你可以参照。这可以排除加密解密出错的可能性。便于你专心找数据库存取方面的错误.
    由于我电脑上没有数据库,做这方面测试比较麻烦。所以不能帮你了.
      

  11.   

    var TestStr: String;  //定义一个全局String变量,用于保存加密后的数据.加密过程:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I, Size:integer;
      AChar:char;
      TempStr: String;
      MemStreamA:TMemoryStream;
      MemStreamB:TMemoryStream;
    begin
      MemStreamA:=TMemoryStream.Create;
      MemStreamB:=TMemoryStream.Create;
      try
        RichEdit1.Lines.SaveToStream(MemStreamA);
        Size := MemStreamA.Size;
        MemStreamA.Position := 0;
        MemStreamB.Position := 0;
        for i :=  0 to Size-1 do
        begin
          MemStreamA.Read(AChar,1);
          AChar:=chr(ord(AChar) xor $61);   //异或加密,数字可自定,在$00-$FF之间,同解密数字      MemStreamb.Write(AChar,1);
        end;
        MemStreamB.Position:=0;
        SetLength(TempStr, Size);
        MemStreamB.Read(TempStr[1], Size);  //将加密后的数据保存到TempStr中
        TestStr := TempStr;                 //再将TempStr赋给全局TestStr.     RichEdit1.Lines.Clear;              //清空RichEdit1
      finally
        MemStreamA.Free;
        MemStreamB.Free;
      end;
    end;
      

  12.   

    可能是我帖的太多了,结果后来帖不了。只好申请了一个新号码,如果你要给我分,请给在tianxiake
    名下.
    procedure TForm1.Button2Click(Sender: TObject);
    var
      I, Size:integer;
      AChar:char;
      TempStr: String;
      MemStreamA:TMemoryStream;
      MemStreamB:TMemoryStream;
    begin
      TempStr := TestStr;                 //将保存在全局TestStr的加密数据赋给TempStr
      Size := Length(TempStr);
      MemStreamA := TMemoryStream.Create;
      MemStreamB := TMemoryStream.Create;
      try
        MemStreamA.Write(TempStr[1], Size);    MemStreamA.Position := 0;
        MemStreamB.Position := 0;
        for i :=  0 to Size-1 do
        begin
          MemStreamA.Read(AChar,1);
          AChar:= chr(ord(AChar) xor $61);  //解密
          MemStreamB.Write(AChar,1);
        end;    MemStreamB.Position := 0;
        RichEdit1.Lines.LoadFromStream(MemStreamB); //将解密后的数据显示出来
      finally
        MemStreamA.Free;
        MemStreamB.Free;
      end
    end;
    这样可以测试出加密解密没问题。
    因为以上Button1Click的TempStr中保存了加密的数据,你只要将其保存到数据库中就可以。
    同样的在Button2Click中要先将数据库中数据读出到TempStr.
    如果还出错,请你仔细检查数据库读写代码.
      

  13.   

    一、这么简单的问题,你居然还在急!!!!
    你这样异或加密,加密结果中会产生#0字符(串结尾),又使用串操作,出错的机率极大。
    二、RichEdit的数据有一定的格式,你把它的数据搞得乱七八糟,又交给它,不出错才怪?