Программирование на Delphi

  Все выпуски  

Программирование на Delphi (выпуск 90)


Программирование на DELPHI
Рассылка сайта www.delphi.int.ru | Выпуск №90 (февраль-2011)

Разделы сайта:

Новости сайта
Форум
Файловый архив
Статьи
Компоненты
Исходники
Программы
Библиотека
Игры
Plug-in's
Изображения
IRC-канал сайта
Регистрация
Гостевая книга
Вставка кода

Доброго времени суток, уважаемые читатели!

В качестве вступления интересная статистика по сайту за 2010 год:

  • было задано 1 270 вопросов 458 разными пользователями;
  • эксперты дали 554 ответа на вопросы, из которых 363 были оценены, а общая сумма баллов — 1 709;
  • на мини-форумах вопросов было оставлено 8 149 сообщений;
  • на сайте зарегистрировались 826 пользователей;
  • на форуме, который открылся год назад, было оставлено 591 сообщение в 70 темах;
  • в проведённых на сайте 66 опросах приняли участие 261 пользователь, а общее количество голосов составило 2 395;
  • файлы из «Файлового архива» были скачаны 69 055 раз, а прикреплённые к вопросам/ответам файлы — 2 804 раза.

В этом выпуске:

Наша экспертная система:

Delphi.int.ru Expert

Вопросы, ответы и советы по решению проблем.

См. также:

Лента в Twitter
Группа вКонтакте

Новости портала

С недавнего времени узнавать о новых темах на форуме стало проще:

1) Уведомления на e-mail. В Личной зоне в разделе Другое при включении соответствующей опции вы будете получать почтовые уведомления о новых темах.
2) Уведомления в Twitter. Теперь в ленту DelphiIntRu поступает информация и о новых темах.

Среди последних вручённых наград можно отметить юбилейную медаль bugmenot — «5000-ый вопрос на сайте». Количество заданных вопросов наконец-то достигло этой отметки, что само по себе хороший показатель. Кубок форумчанина за январь достался min@y™.

Новости экспертной системы

Главным событием января стал официальный запуск подсистемы состояний вопросов. Если ранее у вопросов был определённый срок действия (изначально он составлял 1 неделю, но позже был увеличен до 14 дней), то теперь у вопросов есть состояния. Срок пребывания вопроса в любом состоянии не ограничен. Всего существует 3 основных состояния:

Открыт — в этом состоянии вопрос находится изначально. Это означает, что требуется его решение. В этом режиме принимаются ответы от экспертов и доступен мини-форум.

Решён —состояние, когда автор вопроса решил поставленную проблему. В этом режиме ответы на вопрос уже не принимаются, но обсуждение можно продолжать в мини-форуме.

Закрыт — полная остановка развития темы вопроса, включая мини-форум. Это состояние устанавливается в редких случаях, например если в мини-форуме обсуждение вышло за рамки темы вопроса.

В связи с этим изменением страница «Активные вопросы» заменилась страницей «Открытые вопросы».

Более подробно о состояниях вопросов можно прочитать в справочном разделе на странице Общая информация.

В начале каждого месяца подводятся итоги голосования «лучший вопрос» и «лучший ответ» месяца — они выбираются на основе тех оценок, которые давали посетители сайта. Каждый из вопросов и ответов может быть оценён по пятибалльной шкале. Лучшими становятся те, за которые было отдано большее количество голосов и которые имеют наивысший средний балл. Победители получают почётные кубки.

За январь-2010 кубки получили: Nolly (лучший вопрос — о восстановлении элементов числовой матрицы) и Ixer (лучший ответ — о перехвате клавиши Delete в TStringGrid).

Delphi.int.ru Expert — общение, помощь, обмен опытом

Новости | Задать вопрос | Участники и Эксперты | Открытые вопросы | Тематические разделы | Статистика

Сегодня вашему вниманию представляется подборка вопросов из раздела «Delphi — Работа с файловой системой».

 

Вопросы и ответы

Вопрос # 2 284

Приветствую, уважаемые эксперты!
Как создать или можно ли создать файл с форматом *.js в delphi 6. Если можно то как потом добавить информацию в нем ? пжлст если можно приведите примерчик.
Заранее благодарю....
С уважением Мехродж.
mehroj-1@mail.ru
icq 203759792

Вопрос задал: POWER (статус: Посетитель)
Вопрос отправлен: 9 января 2009, 07:31
Всего ответов: 1; сообщений в мини-форуме вопроса: 6

Ответ #1. Отвечает эксперт: Ученый

Здравствуйте, POWER! Приведу пример создания *.js
Кидаем на форму Memo и две кнопки и прописываем следующий код:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.SaveToFile('C:\Primer.js');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
memo1.Lines.LoadFromFile('c:\Primer.js');
end;
Теперь поясню: По нажатии первой кнопки создается файл Primer.js в него сохраняются строки из Меmо;
По нажатии второй кнопки в Мемо загружаются строки из этого файла...

Ответ отправил: Ученый (статус: 8-ой класс)
Время отправки: 9 января 2009, 12:55

Вопрос # 2 472

Доброго времени суток, уважаемые эксперты! Подскажите пожалуйста, как можно программно изменить атрибуты файла (сделать скрытым, системным и т.п.)!

Вопрос задал: grom_rk (статус: Посетитель)
Вопрос отправлен: 2 марта 2009, 03:59
Всего ответов: 1

Ответ #1. Отвечает эксперт: Шичко Игорь

Здравствуйте, grom_rk!
Для установки атрибутов файла применяется функция:
FileSetAttr(const FileName: string; Attr: Integer): Integer;
FileName - имя файла
Attr - атрибут, где используется константы:
faReadOnly = $00000001 - только чтение
faHidden = $00000002 - скрытый
faSysFile = $00000004 - системный
faVolumeID = $00000008
faDirectory = $00000010
faArchive = $00000020
faAnyFile = $0000003F

Пример использования:
FileSetAttr('c:\1.doc', faReadOnly); - установка для файла 'c:\1.doc' атрибута только чтение
Возвращаемое значение - 0, если все нормально, или сообщение об ошибке.

Ответ отправил: Шичко Игорь (статус: 8-ой класс)
Время отправки: 2 марта 2009, 06:02
Оценка за ответ: 5

Комментарий к оценке: Спасибо!!!

Вопрос # 2 481

Здравствуйте, уважаемые эксперты!
Как найти путь к папке с программой во время выполнения программы?

Вопрос задал: SKoch92 (статус: Посетитель)
Вопрос отправлен: 3 марта 2009, 16:39
Всего ответов: 1

Ответ #1. Отвечает эксперт: Ученый

Здравствуйте, SKoch92! Почитайте вот это, там все написано))

Ответ отправил: Ученый (статус: 8-ой класс)
Время отправки: 3 марта 2009, 16:43
Оценка за ответ: 5

Комментарий к оценке: Спасибо!

Вопрос # 2 493

Здравствуйте, эксперты!

Есть ли в WinAPI ф-я возвращающая кол-во папок в папке? Меня интересует только количество папок, их имена не нужны.

Вопрос задал: ____калясик (статус: Посетитель)
Вопрос отправлен: 8 марта 2009, 12:21
Всего ответов: 1

Ответ #1. Отвечает эксперт: Dron

Здравствуйте, ____калясик!
Нет, такой функции нет. Но её несложно написать самому - см. приложение.
Пример вызова:

Caption:=IntToStr(GetSubfoldersCount('C:\WINDOWS'));

Приложение:

Ответ отправил: Dron (статус: Студент)
Время отправки: 8 марта 2009, 12:38
Оценка за ответ: 5

Комментарий к оценке: Спасибо. Помогло!

Вопрос # 2 507

Доброго времени суток, уважаемые эксперты!
У меня такой вопрос: написал аудио плеер , но открывать файлы как полагаеться он не умеет, разрешение "mp3" зарегестрировал на свой плеер в реестре, выделяю 10 файлов mp3 в проводнике Windows, по нажатию Enter добавляется только один фаил , как добавить все выделенные файлы в плэйлист, ParamCount почему-то не чево не даёт . . .
Если кто сталкивалься, подскажите как реализовать?

