Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему не работает ? [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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо