Форум: "Основная";
Текущий архив: 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