Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 234
от 10.09.2005, 21:12

Администратор:Калашников О.А.
В рассылке:Подписчиков: 237, Экспертов: 50
В номере:Вопросов: 2, Ответов: 5


Вопрос № 25863: Уважаемые профи! Как заблокировать файл в Delphi, что бы его нельзя было изменять, удалять? И как определить: открыт ли какой-то файл другим приложением? Спасибо. ...
Вопрос № 25877: Помогите разобраться плиз. ЧТо-то у меня не работает. Чувствую, что неправильно проверяю найден-ли компонент. var i:Integer; s:String; begin for i:=0 to 100 do begin if TIdTCPClient(FindComponent(Irc_PageControl.Pages[i]...

Вопрос № 25.863
Уважаемые профи!
Как заблокировать файл в Delphi, что бы его нельзя было изменять, удалять?
И как определить: открыт ли какой-то файл другим приложением?
Спасибо.
Отправлен: 05.09.2005, 13:35
Вопрос задал: Чернявский Александр (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Zubex
Здравствуйте, Чернявский Александр!

1.Смотря какой файл в Delphi Вы хотите заблокировать:
если pas - файл в вашем проекте, то кликните на вкладке с требуемым юнитом правой кнопкой мыши и выберите в менюшке пункт ReadOnly;
если же вы хотите программно установить аттрибут ReadOnly на какой-либо файл на диске, то сделайте так:
SetFileAttributes('c:YourFile.txt',FILE_ATTRIBUTE_READONLY);
Можно еще поставить флаг FILE_ATTRIBUTE_HIDDEN...

2.Попробуйте через исключение:

function isFileOpened(FileName:string):boolean;
var F:TextFile;
begin
AssignFile(F, FileName);
try
Reset(F);
Result:=True;
except
Result:=False;
end;
CloseFile(F);
end;
Ответ отправил: Zubex (статус: 3-ий класс)
Отправлен: 05.09.2005, 14:39

Отвечает: Romodos
Здравствуйте, Чернявский Александр!
Можно, если открыть его и не закрывать (пример №1)
А как определить открыт файл или нет - пример №2

Приложение:

---------
FAQ me off!

Ответ отправил: Romodos (статус: 5-ый класс)
Отправлен: 05.09.2005, 17:15

Отвечает: sir henry
Здравствуйте, Чернявский Александр!
1. Для этого есть права доступа к файлу, плюс NTFS. :)
Если речь идет о блокировке ОТКРЫТОГО файла, то у функции FileOpen() специально для этого есть второй параметр, куда можно подставить:
fmShareExclusive - запрет другим доступа к файлу;
fmShareDenyWrite - запрет другим записывать в файл;
fmShareDenyRead - запрет другим читать из файла.
2. Определить, открыт файл кем-то или нет, можно какой-нибудь функцией окрытия файла, которая поддерживает fmShareExclusive, например:
Function IfNotOpenFile(FileName: String): Boolean;
var
F: TFileStream;
Begin
try
F := TFileStream.Create(FileName, fmOpenReadWrite or fmShareExclusive);
try
Result := true;
finally
F.Free;
end;
except
Result := false;
end;
end;
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 05.09.2005, 18:04


Вопрос № 25.877
Помогите разобраться плиз. ЧТо-то у меня не работает. Чувствую, что неправильно проверяю найден-ли компонент.
var
i:Integer;
s:String;
begin
for i:=0 to 100 do
begin
if TIdTCPClient(FindComponent(Irc_PageControl.Pages[i].Name+'_TCPClient'))<>nil then // Если компонент найден, то
begin
while TIdTCPClient(FindComponent(Irc_PageControl.Pages[i].Name+'_TCPClient')).Connected do // пока он подключен
begin
// cчитываем все данные в переменную s
TIdTCPClient(FindComponent(Irc_PageControl.Pages[i].Name+'_TCPClient')).ReadLn(s);
// отображаем значение переменной в Memo
TFatMemo(FindComponent(Irc_PageControl.Pages[i].Name+'_FatMemo')).Lines.Add(s);
end;
end;
end;
end;

Происходит ошибка при выполнении программы "List index out of bounds (5)" - не найден компонент, когда перебор дошел до 5 - его на самом деле нет, но он может там появиться позже

Может кто другой алгоритм посоветует? Опишите его плиз, а то мои прямые извилины сегодня не осилят логического мышления.
Отправлен: 05.09.2005, 20:03
Вопрос задал: source (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Delphin
Здравствуйте, source!
У тебя всего 4 страницы видно.
Просто for i:=0 to 100 исправь на Irc_PageControl.Count - 1 (Вроде так, Короче колличество страниц)
---------
Обращаться в ICQ: 77778851 или E-Mail: delphinster@gmail.com
Ответ отправил: Delphin (статус: 9-ый класс)
Отправлен: 05.09.2005, 20:22
Оценка за ответ: 3
Комментарий оценки:
у меня так в проге и написано - все-равно ругается

Отвечает: sir henry
Здравствуйте, source!
Т.е., другими словами, у Вас проблема в том, что Вы используете фиксированое значение для максимального индекса? А зачем? Если максимальный индекс заранее неизвестен, то, либо используйте цикл WHILE, либо REPEAT .. UNTIL. Готовое условие у Вас уже есть:
TIdTCPClient(FindComponent(Irc_PageControl.Pages[i].Name+'_TCPClient'))<>nil (это для WHILE)
TIdTCPClient(FindComponent(Irc_PageControl.Pages[i].Name+'_TCPClient'))=nil (это для REPEAT)
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 06.09.2005, 05:39


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

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


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Отписаться
Вспомнить пароль

В избранное