Вопрос задал: DimonZ (статус: Посетитель)
Вопрос отправлен: 11 марта 2009, 19:05
Всего ответов: 2

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, DimonZ!
Я уже когда то писал решение подобной проблемы. На самом деле Windows запускает на каждый файл по копии Вашего приложения. А они уже и должны разобраться. Работает это обычно так. Приложение, запустившись, проверят, не запущена ли уже его копия. (можно искать по FindWindow окно приложения, а сам код вписать в файле проекта до создания формы - в таком случае мы не будем находить самого себя). Если копии нет, то приложение считает себя "главным" и запускает выбранный файл на воспроизведение. Если нет - то используя сообщение WM_COPYDATA, посылает окну "главного приложения" имя файла и закрывается.
"Главное приложение" получив подобное сообщение с именем файла уже решает как и куда его добавить. Почему только WM_COPYDATA? потому что это единственно сообщение, которое позволяет передавать указатель между процессами. В противном случае можно передать только 2 по 4 байта (можно конечно использовать общую память, сокеты...)
Посмотреть пример использования этого события можно к примеру здесь http://www.delphisources.ru/pages/faq/base/wm_cd_link.html
А теперь ближе к реальному коду
Почитать по диагонали http://forum.ixbt.com/topic.cgi?id=26:2870
поизучать http://www.delphisources.ru/pages/faq/base/send_cmd_s_to_f.html

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 11 марта 2009, 22:31

Ответ #2. Отвечает эксперт: Виталий

Здравствуйте, DimonZ!

Я задавал уже много вопросов по данной теме и нашёл ответ.
Правильно говорилось, что нужно сделать запуск только 1 копии приложения. Если при открытии файла приложение уже запущено, то ищем окно главного и отправляем ему сообщение WM_COPYDATA с именем файла.

Так как сообщения приходят довольно быстро, то время между получением имён файлов обычно 10-150 мс.
Я делал так : файлы не сразу добавлялись в плейлист, а во временный список. При получении сообщения смотрел сколько времени прошло с предыдущего сообщения и если оно больше нужного значения, то добавлял в временный список команду очистки плейлиста.

Далее на форме есть таймер, который, если послееднее сообщение было давно, просматривает временный список, сортирует его, если есть команда очистить, то очищает, и добавляет файлы в финальный плейлист.

Фуууу.... Примерно так.

Ответ отправил: Виталий (статус: 2-ой класс)
Время отправки: 13 марта 2009, 09:15

Вопрос # 2 525

Доброго времени суток, уважаемые эксперты!
у меня собственно такая ситуация: при входе запрашивается пароль. Если пароль совпадает с фамилией любого студента из типизированного файла, то разрешить просматривать данные, но запретить их редактировать.

Приложение:

Вопрос задала: susumi (статус: Посетитель)
Вопрос отправлен: 14 марта 2009, 21:03
Всего ответов: 1; сообщений в мини-форуме вопроса: 3

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, susumi!
Попробовал у себя - всё чудно компилируется. Да и должно оно.
Можно попробовать заменить исключение элемента с множества на альтернативную функцию.

Exclude(StringGrid1.Options, goEditing);//Для исключения свойства 
  Include(StringGrid1.Options, goEditing);//для включения
Но меня смущает другое - строка
Form2.stringGrid1.Options:=Form4.stringGrid1.Options-[goEditing];
Это так задумано, что гриды с разных форм? вообще то эта запись в контексте Вашей задачи странная. А вот здесь и может содержаться ошибка. Форма 2 (а может и 4) к этому моменту может быть не создана или уже удалена. И если это так, то произойдет ошибка во время исполнения. Какая ошибка у Вас возникает Вы не указали, так что всё возможно.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 14 марта 2009, 21:23
Оценка за ответ: 5

Вопрос # 2 628

Здравствуйте, уважаемые эксперты!
Подскажите пожалуйста как сохранить данные со StringGrid в текстовый файл?
Делаю, но сохраняется ток последняя строка?

Приложение:

Вопрос задал: Grom48 (статус: Посетитель)
Вопрос отправлен: 13 апреля 2009, 15:34
Всего ответов: 2; сообщений в мини-форуме вопроса: 3

Ответ #1. Отвечает эксперт: Dron

Здравствуйте, Grom48!
Ну ещё бы. SaveToFile сохраняет весь TStringList в файл, перезаписывая его. А ваш код просто 4 раза "мучает" файл. К тому же, непонятно, зачем вызывать диалог в цикле. По логике, он нужен всего один раз.
В приложении 2 функции - для сохранения содержимого StringGrid в текстовый файл, и для загрузки его оттуда. Функции универсальные и работают независимо от числа столбцов/строк конкретного StringGrid.

Приложение:

Ответ отправил: Dron (статус: Студент)
Время отправки: 13 апреля 2009, 15:39
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: min@y™

Ну ващще!
Посмотри вот сюда, там пример функции сохранения содержимого грида в текстовый файл.

Ответ отправил: min@y™ (статус: Кандидат наук)
Время отправки: 13 апреля 2009, 15:46
Оценка за ответ: 5

Вопрос # 2 681

Приветствую, уважаемые эксперты!
Не получается создать папку.В качестве примера использовал урок(прикреплённый файл) помоему в этом уроке чегото не хватает.
Помогите начинающему!
С уважением Анатолий.

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Вопрос задал: Манаенков АГ (статус: Посетитель)
Вопрос отправлен: 25 апреля 2009, 11:54
Всего ответов: 1; сообщений в мини-форуме вопроса: 9

Ответ #1. Отвечает эксперт: Amidamaru

Здравствуйте, Манаенков АГ!
Вообще я советую использовать ForceDirectories.
Если нет хелпа (как ни удивительно, у некоорых нет номального хелпа по делфи):

Unit SysUtils
function ForceDirectories(Dir: string): Boolean;
Creates a new directory, including the creation of parent directories as needed.
Создает новую папку, а также все необходимые "родительские" папки. Т.е. делает так, чтобы указанный путь существовал.

А по поводу "урока"... писал его, на мой взгяд, не очень опытный программист.
А думаю я так, потому что " = true" хороший программист писать не будет.

Также, если вы подключили юнит FileCtrl , то лучше заменить его на SysUtils .

Приложение:

Ответ отправил: Amidamaru (статус: 4-ый класс)
Время отправки: 27 апреля 2009, 16:27

Вопрос # 2 693

Доброго времени суток, уважаемые эксперты! Подскажите пожалуйста, как сделать так, чтобы только моя программа могла доступатса к файлу... Спасибо

Вопрос задал: Oleg251viti (статус: Посетитель)
Вопрос отправлен: 28 апреля 2009, 09:52
Всего ответов: 1; сообщений в мини-форуме вопроса: 1

Ответ #1. Отвечает эксперт: Паровоз

Здравствуйте, Oleg251viti!
Если это нужно во время работы программы смотрите
http://msdn.microsoft.com/en-us/library/aa365202(VS.85).aspx
(LockFile, UnlockFile)

Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 28 апреля 2009, 20:44

Вопрос # 2 767

Здравствуйте, уважаемые эксперты!
Как получить имя текущей директории, в которой запущено приложение? Разобрался, что через свойство CurrentDir класса
TFileEdit, но как создать объект этого класса у меня на форме, к сожалению, не знаю :-(

Вопрос задал: Яуген Таляныч (статус: Посетитель)
Вопрос отправлен: 12 мая 2009, 09:28
Всего ответов: 2

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Гена Гутницкий!
А внимательней посмотреть предыдущие вопросы? Уже ж писали
ExtractFileDir(Application.Exename)
или
ExtractFileDir(ParamStr(0)).
Можно вместо ExtractFileDir использовать ExtractFilePath. Отличаются только тем, что в одном случае будет слеш в конце, а в другом - нет.
Также есть функция GetCurrentDir. Она возвращает текущую директорию для приложения. Она может меняться.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 12 мая 2009, 09:49
Оценка за ответ: 5

Комментарий к оценке:    ОК ! Проект успешно двинулся с места благодаря помощи знатоков, так что чайницкие вопросы пока
прекращаются. Скачаю сайт целиком и буду читать как FAQ.

Ответ #2. Отвечает эксперт: Ученый

Здравствуйте, Гена Гутницкий! На сайте Андрей написал целую статью Обучающий курс. 25. Работа с файлами и каталогами (часть 1).
В ней как раз можете почитать ка определить директорию, а так же сможете найти мого интересного, плюс с примерами....

Ответ отправил: Ученый (статус: 8-ой класс)
Время отправки: 12 мая 2009, 10:39
Оценка за ответ: 5

Комментарий к оценке: Thanks !

Вопрос # 2 776

Приветствую, уважаемые эксперты!
Проблема в том что код выполняется после Else
при вводе других данных ini файл переписывается мне надо чтобы дописывались новые данные. Спасибо!

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Вопрос задал: Манаенков АГ (статус: Посетитель)
Вопрос отправлен: 13 мая 2009, 20:10
Всего ответов: 1; сообщений в мини-форуме вопроса: 1

Ответ #1. Отвечает эксперт: min@y™

“Цитата”
Проблема в том что код выполняется после Else

Форматировать свой код надо по-человечески. Я это сделал для тебя, теперь видно, где не хватает begin...end:
procedure TMailBoxForm.CreateButtonClick(Sender: TObject);
begin
  i:= extractfilepath(application.exename);
  ini:=tinifile.Create((i)+'Setup.ini');
 
  if (ini.ValueExists('UserName','')) and (ini.ValueExists('Pop3 Host',''))
    then Begin
           ini.WriteString('Pop3 Host','host1',popedit.Text);
           ini.WriteString('Autentification','UserName1',EnDeCrypt (Loginedit.Text));
           ini.WriteString('Autentification','Password1',EnDeCrypt (Passedit.Text));
           close;
           postofisform.Enabled:=true;
           ini.Free;
         end
    else ini.WriteString('Pop3 Host','host',popedit.Text);
 
  // Дальше идёт код, который выполняется в любом случае
  // и вылезет Access violation, если выполнение пошло по ветке "then"
  ini.WriteString('Autentification','UserName',EnDeCrypt (Loginedit.Text));
  ini.WriteString('Autentification','Password',EnDeCrypt (Passedit.Text));
  Showmessage('Папка удачно создана');
  showmessage('Если необходимо создать ещё папку перезапустите окно');
 
  if postofisform.IdPOP3.Connected
    then postofisform.IdPOP3.Disconnect;
 
  close;
  ini.Free;
  postofisform.Enabled:=true;

Ответ отправил: min@y™ (статус: Кандидат наук)
Время отправки: 14 мая 2009, 05:42
Оценка за ответ: 5

Комментарий к оценке: Я всего пару месяцев пробую програмировать поэтому не совсем понял(Я это сделал для тебя, теперь видно, где не хватает begin...end:
)после else заключил код в begin....end а ini.ValueExists заменил на SectionExists всё заработало.Если есть возможноссть поподробнее о // Дальше идёт код, который выполняется в любом случае
  // и вылезет Access violation, если выполнение пошло по ветке "then"

Вопрос # 3 068

Здравствуйте, эксперты!
Мне надо вывести именно 14-тую строку из текстового файла,
весь файл не проблема, а одну строку неполучается, целый день туплю. приложенный код вроде должен работать, а выдаёт ошибку invalid numeric input
Заранее спасибо.

Приложение:

Вопрос задал: slava863 (статус: Посетитель)
Вопрос отправлен: 5 августа 2009, 14:13
Всего ответов: 2; сообщений в мини-форуме вопроса: 5

Ответ #1. Отвечает эксперт: Мережников Андрей

Здравствуйте, slava863!
строку readln(f,num_lines); уберите совсем. И цикл for тоже. в данном случае он не нужен.
Сделайте так как написано в приложении:

Приложение:

Ответ отправил: Мережников Андрей (статус: 10-ый класс)
Время отправки: 5 августа 2009, 14:24

Ответ #2. Отвечает эксперт: Вадим К

Здравствуйте, slava863!
Странный код, перегруженный лишним. я бы решил просто.

var
sl:TStringList;
begin
sl:=TStringList.create;
try
  sl.LoadFromFile('имяфайла');
  if (sl.count < 14) then begin
    ShowMessage('Мало строк в файле');
    exit;
  end;
  ShowMessage(sl[14-1]);
finally
  sl.free;
end;
end;

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 5 августа 2009, 14:27

Вопрос # 3 330

Доброго времени суток, уважаемые эксперты!
Подскажите пожалуйста с помощью какого компонента(диалоговое окно) можно указать путь к директории (например d:\win\sys\) и передать его в Edit?
(компонент SaveDialog1 требует указать и имя файла).

Вопрос задал: djemov (статус: Посетитель)
Вопрос отправлен: 27 октября 2009, 13:24
Всего ответов: 2; сообщений в мини-форуме вопроса: 2

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, djemov!
вот где то так

uses
  FileCtrl,   // нужно добавить для SelectDirectory
  Forms, Dialogs;
 
//
procedure TForm1.ButtonClick1(Sender: TObject);
var
  chosenDirectory : string;
begin
  // Ask the user to select a required directory, starting with C:
  if SelectDirectory('Select a directory', 'C:\', chosenDirectory)
  then ShowMessage('Chosen directory = '+chosenDirectory)
  else ShowMessage('Directory selection aborted');
end;

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 27 октября 2009, 13:38
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: DNK

Здравствуйте, djemov!
В FileCtrl была полезная функция SelectDirectory. Можно также создать свой диалог с компонентами DyrectoryListBox и DriveComboBox с вкладки Win 3.1.

Приложение:

Ответ отправил: DNK (статус: Абитуриент)
Время отправки: 27 октября 2009, 13:42
Оценка за ответ: 5

Вопрос # 3 346

Доброго времени суток, уважаемые эксперты!
Подскажите пожалуйста !
При запуске приложение в событии OnActivate нужно программно определить путь к каталогу Program Files

Вопрос задал: Kyran29 (статус: Посетитель)
Вопрос отправлен: 30 октября 2009, 19:40
Всего ответов: 3; сообщений в мини-форуме вопроса: 12

Ответ #1. Отвечает эксперт: Amidamaru

Здравствуйте, Kyran29!
Нужно добавить в uses юнит shlobj и использовать например функцию из приложения.
FloderId - CSIDL_PROGRAM_FILES

Приложение:

Ответ отправил: Amidamaru (статус: 4-ый класс)
Время отправки: 30 октября 2009, 19:57
Оценка за ответ: -1

Ответ #2. Отвечает эксперт: Паровоз

Здравствуйте, Kyran29!

uses SHFolder;
const
  SHGFP_TYPE_CURRENT = 0;
var
  s:String;
begin
  SetLength(s,MAX_PATH);
  SHGetFolderPath(0,CSIDL_PROGRAM_FILES,0,SHGFP_TYPE_CURRENT,PChar(s));
  Edit1.Text:=s;
end;

Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 30 октября 2009, 20:45
Оценка за ответ: 5

Ответ #3. Отвечает эксперт: Жикльор

Здравствуйте, Kyran29!

На самом деле все очень просто. Не нужно использовать сверху указанные варианты (ну это у кого какой вкус). Как по мне то можно просто обратится в реестр за этой информацией. Значение которое мы ищем лежит в HKLM\Software\Microsoft\Windows\CurrentVersion. Для этого мы пишем функцию которая узнает путь к ПрограмФайлес и вернет ее в результате:

function GetProgramFilesDir: string;
 var
   reg: TRegistry;
 begin
   reg := TRegistry.Create;
   try
     reg.RootKey := HKEY_LOCAL_MACHINE;
     reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion', False);
     Result := reg.ReadString('ProgramFilesDir');
   finally
     reg.Free;
   end;
 end;

А теперь просто используем ее в вашем обработчике OnActivate:

procedure TForm1.OnActivate(Sender: TObject);
var
ProgramFiles: string;
begin
ProgramFiles:=GetProgramFilesDir;
ShowMessage(ProgramFiles);
end;

З.Ы. Только не забудьте в раздел uses добавить модуль Registry.

Ответ отправил: Жикльор (статус: 5-ый класс)
Время отправки: 6 ноября 2009, 08:53

Вопрос # 4 336

Здравствуйте, уважаемые эксперты!
Такая ситуация: есть лог файл, который постоянно дописывается (его ведет сторонняя программа, периодически его дописывая с разным интервалом времени ). Так как нет определенного времени по которому она дописывает файл , приходится его всегда читать. Возникает проблема, если читать в тот момент когда происходит запись, вылетает ошибка "raised exception class EInOutError witch message 'I/O error 32".
Возможно ли определить момент записи файла сторонней программой и в этот момент не читать? Либо другие способы для решения этой проблемы.

Вопрос задал: mr_switch (статус: Посетитель)
Вопрос отправлен: 17 июня 2010, 02:00
Всего ответов: 2; сообщений в мини-форуме вопроса: 7

Ответ #1. Отвечает эксперт: Егор

Здравствуйте, mr_switch!
Можно выключать выдачу исключений с помощью команд {$1-} / {$i+}, а проверку успешности открытия файла осуществлять с помомщьдю функции IOResult (подход, свойственный Паскалю):

...
{$I-} // выключили прерывания по ошибкам ввода-вывода
      // пробелы перед открывающей фигурной скобкой в начале строки должны отсутствовать!
  ... // здесь попытались открыть файл
{$I+} // включили обратно прерывания по ошибкам ввода-вывода
  if IOResult=0 then // если ошибок при открытии не было
    begin
      ... // код обработки файла
    end
  else
    begin
      ... // код обработки ошибки открытия файла
    end;
 ...

Другой подход, свойственный программированию под дельфи - обернуть "опасный" участок в блок try...except или try...finally:
...
  try
    ... // открываем файл, обрабатываем его
  except
    on EInOutError do
      begin
        ... // открыть файл не удалось. здесь обрабатываем ошибку
      end;
  end;

Ответ отправил: Егор (статус: 9-ый класс)
Время отправки: 17 июня 2010, 02:30
Оценка за ответ: 4

Комментарий к оценке: все та же ошибка вылетает

Ответ #2. Отвечает эксперт: min@y™

Вот это КОД!!! Лучше б не показывал! Убери его отсюда, не позорься. А у себя в программе замени это безобразие на

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  try
    cmd.Lines.LoadFromFile('C:\log\log.csv');
  except
    cmd.Lines.Text:= 'err open';
  end;
end;

Ответ отправил: min@y™ (статус: Кандидат наук)
Время отправки: 17 июня 2010, 10:01
Оценка за ответ: 4

Комментарий к оценке: теперь вылетает такая ошибка: "raised exception class EFOpenError with message 'Cannot open file "C:\log\log.csv". Процесс не может получить доступ к файлу, так как этот файл занят другим процеccом'.

Файловый архив — последние добавления

Библиотека

Delphi Russian Knowledge Base — один из наиболее полных FAQ-сборников по Delphi на русском языке. База составлена по материалам интернет-форумов, а также других авторитетных источников. Содержит более 4000 статей по самым разным темам.

Загрузить (28 Мб)

Игры

Электронный вариант настольной игры "Сражение" — компьютерная игра "Сражение" с возможностью игры по сети. Играют вдвоем. Каждый выбирает себе армию одного цвета. Цель игрока - захватить знамя противника. В игре принимают участи по 40 фишек с каждой стороны. Цифры на фишках соответствуют воинским званиям.

Загрузить (152 Кб)

Heroes Imitation — стратегия на основе «Героев меча и магии», написанная на Delphi. Новые специальные герои-строители, рабочие, торговцы, шпионы, изменения в ресурсах и в расчёте битвы, новые условия победы и поражения, новые здания и объекты карты, редактируемый баланс, редактор карт, возможность играть по сети. Графика простая, но интерфейс удобный, места на диске и в памяти почти не занимает. В комплекте сервер, клиент, картинки, файлы с балансом, карты и сохранённые игры.

Загрузить (1.52 Мб)

Исходники

MailAgent — в последнее время многие хотят написать свой Mail.ru Agent на Delphi. Этот исходник показывает, как создать базу для такого клиента. Для работы используется компонент MailClient.

Загрузить (536 Кб)

Компоненты

AlxXlExportEh — компонент для экспорта данных из DBGridEh в MS Excel без предварительного создания шаблона, посредством вызова всего одного метода. В MS Excel выгружаются только видимые колонки и отфильтрованные данные. Имеется возможность указать формат и выравнивание выгружаемых колонок.

Загрузить (10 Кб)

FontComboBox — выпадающий список со шрифтами, где имена шрифтов написаны теми же шрифтами, которым они соответствуют. Имя шрифта доступно через свойство Selected.

Загрузить (1 Кб)

Программы

VScript - Мощный компилятор скриптов — включает в себя сам компилятор и удобный редактор. Довольно мощная система скриптов, которая может соперничать со скриптами 1С. Поддерживаются основные операторы (if, while, for), поддержка функций (в одном скрипте может быть не только одна функция). В редакторе можно отслеживать выполнение скрипта, ставить точки останова. Подсветка синтаксиса, выпадающие окошки. Язык скрипта придумал сам автор.

Загрузить (1 Мб)

MD5 Bruts — програма для брутфорса MD5 хешей. Работает очень быстро, так как использует упрощённый алгоритм формирования хешей (опущены некоторые операции вычитания), но при этом выдаёт верный результат.

Загрузить (238 Кб)

FindMe bOT — это ICQ бот, имеющий ряд возможностей: бот знакомств, поиск пользователей по возрасту, возможность редактировать свою анкету, любой может просмотреть чужую анкету, просмотр статистики бота, массовая рассылка новостей, отправка сообщений пользователям, набор статусов для ICQ, шутки, слоганы, измеритель инфы.

Загрузить (1 Мб)

m0dEditor — это HTML редактор, который будет полезен как новичка, так и опытным пользователям. Программа поможет быстро, а главное просто делать свои странички любых уровней сложности. Главные особенности: подсветка синтаксиса, удобные HTML-мастера, редактирование нескольких документов, встроенный просмотр, отправка почты.

Загрузить (990 Кб)

SortMaster — программа для сортировки файлов по их расширениям. Позволяет создать список расширений и сопоставить им папки. Также есть опции для игнорирования папок. Программа является частью проекта SortMaster, в рамках которого делается создание и поддержка множества программ для сортировки файлов.

Загрузить (1.22 Мб)

FileCheckSum — расчёт контрольных сумм (хэшей) CRC32, MD5, SHA-1 для файлов с групповой обработкой.

Загрузить (242 Кб)

R-функции 3D — программа предназначена для двумерного и трёхмерного отображения предикатных уравнений.

Загрузить (530 Кб)

Разделы файлового архива: Статьи | Компоненты | Исходники | Программы | Библиотека | Plug-in's | Изображения | Игры

Юмор

Анекдоты про обычную почту

Ночь, дождь, шторм... Одинокая лодка с почтальоном плывет к маяку. Подплывает, выходит смотритель маяка. И почтальон со злобой отдает ему посылку.

- На, возьми!

- Смотри, будешь возмущаться - на газеты подпишусь!

- Знаешь, был у меня почтовый голубь, но погиб при исполнении...

- Как это? Подстрелили?

- Да нет! На почте пришибли, когда штемпель ставили...

Он жил в таком захолустье, что даже почтальон пересылал ему письма по почте.

Солдат получает письмо из дома. Когда он открывает конверт, из него выпадает чистый лист бумаги. - Перед самым уходом в армию поссорился с невестой. И с тех пор мы не разговариваем, - объясняет солдат удивленным товарищам.

Позвонившему в дверь почтальону открывает мальчик, лет 5-6 с сигарой в зубах. Почтальон расстерянно: «А Мама или Папа д.. дд.. дддома?» Мальчик, выпуская струю дыма в лицо почтальону и счастливо улыбаясь: «Ну а сам-то как думаешь?»

- Алло! Это общество защиты животных?

- Да. У вас проблемы?

- Да! У моего дома на дереве сидит почтальон и оскорбляет мою собаку последними словами!

Жена-мужу:

- У нас такой умный песик! Каждое утро бежит к почтовому ящику и забирает в дом газеты.

- Ну и что, многие собаки так умеют...

- Но мы ни на какие газеты не подписывались!

Однажды молодой сисадмин, открыв свой почтовый ящик, нашел там повестку в райвоенкомат.

- Опять этот чертов спам, - прорычал он, нервно разрывая повестку в клочья.

- Можешь представить себе такое нахальство? Целых пять лет я писал ей любовные письма...

- А потом?

- А потом она вышла замуж за почтальона.

У матроса, только что призванного, спрашивают, где на флоте он хотел бы служить.

- На подводной лодке, - сразу отвечает он.

- Почему именно на подводной лодке?

- А интересно, как на нее почта доставляется...

Написал ребенок письмо деду Морозу и в том письме попросил у него шубу, варежки и ботинки. На почте прочитали это письмо, и стало им жалко ребенка, собрали денег. Купили ему шубку и варежки, а на ботинки денег не хватило. Так и отправили ребенку, как будто от деда Мороза.

Через некоторое время приходит ответ от мальчика: «Спасибо тебе дедушка Мороз! Получил я от тебя шубку и варежки, а вот ботинок не было там. Наверное на почте украли.»

Звонок из одной Московской организации в Новосибирскую: Пожалуйста, через два часа перешлите такой-то файл по электронной почте!

А через два часа - это по вашему или по нашему времени?

Девушка получила письмо от своего приятеля, который служил где-то возле Фолклендских островов. В конверте вместо письма она обнаружила короткую записку: «Ваш друг все еще любит вас, но он слишком много болтает. Цензор».

Источник: bayanov.net

WWW: http://www.delphi.int.ru/ E-mail: admin@delphi.int.ru | support@delphi.int.ru

Если Вы хотите где-либо разместить материалы, представленные на www.delphi.int.ru или в данной рассылке, свяжитесь, пожалуйста, с их автором или ведущим рассылки.


В избранное