2011-01-28 3 views
4

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

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

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

псевдокод:

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; 

EXECUTABLE 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, который обрабатывает это?

ответ

11

Простым решением было бы использовать 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 строки в StringList и использовать компонент, который может отображать HTML форматированный текст для отображения сообщений.

Edit: Если вы не хотите, не повторяющихся сообщений, просто сделать

Log.Duplicates := dupIgnore; 
+0

@Smasher: Мне нравится этот, и я много использую TStringList (может быть, слишком много). Но как вы можете проверить, зарегистрировано ли сообщение? «Какой-то намек». следует добавлять только в список один раз. Вы не хотите показывать «Документ содержит недопустимый символ [s]» несколько раз. –

+0

Я отредактировал ответ. Вы можете просто установить 'TStringList.Duplicates' в' dupIgnore'. – jpfollenius

+0

Конечно, но 'dupIgnore' требует, чтобы список отсортировался. Это может не всегда быть предпочтительным ... –

1

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

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

Смежные вопросы