Автоматическое обновление лога в TMemo при добавлении записей в TStringList класса
Вопрос, который выставил перед нами пользователь, связан с реализацией функций логирования в классе, использующем TStringList для хранения логов. Основная задача заключается в том, чтобы обеспечить возможность отображения содержимого TStringList в контроле, например, TMemo, на отдельной форме, не связывая при этом класс напрямую с формой.
Решение проблемы
Для решения задачи можно использовать механизм обратного вызова (callback). Класс, содержащий TStringList, будет иметь метод для установки обратного вызова, который будет вызываться при добавлении новой записи в лог.
Пример кода на Object Pascal (Delphi)
Type
TLogCallback = procedure(const ALogStr: String) of object;
TMyLogger = Class
private
FLogFile: TStringList;
FCallback: TLogCallback;
public
constructor Create;
procedure AddToLog(const ALogText: String);
property Callback: TLogCallback read FCallback write SetCallback;
private
procedure SetCallback(const Value: TLogCallback);
end;
{ TMyLogger }
constructor TMyLogger.Create;
begin
FLogFile := TStringList.Create;
FCallback := nil;
end;
procedure TMyLogger.SetCallback(const Value: TLogCallback);
begin
FCallback := Value;
end;
procedure TMyLogger.AddToLog(const ALogText: String);
begin
FLogFile.Add(ALogText);
if Assigned(FCallback) then
FCallback(ALogText);
end;
procedure TMyLogger.SetCallback(Value: TLogCallback);
begin
FCallback := Value;
end;
{ VCL }
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FLogger: TMyLogger;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FLogger := TMyLogger.Create;
try
FLogger.Callback := procedure(const S: String)
begin
Memo1.Lines.Add(S);
end;
finally
FLogger.AddToLog('Пример записи в лог');
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FLogger.Free;
inherited;
end;
Форма, использующая TMyLogger
На форме, где используется TMemo для отображения лога, следует зарегистрировать обработчик событий для вызова при получении новой записи лога.
procedure TForm1.FormCreate(Sender: TObject);
begin
// Создание и инициализация логгера
FLogger := TMyLogger.Create;
try
// Привязка обработчика событий формы к логгеру
FLogger.Callback := MemoUpdate;
// Добавление начальной информации для демонстрации
FLogger.AddToLog('Система логирования запущена');
end;
end;
procedure MemoUpdate(const ALogText: String);
begin
Memo1.Lines.Add(ALogText);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
// Освобождение ресурсов логгера
FLogger.Free;
inherited;
end;
Автономность класса
Таким образом, класс TMyLogger становится автономным и может быть использован в различных проектах без необходимости изменять свой код, при этом обеспечивая возможность интеграции с различными компонентами интерфейса пользователя, такими как TMemo, для отображения логических сообщений.
Вывод
Мы рассмотрели, как можно организовать логирование в классе, используя TStringList для хранения логов, и как обеспечить автоматическое обновление содержимого контрола TMemo на форме при добавлении новых записей в лог, не связывая при этом класс напрямую с формой. Это позволяет сохранить чистоту архитектуры приложения и упростить его поддержку и расширение.
Автоматическое обновление лога в `TMemo` при добавлении записей в `TStringList` класса достигается через механизм обратного вызова, позволяя контролу `TMemo` отображать содержимое `TStringList` без прямой связи класса с формой.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.