Tmemo里搜索指定的信息

simeng1128 2008-04-24 10:00:23
我将一个oracle数据库脚本的升级日志输出到memo组件里。现在想从Tmemo的显示信息中,找出所有的错误信息。例如以ora开头的:ORA-00955: name is already used by an existing object;
ORA-00942: table or view does not exist等。然后将这些错误信息输出到一个对象里以供后续处理。请问这个查询的函数该怎么写。最好能有实现的源代码。我刚接触,对delphi的函数不是很熟。现在又急用。谢谢各位了!
...全文
188 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
simeng1128 2008-04-28
  • 打赏
  • 举报
回复
谢谢了。结贴了。我也不想问了,只是要求不断再增加。我什么都不会,学也没那么快啊!应急。先把任务完成再说。
GDTOPONE 2008-04-28
  • 打赏
  • 举报
回复
上面的漏了一个符号,应该是这样:

procedure TForm1.ListBox1DblClick(Sender: TObject);
var
i:integer;
begin
{-------------ListBox1的双激事件------------------}
if ListBox1.Items.Count>0 then
if not(ListBox1.ItemIndex=-1) then
begin
with Memo1 do begin
i:=Lines.IndexOf(ListBox1.Items.Strings[ListBox1.ItemIndex]);{-刚才这里漏了个等号-}
if i>=0 then begin
SelStart:=SendMessage(Memo1.Handle,EM_LINEINDEX,i,0);
SetFocus;
SelLength:=length(ListBox1.Items.Strings[ListBox1.ItemIndex]);
end;
end;
end;
end;


GDTOPONE 2008-04-28
  • 打赏
  • 举报
回复
希望这次不要再加问题了,明明是一个问题,现在变成了两个,再加下去就会没完没了!
GDTOPONE 2008-04-28
  • 打赏
  • 举报
回复

procedure TForm1.ListBox1DblClick(Sender: TObject);
var
i:integer;
begin
{-------------ListBox1的双激事件------------------}
if ListBox1.Items.Count>0 then
if not(ListBox1.ItemIndex=-1) then
begin
with Memo1 do begin
i:Lines.IndexOf(ListBox1.Items.Strings[ListBox1.ItemIndex]);
if i>=0 then begin
SelStart:=SendMessage(Memo1.Handle,EM_LINEINDEX,i,0);
SetFocus;
SelLength:=length(ListBox1.Items.Strings[ListBox1.ItemIndex]);
end;
end;
end;
end;
simeng1128 2008-04-28
  • 打赏
  • 举报
回复
谢谢GDTOPONE
我可能还要进一步完善。比如我存放日志信息的memo里有1000行这种错误信息,反正就是海量的。现在你的程序能够搜索出所有的"ORA-"信息。如果现在我要实现定位怎么办?比如过滤出来的信息里有“ORA-00942: table or view does not exist ”。我想知道它在日志信息(即memo内容)的哪一行,双击它光标就能定位过去。就像你在VC里面调试程序时一样。关键是这个技术怎么实现?你能帮我吗?这是最后一个要求了,先发自内心的谢谢。完成就送分结贴了。
simeng1128 2008-04-27
  • 打赏
  • 举报
回复
欢迎大家继续留言啊!弄好了就结贴。
GDTOPONE 2008-04-27
  • 打赏
  • 举报
回复
例如我想按你的要求将找出来的信息存到ListBox中去等待进一步处理:
1.相关方法:

procedure TForm1.l_inlist(str:string);
var
i:integer;
begin
{-----其中str参数是要查找的字串--------}
for i :=0 to Memo1.Lines.Count-1 do
if pos(AnsiUpperCase(str),AnsiUpperCase(Memo1.Lines.Strings[i]))>0 then
ListBox1.Items.Add(Memo1.Lines.Strings[i]);
end;


2.调用:

procedure TForm1.Button1Click(Sender: TObject);
begin
{--edit1输入要查找的字串,也就是你说的ora开头的字串}
l_inlist(edit1.Text);
end;
simeng1128 2008-04-26
  • 打赏
  • 举报
回复
嗯!谢谢SmallHand,你的方法我试试,可能与我的最新需求比较接近吧!那些信息要分别提取。
simeng1128 2008-04-26
  • 打赏
  • 举报
回复
谢谢blazingfire, 你写的很好。不过要求不断在提到,我是在做一个毕业设计,4月底要完工。头疼啊!编程基本很差,delphi还是刚用,什么都得从基本的看起。我才学那些组件呢。现在又要我把信息分类存储。错误号,错误信息,所在的行号分别存起来。基本都是这样的信息:
update TMARKETINFO set vc_country_no = 'CN' where vc_country_no is null
*
ERROR 位于第 1 行:
ORA-00942: table or view does not exist


update TMARKETINFO set vc_currency_no = 'CNY' where vc_currency_no is null
*
ERROR 位于第 1 行:
ORA-00942: table or view does not exist
我再看看吧?自己都不好意思问了。再次感谢啊!
火龙岛主 2008-04-25
  • 打赏
  • 举报
回复
type
PMyError = ^TMyError;
TMyError = record
Name: string;
Content: string;
end;
...
var
PMyE : PMyError;

try
...
except
on E: Exception do
new(PMyE);
PMyE^.Name := copy(E.Message, 1, 9); //取得ORA-00942错误号码
PMyE^.Content := E.Message; //存储错误内容。
memo1.lines.addObject(PMyE^.Name, PMyE);
end;

blazingfire 2008-04-25
  • 打赏
  • 举报
回复
将TStringList内容放到Memo也非常简单:
var
List: TStringList;
begin
....
Memo1.Lines.Assign(List);
end;
blazingfire 2008-04-25
  • 打赏
  • 举报
回复
用结构体不好,存字符串在D中有一个很好的类型类叫TStringList继承自TStrings。TMemo.Lines也是TStrings类型
var
i: Integer;
S: string;
List: TStringList;
begin
List := TStringList.Create; //创建一个TStringList对象
try
for i := 0 to Memo1.Lines.Count - 1 do
begin
S := Trim(UpperCase(Memo1.Lines[i]));
if Pos('ORA-', S) = 1 then //Pos函数在大串里找小串
List.Add(Memo1.Lines[i]); //把搜索到的串加到TStringList
end;
List.SaveToFile('D:\1.txt'); //把TStringList中的串存成文本文件
finally
List.Free;
end;
end;
pengxuan 2008-04-25
  • 打赏
  • 举报
回复
顶楼上
simeng1128 2008-04-25
  • 打赏
  • 举报
回复
我补充一下。将检索到的信息保存到一个结构体里吧!这样方便程序的可重用性,以后可以根据不同的需求去输出。谢谢了。delphi的语法我不熟。
simeng1128 2008-04-25
  • 打赏
  • 举报
回复
谢谢blazingfire!你写的可以搜索出所有的要检索的内容。但是结果不要显示成ShowMessage的形式,可不可以把搜索到的信息保存下来。例如输出到一个文本里或者直接显示在当前的TMemo里?
blazingfire 2008-04-24
  • 打赏
  • 举报
回复
var
i: Integer;
S: String;
begin
for i :=0 to Memo1.Lines.Count - 1 do
begin
S := Trim(UpperCase(Memo1.Lines[i]));
if Pos('ORA-', S) =1 then//Pos函数在大串里找小串
ShowMessage(Memo1.Lines[i]);
end;
end;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