请问:以下代码哪儿出错?
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
i:integer;
  AChar:char;
  MemStreamA:TMemoryStream;
  MemStreamB:TMemoryStream;
begin  MemStreamA:=TMemoryStream.Create;
  MemStreamB:=TMemoryStream.Create;
  RichEdit1.Lines.SaveToStream(MemStreamA);
  for i :=  0 to MemStreamA.Size-1 do
  begin
  MemStreamA.Position:=i;
  MemStreamB.Position:=i;
  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;
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('INSERT INTO diray VALUES(:rj)');
adoquery1.Parameters.ParamByName('rj').value:=richedit1.text;
adoquery1.execsql;
end;运行后,点保存,出错提示为:diray('rj')不能是零长度的字符串,急!请各位高手务必帮忙,先谢了。

解决方案 »

  1.   

    RichEdit1.Lines.SaveToStream(MemStreamA);
      MemStreamA.Position:=0;
      MemStreamB.Position:=0;
      for i :=  0 to MemStreamA.Size-1 do
      begin
    //  MemStreamA.Position:=i;
    //  MemStreamB.Position:=i; 不用, 去掉
    ...
    MemStreamB.Position:=0; //加這個
    richedit1.Lines.LoadFromStream(memstreamb);
      

  2.   

    这样吧,可能有点晕,表达不清楚
    要不,再看这:
    var
    str1,str2,str3:string;
    i:integer;
      AChar:char;
      MemStreamA:TMemoryStream;
      MemStreamB:TMemoryStream;
    begin  
         str1:='2004';     
         str2:='4'
         str3:='14';
         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);
         for i :=  0 to MemStreamA.Size-1 do
         begin
         MemStreamA.Position:=0;
        MemStreamB.Position:=0;
        MemStreamA.Read(AChar,1);
        AChar:=chr(ord(AChar) xor $61);
        MemStreamb.Write(AChar,1);
        end;
        MemStreamB.Position:=0;
        richedit1.Lines.LoadFromStream(memstreamb);
        MemStreamA.Free;
        MemStreamB.Free;
    顺便说一句,加密后保存到表中数据均为:’=p=‘,而单击浏览按纽,也就是从数据库中取出,解密后仍为’=p=‘请在帮我看看(也许表达有些混乱,竟请原谅)
      

  3.   

    这样应该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
      

  4.   

    反过程,解密:
    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;