Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.07.29;
Скачать: [xml.tar.bz2];

Вниз

Доступ к файлу   Найти похожие ветки 

 
finger   (2002-07-15 09:51) [0]

Мастера доброе время суток!
Подскажите пожалуйста как обработать ошибку!
При открытии файла занятого другим приложением возникает ошибка и чего то ни как немогу ее обработать.
В книжке вычитал
IoResult
Попробывал без "мемо"

procedure TForm1.Button1Click(Sender: TObject);
var
F: file of byte;
begin
if opendialog1.Execute then begin
AssignFile(F,opendialog1.FileName);
{$I-}
reset(f);
{$I+}
if ioresult=0 then
showmessage("Зашибись")
else
showmessage("Xреново");
end;
end;

Все работает
А если вместо "showmessage("Зашибись")" поставить
memo1.Lines.LoadFromFile(opendialog1.FileName)
То не работает.
С уважением.


 
MAxiMum   (2002-07-15 10:05) [1]

Конечно, не будет работать так файл занят уже другим приложением. Попробуй открыть файл с помощью FileRead, прочитать в буфер с помощью FileRead и уже помести "вручную" (т.е. присвой свойству Text Memo1 прочитанный буфер).
Дело в том, что AssignFile, Reset и т.д. пытаеются открыть файл в монопольном режиме, что не позволяет сделать Windows, т.к. файл открыт другим приложением. а вот если то приложение "доброе" и предоставило доступ, хотя бы на чтение, то с помощью FileOpen ты все таки можешь открыть файл.


 
TTCustomDelphiMaster   (2002-07-15 10:14) [2]

Посмотри в help
try

except

end;


 
Agent Smith   (2002-07-15 10:39) [3]

Можно сгенерировать исключительную ситуацию по схеме:
try
//тут может произойти ошибка
finally
//тут должно быть выполнено все, даже в случае ошибки
end;
Затем можно передать управление на новый уровень, например, на глобальный обработчик искл. ситуации.
Есть еще другая схема:
try
//может появиться ошибка
except
//это сработает в случае ошибки
end;


 
finger   (2002-07-15 12:27) [4]

Ребят мне его вообще не надо открывать.
Мне надо сделать что то вроде Abort
У меня функция около 300 строк и что туда вписать я уже незнаю как. Я все посылаю в CheckFileOpen например

procedure TClientForm.FormShow(Sender: TObject);
var
I: Integer;
begin
if (ParamCount > 0) then
begin
for I:=1 to ParamCount do
CheckFileOpen(ParamStr(I));

end
else
NewFile;
end;

А вот CheckFileOpen.

procedure TClientForm.CheckFileOpen(const FileName: string);
var
i : integer;

begin
with TabControlTxtFiles do
for i := 0 to Tabs.Count - 1 do
if CompareText(TSource(Tabs.Objects[i]).ObjectName, FileName) = 0 then
begin
TabControlFiles.TabIndex := i;
TabControlFilesChange(Self);
exit;
end;


if not fileexists(Filename) then exit

else

OpenFile(Filename);// а, здесь непосредственно каждый файл и обрабатывается она и есть на 300 строк.


end;// Компилятор указывает на эту строку

С уважением


 
finger   (2002-07-15 16:34) [5]

Ребят чего то куда я только не вставлял этот Try /Except ничего у меня не выходит. Ну помоггите плиз куском кода. Дело не в том что вылетает это окно Canot open file..... Просто если прога не запущенна и сделать с командной строки Edit With MyProgramm такой файл у меня динамически не создается новый документ и остается пустота пока не нажмешь New File. Приложение SDI и остается без Текстового поля!!!!
Плииииз!
С Уважением.


 
finger   (2002-07-15 20:31) [6]

Ну если никто не может помочь, может кто подскажет есть ли какая нибудь стандартная функция чтоб определить занят ли файл другим приложением?
С уважением.


 
Agent Smith   (2002-07-15 20:56) [7]

Есть идея временно копировать файл, а потом открывать копию. Идея пришла только что, обдумывать ее сил нет, поэтому не исключено, что это просто бред...


 
Anatoly Podgoretsky   (2002-07-15 20:56) [8]

Ты сначала вел речь про Reset, а потом про неизвестную функцию OpenFile, приведи ее описание.


 
finger   (2002-07-15 21:12) [9]



function TClientForm.OpenFile(const FileName: string): TMSource;
var
s,ts : string;

