|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Delphi 7 Ошибка при работе с таймером
Всем доброго времени суток! Пишу программу, которая загружает с сервера (посредствам FTP) информацию о статусе отслеживаемых пользователей. Задача то шуточная: поочередно загрузить файлы с сервера, соответствующие строкам списка. Грубо говоря: если в списке Вася, Петя, то загрузить файлы Вася.txt Петя.txt. В файле текст либо "online" или "offline". И в зависимости от этого поменять imageindex у компонента в listview (проще говоря: если "онлайн" - зеленая иконка, "оффлайн" - красная). И все это замечательно пашет, если вызывать это, например, в событии onclick. Но в моем случае, программа должна постоянно следить за состоянием пользователей. Поэтому я прибег к использованию компонента timer. Первые 1-2 раза все идет как по маслу. Но потом программа выдает ошибку "Unknown Command". А компилятор подсвечивает одну из строк, связанных с работой с файловой системой. Будь то Savetofile или FTP.Put. При этом почти каждый раз разные. При этом ошибка может выскочить через минуту, а может и через час. Сразу приношу извинения за код. Он реально грязный, нерациональный и все такое. Дело в том, что я этим занимаюсь на уровне хобби и вообще еще даже школу не закончил. Прошу отнестись с пониманием.
Код:
procedure TForm1.Timer1Timer(Sender: TObject); var i,q,s:integer; acc:Boolean; begin if fileexists('list.bat') then sMemo1.Lines.LoadFromFile('list.bat'); ///проверяем наличие файла со списком пользователей и если он есть, то загружаем в memo if sMemo1.Lines.Count>0 then ///на случай, если файл пуст begin sListView1.Clear; for i:=0 to sMemo1.Lines.Count-1 do begin acc:=false; /// acc - существует ли на сервере файл sListView1.Items.Add; ListBox1.Items.Clear; sListView1.Items[i].Caption:=sMemo1.Lines.Strings[i]; sListView1.Items[i].ImageIndex:=0; IdFTP1.List( ListBox1.Items,'*.bat',False); /// ищем файлы на FTP по критерию if ListBox1.Items.Count<>0 then for q:=0 to listbox1.items.count-1 do if ListBox1.Items.Strings[q]=LowerCase(sMemo1.Lines.Strings[i])+'.bat' then begin acc:=True; ///определяем существует ли файл if acc=True then begin IdFTP1.Get(LowerCase(sMemo1.Lines.Strings[i])+'.bat','omn.bat',true); /// получаем файл с сервера memo1.Lines.LoadFromFile('omn.bat'); if Memo1.lines.text='online' then begin sListView1.Items[i].ImageIndex:=1; ///устонавливаем зеленую иконку jvdesktopalert1.HeaderText:='Сообщение короче'; JvDesktopAlert1.MessageText:='Пользователь '+sMemo1.Lines.Strings[i]+', сейчас онлайн'; ///голос со стороны параши (трея) JvDesktopAlert1.StyleOptions.DisplayDuration:=0; if JvDesktopAlert1.Showing= False then begin JvWavePlayer1 .FileName:='sound.wav'; if sEdit1.Text<>'no' then JvWavePlayer1.Play ; JvDesktopAlert1.Execute(); end; ///вызываем сообщение из трея (Edit1.text='no' если пользователь не хочет слушать звуковое оповещение end; if Memo1.Lines.Text='offline' then sListView1.Items[i].ImageIndex:=2; ///устанавливаем красную иконку end; end; end; end; end; Авторизация FTP производится при запуске. Буду благодарен любой помощи. Заранее спасибо! Последний раз редактировалось Admin, 29.08.2014 в 19:41. |
#2
|
||||
|
||||
Дай посмотреть скриншот вот этого:
Цитата:
З.Ы. Не делай больше посты на 2+ экрана в ширину, очень неудобно читать. Юзай кнопку "предварительный просмотр". |
#3
|
||||
|
||||
А у вас таймер настроен хоть на какой-то адекватный промежуток времени?
Я уверен, что фтп сервер имеет ограничение на количество запросов к нему. Насколько важно знать статус пользователя, скажем, раз в 30 секунд? В любом случае нужен if проверяющий, если пользователь был онлайн и сейчас онлайн, то ничего переписывать на сервере не надо. Почему был выбран ftp протокол для передачи столь простой, можно сказать двоичной информации? |