奇怪的流(100分)

K

kifo

Unregistered / Unconfirmed
GUEST, unregistred user!
这段错了,请大家看看是怎么回事。
代码:
var
      I:integer;
      std: TMemoryStream;
begin  
    with ADOQuery3 do Begin
        close;
        SQL.Clear;
        SQL.Add('select * from issue where subtitle');
        Prepared;
        open;
    End;
    while not ADOQuery3.eof do begin
        RichEdit2.Lines.Clear ;
        std := TMemoryStream.Create;
        try
           TBlobField(Adoquery3.FieldByName('content')).SaveToStream(std);//1
           std.Position := 0;
           RichEdit2.Lines.LoadFromStream(std);//1            
           std.Free;
        Finally
           std.Free;
        end;
        adoquery3.Next;
    end;
end;
提示的错误的一种是"Access violation at address 00000000.read of address 00000000."
把程序中标//1的语句去掉,只做Next还错。如果不创建流,就没问题,如果创建了流但不用
adoquery3.Next也没问题。当然已连接了数据库。
真的奇怪。
另,用这个代码段的原因是content字段中存的RTF格式的资料,希望在其中查找一个字串是否
被包含。想不出好办法,只好把它全倒出来到一个richedit,再在richedit中找。有没有其它
办法?
当然,最好也能解决第一个奇怪的问题。
 
try
TBlobField(Adoquery3.FieldByName('content')).SaveToStream(std);//1
std.Position := 0;
RichEdit2.Lines.LoadFromStream(std);//1
std.Free;//这一句没必要吧?
Finally
std.Free;
end;
adoquery3.Next;
end;
 
To jifee,是的,std.Free是没必要,去掉也没用。
加这句是我在一开始测试的时候死机了,我认为可能是std没有Free的问题,加上了就没有去掉。
 
function Search(stream:TMemoryStream;S:String):Boolean;
Var
I:Integer;
Str0:Char;
begin
Result:=False;
While stream.Position < stream.size do
begin
stream.ReadBuffer(str0,1);
if (str0:=S) then
Inc
else
I:=1;
if I:=Length(S)+1 then
begin
Result:=True;
Exit;
end;
end;
end;
 
function Search(stream:TMemoryStream;S:String):Boolean;
Var
I:Integer;
Str0:Char;
begin
Result:=False;
While stream.Position < stream.size do
begin
stream.ReadBuffer(str0,1);
if (str0:=S) then
Inc
else
I:=1;
if I:=Length(S)+1 then
begin
Result:=True;
Exit;
end;
end;
end;
 
不行啊,
1、我没办法把字段顺序读到流中,一读就错;见>>这段错了,请大家看看是怎么回事。
2、就算能读吧,流中的数据也是RTF格式的,用S:string;能查吗?这个我不知道,但因为不能
读也没办法试。
 
这段代码好像有问题啊。
比如stream是‘12345’,S是‘25’,也会返回true的啊。
 
jstkof说得对,jifee好像把S拆开了。
 
procedure TForm1.Button1Click(Sender: TObject);
var
ABS: TADOBlobStream;
begin
with ADOQuery3 do
begin
Close;
SQL.Clear;
SQL.Add('select * from issue where subtitle');
Prepared;
Open;
end;
while not ADOQuery3.Eof do
begin
RichEdit2.Lines.Clear ;
ABS := TADOBlobStream.Create(TBlobField(Adoquery3.FieldByName(
'content')),bmRead);
try
RichEdit2.Lines.LoadFromStream(ABS);
finally
ABS.Free;
end;
ADOQuery3.Next;
end;
ADOQuery3.Close;
end;
 
To Sachow,
高手啊。对了。
不过,你能给我解释一下为什么用了ABS: TADOBlobStream;就行,而用std: TMemoryStream;
不行呢。
当然,无论你回不回答,十五分钟后,给你分。
 
function Search(stream:TMemoryStream;S:String):Boolean;
Var
I:Integer;
Str0:Char;
begin
Result:=False;
I:=1;
While stream.Position < stream.size do
begin
stream.ReadBuffer(str0,1);
if str0=S then
Inc(I)
else
I:=1;
if I=Length(S)+1 then
begin
Result:=True;
Exit;
end;
end;
end;

procedure TForm6.Button2Click(Sender: TObject);
Var
stream:TMemoryStream;
begin
stream:=TMemoryStream.Create;
memo1.Lines.SaveToStream(stream);
stream.Position:=0;
if Search(stream,'1234') then ShowMessage('OK!');
stream.Free;
end;
调试通过呀!
 
对中文也适用!
function SearchInStream(stream:TMemoryStream;S:String):Boolean;
Var
I:Integer;
Str0:Char;
begin
stream.Position:=0;
Result:=False;
I:=1;
While stream.Position < stream.size do
begin
stream.ReadBuffer(str0,1);
if str0=S then
Inc(I)
else
I:=1;
if I=Length(S)+1 then
begin
Result:=True;
ShowMessage('Found at position '+IntToStr(stream.Position-Length(S)));
Exit;
end;
end;
end;

procedure TForm6.Button2Click(Sender: TObject);
Var
stream:TMemoryStream;
begin
stream:=TMemoryStream.Create;
memo1.Lines.SaveToStream(stream);
SearchInStream(stream,'我');
stream.Free;
end;
 
对不啦jifee,你的回答对我也很有帮助,到
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1184615
来拿分吧。
 
SaveToStream的方法也是可以的,你最初的代码只是错在finally前面已经做了一次Free,之
后又再做了一次,这就是导致你的程序出现"Access violation at address 00000000.read of address 00000000."
错误的原因。
 
顶部