Einzelnen Beitrag anzeigen

bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#1

loadfile aus TMemoryStream

  Alt 21. Feb 2008, 13:49
Ich verzweifel gerade an Memorystreams. Ich versuche Bilddateien in ein Memorystream zu speichern und zu laden.
Da ich keinen besseren Ansatz habe, habe ich 2 Streams angelegt sowie Stringlisten mit Dateinamen,Position und Size.
Diese Sache klappt auch. Das Laden klappt überhaupt nicht mehr, ich bekomme einfach nicht das File wieder zurück.

//Edit: in den pFile-Stream laden klappt, jedoch nicht LoadFromStream (siehe am Ende!)


Delphi-Quellcode:
procedure LoadMemory; //diese procedure klappt !
var DList:TStrings;
    lCount: Integer;

begin
  DList := TStringList.Create; //Hilfsliste
  lFile := TMemoryStream.Create(); //Gesamtstream aller Files
  pFile := TMemoryStream.Create(); //Stream EinzelFile
  Search := True;
  FindAllFiles(DList,Skindateien[0],Skinpfad,'*',True,False,True);//Dateien finden und in Stringlist
                                                       //später austauschen um direkt über
  for lCount := 0 to Skindateien[0].Count - 1 do //FindallFiles in Stream zu packen, da sonst
  begin //2x Zugriff auf ein File
   pFile.LoadFromFile(Skindateien[0].Strings[lCount]);
   Skindateien[1].Add(IntToStr(pFile.Size));
   Skindateien[2].Add(IntToStr(lFile.Position));
   lFile.CopyFrom(pFile,pFile.Size);
   pFile.Position := 0;
  end;
   
   //zu Testzwecken um zu sehen ob bis hier alles klappt:
   //lFile.SaveToFile(ProgrammPfad+'\SkinStream.dat'); gesamter Stream
   //Skindateien[0].SaveToFile('Skindateien.txt'); Filenames
   //Skindateien[1].SaveToFile('SkindateienSize.txt'); FileSizes
   //Skindateien[2].SaveToFile('SkindateienPos.txt'); FilePositionen

  DList.Free;
end;



procedure LoadPicture(aFileName:String);
var lCount,Position,Size : Integer;
begin
  pFile.Clear;
  pFile.Position := 0;
  lFile.Position := 0;
  for lCount := 0 to Skindateien[0].Count - 1 do
  if aFileName = Skindateien[0].Strings[lCount] then break;

  Size := StrToInt(Skindateien[1].Strings[lCount]);
  Position := StrToInt(Skindateien[2].Strings[lCount]);

  lFile.Position := Position;
  pFile.SetSize(Size);
  pFile.CopyFrom(lFile,Size);

  //pFile.SaveToFile(ProgrammPfad+'\pFile'+ IntToStr(lCount)+'.jpg');//klappt ! die Bilder werden auf
end; //der Festplatte gespeichert, sind auch i.O.
Und hier soll das Bild wieder eingesetzt werden:

Delphi-Quellcode:
SkinBackground := TImage.Create(SkinForm);
    with SkinBackground do
    begin
      Parent := SkinForm;
      Name := iString + '_Background';
      SetBounds(0,0, SkinWidth, SkinHeight);
      iString := lowercase(Ini.ReadString(Menu,'Background','0'));
      Picture.RegisterFileFormat('jpg; *.jpeg','JPEG',TBitmap);

     //if FileExists(SkinPfad + iString) then //anstatt
     // Picture.LoadFromFile(SkinPfad + iString); //das hier
       
       LoadPicture(SkinPfad + iString); //soll
       Picture.Bitmap.LoadFromStream(pFile); //dieses hier, gibt aber immer eine exception!
Kann mir jemand das erklären ?


Gruß, bluescreen
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat