Delphi 日志输出记录类

{ ******************************************************* }
{ 单元名:  UntTIO.pas }
{ 创建日期:2006-1-14 23:20:08 }
{ 创建者    马敏钊 QQ 22900104 }
{ 功能:    I/O单元 }
{ }
{ ******************************************************* }

unit UntTIO;

interface

uses
  Classes,
  SysUtils,
  ComCtrls,
  Graphics;

type
  T日志类型枚举 = (
    日志类型_信息,
    日志类型_公告,
    日志类型_警告,
    日志类型_错误,
    日志类型_报告);

type
  TGameLogFile = class
    private
      F_日志文件名 : string;
      F_文本文件  : TextFile;

    public
      { 带入日志文件存放的目录位置 }
      constructor Create(
        sz日志文件地址 : string = '\Log\';
        b是否替换    : boolean = false);
      destructor Destroy; override;
      { 写入内容即可自动记录 }

      procedure 添加内容(
        sz解析文本         : string;
        const Args参数参数 : array of const;
        const 日志类型     : T日志类型枚举 = 日志类型_信息); overload;
      procedure 添加内容(
        sz文本       : string;
        const 日志类型 : T日志类型枚举 = 日志类型_信息); overload;
  end;

  TEventShowed = procedure(ILogCon : string) of object;

  TIOer = class(TObject)
    private
      F_是否添加时间   : boolean;      // 是否在每条显示前加时间
      F_显示后事件    : TEventShowed; // 显示后触发的事件 可以用来做日志
      F_是否需要分割字符 : boolean;      // 是否需要分割字符
      F_分割字符串    : string;       // 分割的字符
      F_日志       : TGameLogFile;
    protected
      F_显示容器 : TComponent; // 容器
      F_清空上限 : Word;       // 显示多少条后清空一下

      function 添加内容(
        sz文本       : string;
        const 日志类型 : T日志类型枚举 = 日志类型_信息) : Integer; virtual;

    public
      Enabled : boolean;

      function 输出日志(
        sz解析文本       : string;
        const Args参数 : array of const;
        const 日志类型    : T日志类型枚举 = 日志类型_信息) : Integer; overload;
      function 输出日志(
        sz文本       : string;
        const 日志类型 : T日志类型枚举 = 日志类型_信息) : Integer;
        overload;
      { 如果带入记录文件存放路径的话就自动生成记录类 }
      constructor Create(
        p容器     : TComponent;
        sz日志文件名 : string = '');
      destructor Destroy; override;
      property 清空上限 : Word
        read   F_清空上限
        write  F_清空上限;
      property 是否添加时间 : boolean
        read   F_是否添加时间
        write  F_是否添加时间;
      property 是否需要分割字符 : boolean
        read   F_是否需要分割字符
        write  F_是否需要分割字符;
      property 分割字符串 : string
        read   F_分割字符串
        write  F_分割字符串;
      property 显示后事件 : TEventShowed
        read   F_显示后事件
        write  F_显示后事件;
  end;

implementation

uses
  StdCtrls,
  Forms;

const
  { 分割符号 }
  CSplitStr = '===============================================================';
  ClogFileName = '.txt';
  { TGameLogFile }

procedure TGameLogFile.添加内容(
  sz解析文本         : string;
  const Args参数参数 : array of const;
  const 日志类型     : T日志类型枚举 = 日志类型_信息);
begin
  添加内容(Format(sz解析文本, Args参数参数), 日志类型);
end;

procedure TGameLogFile.添加内容(
  sz文本       : string;
  const 日志类型 : T日志类型枚举 = 日志类型_信息);
begin
  Writeln(F_文本文件, sz文本);
  CloseFile(F_文本文件);
  Append(F_文本文件);
end;

constructor TGameLogFile.Create(
  sz日志文件地址 : string;
  b是否替换    : boolean);
begin
  F_日志文件名 := sz日志文件地址 + FormatDateTime('yyyymmdd-hhnnss', Now()) + '.log';

  // 如果不存在路径就创建它
  if not DirectoryExists(sz日志文件地址) then
  begin
    if not ForceDirectories(sz日志文件地址) then
    begin
      raise
        Exception.Create('错误的路径,日志类对象不能被创建');
    end;
  end;

  // 如果已经存在文件, 并且不替换
  Assignfile(F_文本文件, F_日志文件名);
  if ((FileExists(F_日志文件名)) and ( not b是否替换)) then
    Append(F_文本文件) // 追加
  else
    ReWrite(F_文本文件); // 重写
