我将一个oracle数据库脚本的升级日志输出到memo组件里。现在想从Tmemo的显示信息中,找出所有的错误信息。例如以ora开头的:ORA-00955: name is already used by an existing object;
ORA-00942: table or view does not exist等。然后将这些错误信息输出到一个对象里以供后续处理。请问这个查询的函数该怎么写。最好能有实现的源代码。我刚接触,对delphi的函数不是很熟。现在又急用。谢谢各位了!

解决方案 »

  1.   

    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;
      

  2.   

     谢谢blazingfire!你写的可以搜索出所有的要检索的内容。但是结果不要显示成ShowMessage的形式,可不可以把搜索到的信息保存下来。例如输出到一个文本里或者直接显示在当前的TMemo里?
      

  3.   

    我补充一下。将检索到的信息保存到一个结构体里吧!这样方便程序的可重用性,以后可以根据不同的需求去输出。谢谢了。delphi的语法我不熟。
      

  4.   

    用结构体不好,存字符串在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;
      

  5.   

    将TStringList内容放到Memo也非常简单:
    var
      List: TStringList;
    begin
    ....
      Memo1.Lines.Assign(List);
    end;
      

  6.   

    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;
      

  7.   

    谢谢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
    我再看看吧?自己都不好意思问了。再次感谢啊!
      

  8.   

      嗯!谢谢SmallHand,你的方法我试试,可能与我的最新需求比较接近吧!那些信息要分别提取。
      

  9.   

    例如我想按你的要求将找出来的信息存到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;
      

  10.   

    谢谢GDTOPONE
    我可能还要进一步完善。比如我存放日志信息的memo里有1000行这种错误信息,反正就是海量的。现在你的程序能够搜索出所有的"ORA-"信息。如果现在我要实现定位怎么办?比如过滤出来的信息里有“ORA-00942: table or view does not exist ”。我想知道它在日志信息(即memo内容)的哪一行,双击它光标就能定位过去。就像你在VC里面调试程序时一样。关键是这个技术怎么实现?你能帮我吗?这是最后一个要求了,先发自内心的谢谢。完成就送分结贴了。
      

  11.   


    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;
      

  12.   

    上面的漏了一个符号,应该是这样: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;