高手们,帮帮忙,小弟感激不尽:
看看,代码出错在哪:
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='快帮我看看,行家们
看看,代码出错在哪:
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='快帮我看看,行家们
richedit1.text;顯示的內容正常嗎??
MemStreamB.Position:=0;
??????
...
...AChar:=chr(ord(AChar) xor $61);//异或解密,数字可自定,在$00-$FF之间,同加密数字
MemStreamb.Write(AChar,1);
end;
MemStreamb.Position:=0; //是要加這個
richedit1.Lines.LoadFromStream(memstreamb);
richedit1.Lines.LoadFromStream(memstreamb);现在情况是这样的,无论编辑什么内容,保存后在数据表中显示全为:‘=p=’,
点击浏览也全为:‘=p=’
换成Memo后就可以了,我试过了
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
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;
我试过了,还和以前一样
存入数据表中和提出显示都仍为::‘=p=’
应该是
procedure TForm1.SpeedButton1Click(Sender: TObject);
beginend;
事件的执行体, 我在Copy时错把它到
procedure TForm1.TreeView1Click(Sender: TObject);
你看一下是不是这个问题.
由于我电脑上没有数据库,做这方面测试比较麻烦。所以不能帮你了.
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;
名下.
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.
如果还出错,请你仔细检查数据库读写代码.
你这样异或加密,加密结果中会产生#0字符(串结尾),又使用串操作,出错的机率极大。
二、RichEdit的数据有一定的格式,你把它的数据搞得乱七八糟,又交给它,不出错才怪?