![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему не работает ? [D5, Win2k]
VID © (2002-06-12 20:09:00)При выполнении кода получаю Access Violation.
Причём, интересно то, что выполняются все операторы код, а Access Violation выдаётся при выходе из процедуры (так кажется).
А вот и виновник "торжества":
procedure TForm1.ReadClick(Sender: TObject);
Var Buffer:array of Char;
FileStream:TFileStream;
begin
Try
FileStream := TFileStream.Create (FileName.FileName,fmOpenRead);
Except
ShowMessage("File access error, or the specified file does not exists"); exit;
end;
try
FileStream.Seek(ReadFrom.Value, soFromBeginning);
except
FileStream.Free;
ShowMessage("Error occured while position tracking in the specified file"); Exit;
End;
try
SetLength(Buffer, Offset.value);
FileStream.ReadBuffer(buffer, SizeOf(Buffer));
Finally
FileStream.Free;
Buffer := nil;
end;
// RD: TMEMO
RD.TEXT :=String(Buffer);
end;
MBo (2002-06-13 15:22:00) [1]>Sasha9
у меня это String
Sasha9 (2002-06-13 15:11:00) [2]2VID ©
я не понял, а зачем тогда тебе МЕМО
Sasha9 (2002-06-13 15:08:00) [3]MBo ©
тока не buffer [1]а buffer [0]
Игорь Шевченко (2002-06-13 10:45:00) [4]VID © (12.06.02 21:29)
Просто у меня есть огромный файл с сэмплами (кусочки аудио звука), и я знаю, где в нём (с какого байта) начинается каждый новый сэмпл, и длину сэмпла в байтах. Вот и хочу разобрать этот big файл по частям.
Использовать MemoryMapped files - rulez forever для таких задач.
Не будет никакого геморроя.
С уважением,
Yuri-7 (2002-06-13 08:40:00) [5]Зачем так сложно хранить сэмплы? Сохрани их как ресурсы RCDATA в EXE-шнике и считывай потом в TResourceStream и делай с ними что хочешь.
MBo (2002-06-13 07:29:00) [6]FileStream.ReadBuffer читает из файла, записывая данные, начиная с адреса, указанного первым параметром. buffer[1] - как раз первый символ строки.
VID (2002-06-12 21:42:00) [7]TO ALL: Цель достигнута. Задача выполнена.
TO MBo: Однако, вопрос насчёт FileStream.ReadBuffer(buffer[1], Offset.Value) остаётся открытым :)
VID (2002-06-12 21:29:00) [8]TO Mbo: спасибо... offset.value - это просто количество байтов, необходимых для считывания из файла. Указывается пользователем.
И ещё, почему FileStream.ReadBuffer(buffer [1], Offset.Value)?
А вообще, Sasha9, дал мне понять, что я не на верном пути :)
Задача такая:
ДАНО: есть файл. Не текстовый, а какой-нить exe, или wave.
ЦЕЛЬ: прочитать в буффер какой-то фрагмент файла, и сохранить этот фрагмент в новый файл.
Просто у меня есть огромный файл с сэмплами (кусочки аудио звука), и я знаю, где в нём (с какого байта) начинается каждый новый сэмпл, и длину сэмпла в байтах. Вот и хочу разобрать этот big файл по частям.
Sasha9 (2002-06-12 21:08:00) [9]вообще-то непонятно зачем ты очищаешь буфер....
а ошибок у тебя несколько:
1.ReadBuffer исползуется только когда SizeOf(Buffer) величина постоянная, используй просто Read
2.В Read параметр должен быть не Buffer а Buffer[0], на эту ошибку компилятор ругаться не будет, если хош объясню почему.
А вообще-то незачем так геморроиться, memo1.Lines.LoadFromFile();, или LoadFromStream
MBo (2002-06-12 21:03:00) [10]try убрал для краткости
procedure TForm1.ReadClick(Sender: TObject);
Var Buffer: String;
FileStream:TFileStream;
begin
FileStream := TFileStream.Create (FileName.FileName,fmOpenRead);
FileStream.Seek(ReadFrom.Value, soFromBeginning);
SetLength(Buffer, Offset.value);
//Offset.value- что это?
//по названию больше похоже на смещение, а не на размер коп. блока
FileStream.ReadBuffer(buffer[1], Offset.value);
RD.TEXT :=Buffer;
FileStream.Free;
end;
VID (2002-06-12 20:29:00) [11]упс... пардон :) просто не правильно понял с первого раза :)
Я поставил Buffer := nil, после RD.TEXT := String(Buffer), но к сожалению, всё равно AV...
VID (2002-06-12 20:27:00) [12]Я поставил конечно, и проверил... Access Violation. Но вообще-то по-логике, там как раз таки и не надо ставить Buffer := nil, поскольку в этом случае, я потеряю всю инфу, что была в буффере, а она мне вообще-то нужна, для отображения в RD (TMemo)...
Ищем дальше...
yozhik (2002-06-12 20:16:00) [13]мне кажется ошибка в следующем...
RD.TEXT :=String(Buffer); - надо поставить перед Buffer := nil;