Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.10.2010, 18:19
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию Лог файл

Здравствуйте у меня есть система логов, то есть копирование текста из программы в тхт файл. Дак вот возникла надобность сделать имена логов как дата и время. Т.е. к примеру 18ч01м2009г19ч18м32с.txt
Дак вот проблема в том, что мне надо, что бы когда пользователь запустил программу и прошло 10 секунд (таймер у меня уже есть) создался лог файл и при прохождение ещё 10 секунд, не создавался бы лог файл, а записывался в первый и так пока программа не будет закрыта и запущена снова. Пытался сделать, вот последние мои опыты:

Код:
procedure Timelog(i:integer);
var lt: TSYSTEMTIME;
s:string;
begin
GetLocalTime(lt);
if (i = 1) then
AddLog(form1.script.Text,s+'.txt')
else
s:= IntToStr(lt.wDay) + 'ч' +
    IntToStr(lt.wmonth) + 'м' +
    IntToStr(lt.wYear) + 'г' +
    IntToStr(lt.wHour) + 'ч' +
    IntToStr(lt.wMinute) + 'м' +
    IntToStr(lt.wSecond) + 'с';
    AddLog(form1.script.Text,s+'.txt');
    end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
i:=i+1;
if (form13.ComboBox1.ItemIndex = 2) then
Timer1.Enabled:=false
else
if (i=1) then
Timelog(0)
else
Timelog(1);
end;
Это я пытался сделать через переменную, якобы когда срабатывает первый таймер, переменная i получает значение 1, а когда следующие на единицу больше, вот так проверку построил, но не выходит. Так же пытался в процедуре таймер проверить на длинну s. Так же безрезультатно.
Подскажите пожалуйста.
Ответить с цитированием
  #2  
Старый 08.10.2010, 18:33
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Не совсем понял вопрос, но если вам необходимо создавать файл лога с названием даты, то можно это сделать очень просто:
TimeToStr(Time) - возвратит время (например: 17:31:51)
DateToStr(Date) - возвратит саму дату.

Записывать в файл я думаю вы умеете, создаете файл (вот пример):
Код:
var
f:textfile;
begin
...
AssignFile(f, 'C:\'+DateToStr(Date)+'.txt');
// и потом уже записываете в сам файл (например reset(f) и бла бла бла)
...
CloseFile(f);
__________________
Помогаю за Спасибо
Ответить с цитированием
  #3  
Старый 08.10.2010, 18:38
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию

Этот вариант не устраивает так как, в файлах не должно быть двоеточий, винда не позволяет.
Ответить с цитированием
  #4  
Старый 08.10.2010, 19:00
Аватар для Sky.NET
Sky.NET Sky.NET вне форума
Прохожий
 
Регистрация: 22.09.2010
Сообщения: 49
Версия Delphi: XE
Репутация: 12
По умолчанию

А что мешает заменить двоеточия на другой символ?
__________________
IDE := Embarcadero.RADStudio.XE.Architect
// Успешность метода научного тыка обратно пропорциональна извилистости головного мозга на кривизну рук ©
Ответить с цитированием
  #5  
Старый 08.10.2010, 19:05
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Цитата:
Сообщение от Sky.NET
А что мешает заменить двоеточия на другой символ?


Пройтись циклом по полученной строке приеняя StuffString функцию
Ответить с цитированием
  #6  
Старый 08.10.2010, 19:10
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Как я понял, вам необходимо добавлять в лог каждые 10сек некие записи.
Можно конечно на каждый сеанс делать свой лог-файл, но мне кажется лучше сделать один лог-файл с разделами для каждого сеанса.
Для этого мне кажется очень удобно воспользоваться классом TIniFile. Выглядеть тогда это будет так:
Код:
unit Unit7;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls, IniFiles;

type
  TForm7 = class(TForm)
    ProgressBar1: TProgressBar;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    Log: TIniFile;
    StartApp: String;
  public
    { Public declarations }
  end;

var
  Form7: TForm7;

implementation

{$R *.dfm}

procedure TForm7.FormCreate(Sender: TObject);
begin
 StartApp := DateTimeToStr(Now);
end;

procedure TForm7.FormDestroy(Sender: TObject);
begin
 Log.Free;
end;

procedure TForm7.Timer1Timer(Sender: TObject);
begin
 Log := TIniFile.Create(ExtractFilePath(ParamStr(0))+'Journal.log');
 Log.WriteString(StartApp,DateTimeToStr(Now),'... и они еще посидели немножко.');
 ProgressBar1.StepIt;
 Application.ProcessMessages;
 if ProgressBar1.Position = ProgressBar1.Max then Close;
end;

end.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 08.10.2010 в 19:13.
Ответить с цитированием
  #7  
Старый 08.10.2010, 19:24
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию

Возможно так удобнее, но не для моего случая. В ричедите может быть строк более 500. А потом в 1 файле искать определённую сессию не удобно.

Цитата:
Сообщение от Uniq!
Пройтись циклом по полученной строке приеняя StuffString функцию
Да такой вариант то же можно, но месяц может поменяться например было 9 месяц, прошёл месяц и стал 10. Тогда уже кол-во символов поменяется. Так же с секундами минутами и т.п.

Последний раз редактировалось Мяфк, 08.10.2010 в 19:27.
Ответить с цитированием
  #8  
Старый 08.10.2010, 19:36
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Не знаю, надо это тебе или нет, то может поможет:
ВСЕ функции для работы с временем/датой в делфи:
http://www.cyberguru.ru/programming/...t1-page11.html
Вот еще:
http://www.codenet.ru/progr/delphi/O...l/datetime.php
__________________
Помогаю за Спасибо
Ответить с цитированием
  #9  
Старый 08.10.2010, 19:58
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

А вам не все равно откуда грузить данные в рич за сеанс, из файла или из секции? И в первом и втором случае вы будете из списка файлов/секций выбирать нужный и загружать, но в случае множества файлов имеем загромождение каталога, лишнюю трату дискового пространства на каждый файл да еще лишние телодвижения на открытие/закрытие нужного файла.
В моем-же варианте можно сразу грузить нужную секцию в рич:
Код:
 Log.ReadSection('08.10.2010 19:07:52',RichEdit1.Lines);
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #10  
Старый 08.10.2010, 21:26
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию

Да как бы логи мне нужны, что бы просматривать их не програмно, а в обычном текстовике. Ну можно и такой вариант, посмотрю. Спасибо.
Ответить с цитированием
  #11  
Старый 08.10.2010, 23:27
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию

Пытался сделать, так: Если ричедит не изменяет текст, то лог не записывается. Вот код:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var s:string;
begin
 if (s<>form1.script.text) then begin
 s:=form1.script.text;
 Log := TIniFile.Create(ExtractFilePath(ParamStr(0))+'Journal.log');
 Log.WriteString(StartApp,DateTimeToStr(Now),s);
 end
 else
 end;
Но логи всегда ведутся..

UPD. Решил проблему. Объявил глобальную переменную nado.
А дальше
Код:
procedure TForm1.scriptChange(Sender: TObject);
begin
nado := 1;
end;

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var s:string;
begin
 if (nado = 1) then begin
 s:=form1.script.text;
 Log := TIniFile.Create(ExtractFilePath(ParamStr(0))+'Journal.log');
 Log.WriteString(StartApp,DateTimeToStr(Now),s);
 nado := 0;
 end
 else
 end;

Последний раз редактировалось Мяфк, 08.10.2010 в 23:32.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:15.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025