Форум: "Основная";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
ВнизFileStream не сохраняет обновленный файл Найти похожие ветки
← →
msoftware (2003-03-27 03:35) [0]Здравствуйте Мастера! У меня такая проблема - файл не хочет сохранятся. Причем я с этим сталкиваюсь уже не впервый раз, может вы мне поможете? Вот листинг Unit"a с помощью которого и происходят все файловые операции:
unit uClass;
interface
Uses Windows, Messages, SysUtils, Variants, Classes, Graphics,Dialogs,JPEG;
type TImgCollection=Class(TObject)
private
GetCount: Integer;
ImageSize: TStringList;
Image: Array of TMemoryStream;
public
ImgCaption: TStringList;
Function GetBitmap(ImageIndex: Integer): TJPEGImage;
Function SaveImages: boolean;
procedure DeleteBitmap(ImageIndex: Integer);
Procedure ReadImages;
Function AddBitmap(FileName: String): boolean;
Property ImagesCount: Integer Read GetCount;
Constructor Create;
end;
implementation
Uses Unit1;
{ TImgCollection }
constructor TImgCollection.Create;
begin
GetCount:=0;
ImageSize:= TStringList.Create;
ImgCaption:= TStringList.Create;
end;
procedure TImgCollection.DeleteBitmap(ImageIndex: Integer);
var i: Integer;
begin
ImageSize.Delete(ImageIndex);
ImgCaption.Delete(ImageIndex);
For i:=ImageIndex to GetCount-2 do
Image[i]:=Image[i+1];
GetCount:=GetCount-1;
If Not SaveImages then showMessage("Save Error!");
end;
function TImgCollection.GetBitmap(ImageIndex: Integer): TJPEGImage;
var MStream: TMemoryStream;
begin
MStream:=TMemoryStream.Create;
MStream.LoadFromStream(img.Image[ImageIndex]);
Result:= TJPEGImage.Create;
Result.LoadFromStream(MStream);
end;
procedure TImgCollection.ReadImages;
var F: TFileStream;
T: TextFile; i: integer;
s: int64;
d: Char;
begin
if FileExists("sprtfile.MXF") then begin
AssignFile(T,"sprtfile.MXF");
Reset(T);
ReadLn(T,GetCount);
For i:=0 to ImagesCount-1 do begin
ReadLn(T,s);
ImageSize.Add(IntToStr(S));
end;
CloseFile(T);
F:=TFileStream.Create("sprtfile.MXF",fmOpenRead);
d:=chr(5);
while d<>chr(6) do f.Read(d,1);
For i:=0 to ImagesCount-1 do begin
SetLength(Image,i+1);
Image[i]:=TMemoryStream.Create;
Image[i].CopyFrom(F,StrToInt(ImageSize.Strings[i]));
end;
for i:=0 to ImagesCount-1 do
fMain.cImageName.Items.Add("Image #"+inttostr(i+1)) ;
end;
end;
function TImgCollection.SaveImages: boolean;
var F: TfileStream;
T: TextFile;
i: integer;
s: int64;
begin
try
AssignFile(T,"sprtfile.MXF");
Rewrite(T);
WriteLn(T,ImagesCount);
For i:=0 to ImagesCount-1 do begin
S:=StrToInt(ImageSize.Strings[i]);
WriteLn(T,s);
end;
write(t,chr(6));
CloseFile(T);
F:=TFileStream.Create("sprtfile.MXF",fmOpenWrite);
f.Seek(0,soEnd);
For i:=0 to ImagesCount-1 do begin
Image[i].Position:=0;
f.CopyFrom(Image[i],StrToInt(imageSize.Strings[i]));
end;
//f.Free;
Result:=True;
except
Result:=False;
end;
end;
function TImgCollection.AddBitmap(FileName: String): boolean;
var MImage: TMemoryStream;
begin
MImage:=TMemoryStream.Create;
MImage.LoadFromFile(FileName);
try
ImgCaption.Add("Рисунок #"+IntToStr(ImagesCount));
ImageSize.Add(IntToStr(MImage.Size));
GetCount:=GetCount+1;
SetLength(Image,ImagesCount);
Image[ImagesCount-1]:=TMemoryStream.Create;
Image[ImagesCount-1]:=MImage;
Result:=True;
except
Result:=False;
end;
end;
end.
← →
msoftware (2003-03-27 09:18) [1]Подскажите почему????????
← →
Anatoly Podgoretsky (2003-03-27 09:39) [2]Ты весь текст программы привел?
← →
msoftware (2003-03-27 10:02) [3]>Anatoly Podgoretsky ©
Нет вы не угадали, он в десятки раз больше. И вообще это не программа а только Класс! Но раз вы такие умные подскажите почему не сохраняет, просто я немогу найти ошибку самостоятельно. И вообще как вы там некоторым пишете:
>Удалено модератором
>Примечание: Создание пустых сообщений
Дак чтож вы свое та не удаляете или вы в нем находите сообщение нужное кому-то???
Да-аа-а-а... Позор!!!
← →
REA (2003-03-27 10:06) [4]Где ошибка выдели и что происходит уточни. Комментарий AP по существу.
← →
Smithson (2003-03-27 10:18) [5]Видел я похожие грабли. В чем причина - не скажу, но смешивать потоковый и обычный доступ к файлу не надо. Или TFileStream, или AssignFile/Reset/Rewrite
← →
msoftware (2003-03-27 10:20) [6]Вобщем вызывая класс я делаю вот так:
...
if dlg.Execute then
img.AddBitmap(dlg.FileName);
img.SaveImages;
...
Из вышесказанного вытекает нижеследуещее:
Вызывается AddBitmap, который обрабатывает файл и добавляет его в коллекцию TMemoryStream.
Затем этот весь массив потоков с размерами каждого рисунка сохраняется в файл.
Просто не хочет он записывать это, ошибку не выдает но и не записывает
← →
REA (2003-03-27 10:26) [7]>смешивать потоковый и обычный доступ к файлу не надо. Или TFileStream, или AssignFile/Reset/Rewrite
тот и другой по-видимому используют WriteFile, что по идее не запрещено...
2msoftware: ну локализуй ошибку то - разбей на работающие части и неработающие, дай на вход каждой функции тестовые данные и посмотри что на выходе, отладочных сообщений побольше...
Вот это например что за фигня?
Image[ImagesCount-1]:=TMemoryStream.Create;
Image[ImagesCount-1]:=MImage;
← →
msoftware (2003-03-28 15:23) [8]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Я знаю в чем дело. Оказывается файл не сохранялся из-за этого:F:=TFileStream.Create("sprtfile.MXF",fmOpenWrite);
А я сделал вот так:
F:=TFileStream.Create("C:\sprtfile.MXF",fmOpenWrite);
И все пошло!
Почему?...
Зато столько маялся...
← →
Zelius (2003-03-28 15:43) [9]а ты поищи "sprtfile.MXF" у себя на диске, может найдешь его где-нить, где не ожидал увидеть! :)
← →
Anatoly Podgoretsky (2003-03-28 16:28) [10]Сколько раз говорили миру - абсолютные пути иначе получитсч емеля-растеряшка или фейсом об табле
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.164 c