Отображение накопленных сообщений пользователю - PullRequest
4 голосов
/ 28 января 2011

Я хочу показать пользователю сводку всех соответствующих сообщений, которые произошли во время выполнения кода (например, анализ, алгоритм, преобразование, проверка и т. Д.).Сообщения должны быть показаны вместе, когда процесс завершен.

Подобный инцидент может произойти ни один, один или несколько раз.Пользователь должен быть уведомлен, если произошел инцидент.Может быть несколько типов инцидентов.

Я не уверен, ясен ли сценарий, но, возможно, какой-то код поможет:

PSEUDO-CODE:

begin
  //Execute computing process//
  repeat
    Set a flag if an incident occurs
    Set another flag if another incident occurs
  until done

  //Show message to user//
  if AnyFlagIsSet then
    ShowPrettyMessageToUser     
end;

ИСПОЛНИМЫЙ КОД DELPHI:

program Test;

{$APPTYPE CONSOLE}

uses
  SysUtils, StrUtils;

var
  i: Integer;
  tmpFlags: Array[1..4] of Boolean;
  tmpMessage: String;
  tmpChar: Char;
begin
  Randomize;
  repeat
    //Initialization//
    for i := 1 to 4 do
      tmpFlags[i] := False;

    //Will insident occur?//
    for i := 0 to 5 do
    begin
      if (Random(10) = 0) then tmpFlags[1] := True;
      if (Random(10) = 0) then tmpFlags[2] := True;
      if (Random(10) = 0) then tmpFlags[3] := True;
      if (Random(10) = 0) then tmpFlags[4] := True;
    end;

    //Show message//
    tmpMessage := '';
    if tmpFlags[1] then tmpMessage := tmpMessage + IfThen(tmpMessage <> '', #13#10+#13#10) + 'Incident 1';
    if tmpFlags[2] then tmpMessage := tmpMessage + IfThen(tmpMessage <> '', #13#10+#13#10) + 'Incident 2';
    if tmpFlags[3] then tmpMessage := tmpMessage + IfThen(tmpMessage <> '', #13#10+#13#10) + 'Incident 3';
    if tmpFlags[4] then tmpMessage := tmpMessage + IfThen(tmpMessage <> '', #13#10+#13#10) + 'Incident 4';

    Writeln('----------');
    Writeln(tmpMessage);
    Writeln('----------');

    Writeln;
    Write('Again? (Y/N) ');
    Readln(tmpChar);
  until tmpChar <> 'y';
end.

Конечно, код в итерации довольно сложен в реальной жизни.И сообщения также более информативны и могут даже быть отформатированы и многострочны.

Итак ...

Есть ли лучшая практика или шаблон, который может бытьиспользуется для этого?
Любой Delphi-компонент, который обрабатывает это?

Ответы [ 2 ]

11 голосов
/ 28 января 2011

Простым решением будет использование TStringList для сбора всех сообщений.Затем можно отобразить строки в списке или объединить строки (в этом случае все сообщения должны быть действительными предложениями).

Псевдокод:

procedure DoSomething(Log : TStrings);
begin
//...
Log.Add ('Some hint.');
//...
Log.Add ('Some error happened.');
//...
end;

DoSomething (Log);
if (Log.Count > 0) then
  LogListBox.Items.AddStrings (Log);

ДляОтформатированные или многострочные сообщения. Вы можете хранить строки HTML в списке строк и использовать компонент, который может отображать текст в формате HTML, для отображения сообщений.

Редактировать: Если вы не хотите дублировать сообщенияпросто сделай

Log.Duplicates := dupIgnore;
1 голос
/ 29 января 2011

Я бы (где требования к памяти не имеют значения) создал бы класс, который использует хешированный список строк в качестве каталога, где X число «логитемов» может быть вставлено как объекты. Это позволяет некоторый контроль над тем, как элементы группируются. Получая доступ к списку строк с помощью обычного индекса - вы получаете линейную шкалу времени. Но, получая доступ к элементам через его хэш-ключи, вы получаете элементы, сгруппированные по содержимому. С использованием хешированного списка строк работать намного быстрее, поскольку он использует таблицу соответствия.

Для общего решения для всего приложения я использовал TClientDataset библиотеки midas, который был с Delphi целую вечность. Просто не забудьте объявить «midaslib» первым модулем в вашем проекте, и он будет напрямую связан с вашим бинарным файлом (не нужно отправлять midaslib.dll). Это дает вам преимущество полей и сортировки по типам сообщений / ошибок. До тех пор, пока количество записей не превысит 10 КБ, работать с ним будет быстро и стабильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...