end;

destructor TGameLogFile.Destroy;
begin
  try
    CloseFile(F_文本文件);
  except
  end;
  inherited;
end;

{ TGameIO }

function TIOer.输出日志(
  sz解析文本       : string;
  const Args参数 : array of const;
  const 日志类型   : T日志类型枚举 = 日志类型_信息) : Integer;
begin
  Result := 0;
  try
    输出日志(Format(sz解析文本, Args参数), 日志类型);
  except
  end;
end;

function TIOer.输出日志(
  sz文本      : string;
  const 日志类型    : T日志类型枚举 = 日志类型_信息) : Integer;
begin
  if F_是否添加时间 then
    sz文本 := DateTimeToStr(Now) + ' ' + sz文本;
  if F_是否需要分割字符 then
    sz文本 := sz文本 + #13#10 + F_分割字符串;
  Result := 添加内容(sz文本, 日志类型);
  if assigned(F_日志) then
    F_日志.添加内容(sz文本);
  if assigned(F_显示后事件) then
    F_显示后事件(sz文本);
end;

constructor TIOer.Create(
  p容器     : TComponent;
  sz日志文件名 : string);
begin
  F_清空上限     := 1000;
  F_是否添加时间   := True;
  F_是否需要分割字符 := false;
  F_分割字符串    := CSplitStr;
  F_显示容器     := p容器;
  Enabled    := True;
  if sz日志文件名 <> '' then
    F_日志 := TGameLogFile.Create(sz日志文件名);
end;

destructor TIOer.Destroy;
begin
  if assigned(F_日志) then
    F_日志.Free;
  inherited;
end;

function TIOer.添加内容(
  sz文本      : string;
  const 日志类型    : T日志类型枚举 = 日志类型_信息) : Integer;
var
  ListItem : TListItem;
begin
  Result := - 1;
  if Application.Terminated then
    exit;
  if ( not Enabled) then
    exit;
  if (F_显示容器 is TMemo) then
  begin
    Result := TMemo(F_显示容器).Lines.Add(sz文本);
    if Result >= F_清空上限 then
      TMemo(F_显示容器).Clear
  end
  else if (F_显示容器 is TRichEdit) then
  begin
    case 日志类型 of
      日志类型_信息: TRichEdit(F_显示容器).SelAttributes.Color := clBlue;
      日志类型_公告: TRichEdit(F_显示容器).SelAttributes.Color := clblack;
      日志类型_警告: TRichEdit(F_显示容器).SelAttributes.Color := clblack;
      日志类型_错误: TRichEdit(F_显示容器).SelAttributes.Color := clred;
      日志类型_报告: TRichEdit(F_显示容器).SelAttributes.Color := clblack;
    end;

    Result := TRichEdit(F_显示容器).Lines.Add(sz文本);
    if Result >= F_清空上限 then
      TRichEdit(F_显示容器).Clear
  end
  else if (F_显示容器 is TListBox) then
  begin
    Result := TListBox(F_显示容器).Items.Add(sz文本);
    if Result >= F_清空上限 then
      TListBox(F_显示容器).Clear
  end
  else if (F_显示容器 is TListView) then
  begin
    ListItem            := TListView(F_显示容器).Items.Add;
    ListItem.Caption    := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now);
    ListItem.ImageIndex := ord(日志类型);
    ListItem.SubItems.Add(sz文本);
    if TListView(F_显示容器).Items.Count >= F_清空上限 then
      TListView(F_显示容器).Items.Clear;
  end
  else
    raise Exception.Create('默认容器错误:' + F_显示容器.ClassName);
end;

end.

//调用方法,  拖一个Rich
var
  AppPath : string;
  Gio     : TIOer;
procedure TForm1.FormCreate(Sender : TObject);
begin
  AppPath := ExtractFilePath(Application.ExeName);
  Gio     := TIOer.Create(RichEdit1, AppPath + 'Log\');
  Gio.输出日志('聊天服务端演示程序...', 日志类型_信息);
  Gio.输出日志('聊天服务端演示程序2...', 日志类型_错误);


你可能感兴趣的:(Delphi 日志输出记录类)