![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поистине ламерский вопрос о типе "file of TXRecord"
Alexey (AZ) © (2007-03-30 20:51:00)Доброго компелирования!
Возник вопросик всвязи с использованием рудиментов от паскаля... Есть тип "филе оф ТДата" и работаю я с ним ч/зAssignFile, Reset, Rewrite, Seekи т.п. Вопрос здесь вот в чем: как бы проверить открыт ли файл, можно ли его ещё раз Assign... И было бы особо приятно делать system.CloseFile только в том случае, если "филе" ассигнуто :) если есть такая функция проверки, то было бы классно, ато сasm ... end;приходится выкручиваться.
app (2007-03-31 12:50:00) [1]> Alexey (AZ) (31.03.2007 12:21:08) [8]
С главной страницы форумов
Еще не хотелось бы видеть открытого коверканья русского языка, использования уличного сленга. Это конечно не наказуемо, но помните, что Ваши слова будут читать люди, которые с ними могут быть незнакомы, или они им просто неприятны.
Alexey (AZ) (2007-03-31 12:22:00) [2]
> филе не будет закрыто
Соотв. не будет и ошибки.
Alexey (AZ) (2007-03-31 12:21:00) [3]
> Расскажи пожалуйста, как ты с asm... end; выкручиваешься
> ?
Задача заключается в сравнеии хэндлов файлов, т.к. в контексте одного процесса не может быть два раза открыт один и тот же объект (файл) под одним хэндлом. Если наше филе открыто, то у нас есть его хендл. Филе закрываем - хендл освобождается и он же самый может быть выдан этому филе при следующем открытии (не всегда к сожалению).
Допустим есть класс, описан так и нам нужно найти хэндл нашего филе:
private
f : file of TXData
LastH : dword
...
Определив смещение f и LastH от начала структуры класса, можно набросать кодик:
procedure ТМегаКлас.КлозеФиле;
var
resb : boolean;
begin
asm
MOV EDX, DWORD PTR DS:[EBX+$38]
XOR EAX, EAX
XOR EDX, [EBX+$184]
SETNZ AL
MOV EDX, DWORD PTR DS:[EBX+$38]
MOV [EBX+$184], EDX
MOV resb, AL
end;
if resb then
System.CloseFile(f);
end;
В моем случае по смещению $38 находится f, что есть кстати говоря обычная структура, содержащая параметры открытия филе и его хэндл (у нас рукастое филе). А по смещению $148 находится LastH. Смещения - константы.
Т.к. если наше филе не было открыто, то бульён resb это будет знать и наше филе не будет закрыто :) Так может есть здесь человеческие функции проверки на открытость филе?
try...except стараюсь избегать, т.к. это лишние SEH.
Германн (2007-03-31 02:19:00) [4]
> Palladin © (31.03.07 01:35) [6]
>
>
> > Германн © (31.03.07 00:17) [4]
>
> если не смог аппендуть филе оф ТДата, то ревритнуть тем
> паче :)
> у натУре... мир жесток...
>
Не понял, пппоясни. :)
Palladin (2007-03-31 01:35:00) [5]
> Германн © (31.03.07 00:17) [4]
если не смог аппендуть филе оф ТДата, то ревритнуть тем паче :)
у натУре... мир жесток...
DrPass (2007-03-31 01:15:00) [6]
> Германн © (31.03.07 00:17) [4]
В мире ваще много парадоксов
Германн (2007-03-31 00:17:00) [7]
> аппенднуто
Никто, никогда ещё не смог аппенднуть филе оф ТДата :)
DrPass (2007-03-30 23:57:00) [8]
> И было бы особо приятно делать system.CloseFile только в
> том случае, если "филе" ассигнуто :)
Если филе ассигнуто, то клозефиле делать не нужно. Клозефиле нужно делать только если филе ресетнуто, ревритнуто или аппенднуто
_Аноним (2007-03-30 23:43:00) [9]зачем такие выкрутасы? почему не пользовать более современные методы?
Расскажите, пожалуйста
Belorus (2007-03-30 23:15:00) [10]Расскажи пожалуйста, как ты с asm... end; выкручиваешься ?