begin
ts:= "4";
result := TMSource.Create(Self);
result.UseGlobalOptions := true;
result.TabStops:= ts;


//result.TemplatesType := Editor.GetSource.TemplatesType;
//result.CodeTemplates := Editor.GetSource.CodeTemplates;
if FileName = "" then
s := UniqueSourceName
else
begin

//******************{Pascal Files}**********************//
if lowercase(extractfileext(Filename)) = ".pas" then
begin
s := FileName;
result.LoadFromFile(s);
result.SyntaxParser:= Pascal;
// MRUListTxtEditor.Add(s);
end

И все в таком духе для каждого расширения файла!
Она только обрабатывает файловые расширения.
UniqueSourceName это нумерование каждой вкладки на TabControl Untitled1.2.3.4......
К открытию файла никак не относиться OpenFile
Просто для MRU я например передаю
MRUList.Add(СheckFileOpen(Filename));
Все это очень прекрасно работало пока не зацепил NTUser.dat
Он мне нафиг не нужен просто глаза открыл.
Мне и не надо открывать такого рода файлы просто корректно сообщить что файл не доступен.
С уважением.


 
Anatoly Podgoretsky   (2002-07-15 21:19) [10]

finger © (15.07.02 20:31)
Для определения занятости надо попытаться открыть файл в монопольном режиме


 
finger   (2002-07-15 21:32) [11]

Я наверное все же не так объяснил.
СheckFileOpen проверяет открыт ли файл с таким именем, если да то exit если нет то то OpenFile(Filename).
OpenDialog вызывается только по кнопке Open. - которой пользоваться приходиться редко. Потому что еще и проводник всунут в программу.
Например в проводнике
procedure TClientForm.ExplorerListViewDblClick(Sender: TObject);
var
Filename: String;
begin
if ExplorerListView.Selected=nil then exit
else
Filename:=IncludeTrailingBackSlash(FolderEditExplorer.Text) + ExplorerListView.Selected.Caption;

CheckFileOpen(Filename);
end;

Ну а вот кнопка Open

procedure TClientForm.mnuOpenClick(Sender: TObject);
begin
with OpenDialog do
if Execute then
CheckFileOpen(FileName);

end;

Все идет чере CheckFileOpen она приведена выше.
C Уважением.


 
finger   (2002-07-15 21:34) [12]

To Anatoly Podgoretsky ©
А как?
C Уважением.


 
Anatoly Podgoretsky   (2002-07-15 21:44) [13]

Не знаю, что такое TMSource, ты очень много не приводишь важной информации.

но поробуй так

try
result.LoadFromFile(s);
except
вот здесь ловишь ошибку
end


 
JohnnyCrisJoe   (2002-07-15 23:06) [14]

procedure TForm1.Button1Click(Sender: TObject);
var
F: file of byte;
begin
if opendialog1.Execute then begin
AssignFile(F,opendialog1.FileName);
{$I-}
reset(f);
{$I+}
CloseFile(F);
if ioresult=0 then
showmessage("Зашибись")
else
showmessage("Xреново");
end;
end;

Попробуй так. :)



 
JohnnyCrisJoe   (2002-07-15 23:07) [15]

Ну и естественно замени showmessage("Зашибись") на memo1.Lines.LoadFromFile(opendialog1.FileName)


 
finger   (2002-07-16 05:53) [16]

TO Anatoly Podgoretsky © (15.07.02 21:44)
Ничего не выходит до OpenFile даже не доходит , останавливается на CheckFileOpen.

To JohnnyCrisJoe © (15.07.02 23:06)
Попробуйте сами приведенный код он будет работать, опять же только с доступными файлами, зацепите если в Win2k NTUser.dat или в 98 не помню как он называется помойму WIN386.SWP - Ошибка ввода/вывода 103 "Файл не открыт при выполнении процедур CloseFile........"
С уважением.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.07.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.007 c
14-95534
Fredericco
2002-07-02 11:21
2002.07.29
У меня созрел вопрос про Сокеты.


1-95369
proc
2002-07-15 20:07
2002.07.29
Генерация объектов в run-time


1-95440
DARS73
2002-07-17 00:59
2002.07.29
Уважаемые мастера, Как обработать ошибку???


3-95259
_Bl@dE_
2002-07-08 21:05
2002.07.29
драйвера dbExpress для MS Access 2000 и Paradox


1-95366
neodiX
2002-07-15 19:38
2002.07.29
Active window





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский