Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 17, 2025 12:13

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Aug 17, 2007 17:01 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
Wie speichere ich mehrere Bilder mit anderen Daten in einer Datei?


Zuletzt geändert von FrenK am Di Aug 21, 2007 15:19, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 17, 2007 17:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Na, am besten zipst du das Ganze einfach. Dafür gibt's genug freie Bibliotheken.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 17, 2007 19:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Oder schau mal hier, wenn du nicht auf eine öffentliche Bibliothek zurückgreifen willst:
myArchiv - Delphi-Source - Der Delphi-Treff

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 21, 2007 15:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
Ich hab daraus ma ne Classe Gemacht nur irgenwie functionierte die nicht richtig!!

Code:
  1.    TG3DEArchiv = class(TObject)
  2.       private
  3.          ArchivFile : File;
  4.          FileStart  : TStringList;
  5.          FileNames  : TStringList;
  6.  
  7.          open : Boolean;
  8.        protected
  9.  
  10.        public
  11.          constructor create; overload;
  12.          constructor create(pArchivName : String); overload;
  13.          destructor destroy;
  14.  
  15.          procedure OpenArchiv(pArchivName : String);
  16.          procedure CloseArchiv(pArchivName : String);
  17.  
  18.          procedure WriteFile(pFileName, NameInArchiv : String);
  19.          procedure ReadFile(NameInArchiv, NewFileName : String);
  20.        published
  21.  
  22.      end;
  23.  
  24. implementation
  25.  
  26. constructor TG3DEArchiv.create;
  27. Begin
  28.   inherited;
  29.   FileStart:=TStringList.Create;
  30.   FileNames:=TStringList.Create;
  31. End;
  32.  
  33. constructor TG3DEArchiv.create(pArchivName : String);
  34. Begin
  35.   inherited create;
  36.   FileStart:=TStringList.Create;
  37.   FileNames:=TStringList.Create;
  38.   OpenArchiv(pArchivName);
  39. End;
  40.  
  41. destructor TG3DEArchiv.destroy;
  42. Begin
  43.  FileStart.Destroy;
  44.  FileNames.Destroy;
  45.  if open then CloseFile(ArchivFile);
  46. End;
  47.  
  48. procedure TG3DEArchiv.OpenArchiv(pArchivName : String);
  49. var AktPos  : integer;
  50.     StrSize : byte;
  51.     Size    : LongInt;
  52.  
  53.     S : String;
  54. Begin
  55.   if FileExists(pArchivName)
  56.     then
  57.       begin
  58.         AssignFile(ArchivFile,pArchivName);
  59.         ReSet(ArchivFile,1);
  60.  
  61.         BlockRead(ArchivFile,StrSize,SizeOf(StrSize));
  62.         SetLength(s,StrSize);
  63.         BlockRead(ArchivFile,s[1],StrSize);
  64.  
  65.         BlockRead(ArchivFile,Size,SizeOf(Size));
  66.  
  67.         FileNames.Add(S);
  68.         FileStart.Add(IntToStr(StrSize+SizeOf(StrSize)+SizeOf(Size)));
  69.  
  70.         AktPos:=StrSize+SizeOf(StrSize)+SizeOf(Size)+size;
  71.  
  72.         while AktPos+1 < FileSize(ArchivFile) do
  73.           begin
  74.             Seek(ArchivFile,AktPos);
  75.  
  76.             BlockRead(ArchivFile,StrSize,SizeOf(StrSize));
  77.             SetLength(s,StrSize);
  78.             BlockRead(ArchivFile,s[1],StrSize);
  79.  
  80.             BlockRead(ArchivFile,Size,SizeOf(Size));
  81.  
  82.             AktPos:=AktPos+SizeOf(StrSize)+StrSize+SizeOf(Size);
  83.  
  84.             FileNames.Add(s);
  85.             FileStart.Add(intToStr(AktPos));
  86.  
  87.             AktPos:=AktPos+Size;
  88.           end;
  89.         open := True;
  90.       end
  91.     else
  92.       begin
  93.         AssignFile(ArchivFile,pArchivName);
  94.         ReWrite(ArchivFile,1);
  95.         Open := True;
  96.       end;
  97. End;
  98.  
  99. procedure TG3DEArchiv.CloseArchiv(pArchivName : String);
  100. Begin
  101.   CloseFile(ArchivFile);
  102.   Open := False;
  103. End;
  104.  
  105. procedure TG3DEArchiv.WriteFile(pFileName, NameInArchiv : String);
  106. var F       : File;
  107.     Buffer  : Array of byte;
  108.  
  109.     gelesen : integer;
  110.     StrSize : byte;
  111.     Size    : LongInt;
  112. begin
  113.   if not Open then exit;
  114.  
  115.   Seek(ArchivFile,FileSize(ArchivFile));
  116.  
  117.   StrSize:=Length(NameInArchiv);
  118.  
  119.   BlockWrite(ArchivFile,StrSize,SizeOf(StrSize));
  120.   BlockWrite(ArchivFile,NameInArchiv[1],StrSize);
  121.  
  122.   AssignFile(F,pFileName);
  123.   Reset(F,1);
  124.   Size:=FileSize(F);
  125.  
  126.   BlockWrite(F,Size,SizeOf(Size));
  127.  
  128.   SetLength(Buffer,FileSize(F)+1);
  129.  
  130.   while not EOF(F) do
  131.     begin
  132.       BlockRead(F,Buffer[0],SizeOf(Buffer),gelesen);
  133.       BlockWrite(ArchivFile,Buffer,gelesen);
  134.     end;
  135.  
  136.   CloseFile(F);
  137. End;
  138.  
  139. procedure TG3DEArchiv.ReadFile(NameInArchiv, NewFileName : String);
  140. var F      : File;
  141.     Buffer : Array of byte;
  142.  
  143.     Size  : LongInt;
  144.     S     : String;
  145. begin
  146.   if not Open then exit;
  147.   Seek(ArchivFile,StrToInt(FileStart[FileNames.indexof(NameInArchiv)])-SizeOf(Size));
  148.  
  149.   BlockRead(ArchivFile,Size,SizeOf(Size));
  150.  
  151.   AssignFile(F,NewFileName);
  152.   ReWrite(F,1);
  153.   SetLength(Buffer,Size);
  154.  
  155.   BlockRead(ArchivFile,Buffer[0],Sizeof(Buffer));
  156.   BlockWrite(F,Buffer,Sizeof(Buffer));
  157.  
  158.   CloseFile(F);
  159. End;


// Edit Lossy: Codetags durch Pascaltags ersetzt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 21, 2007 23:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hmm.. Meine Glaskugel ist heute irgendwie so trüb, vielleicht hat wer Milch drübergekippt... :wink:

Nee, mal ehrlich, was funktioniert denn nicht?

//Edit: Benutz mal anstatt code-Tags die pascal-Tags...

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 00:30 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Ich würde wenn dann gleich direkt auf Streams (TFileStream z.b.) setzen.
Der Vorteil ist das viele Klassen wie z.b. TBitmap, TBitmap32, TPngImage, etc. bereits fertige .SaveToStream und .LoadFromStream funktionen haben. Wenn man weiß das an einer bestimmten Stelle im Stream ein Bild kommt kann man direkt die funktionen der Klassen benutzen. Damit hat man die dinger auch direkt im Speicher und kann umständliches zwischenspeichern in temporären Dateien umgehen.
Die informationen was an welcher Stelle im Stream kommt können auch einfach direkt als String/Buffer in den Stream geschrieben werden.

Ist insgesammt ähnlich wie das ganze AssignFile, CloseFile, BlockRead, BlockWrite... etc. Zeug.
Nur ist das bereits in fertige Klassen gekapselt wodurch es sich einfacher Handhaben läßt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 00:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Stimmt.

Allerdings muss man da mit Strings aufpassen, man sollte vorher die Länge in den Stream speichern, damit man beim Auslesen sich daran wieder orientieren kann, da strings ja variable längen haben.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 00:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
3 Dinge die mir aufgefallen sind:
1. Warum von TObject ableiten?
2. Der destructor verbirgt die Methode der Basisklasse.
3. Lieber Instanz.Free; als Instanz.Destroy;
Free fragt erstmal ab, ob da überhaupt was zum Entsorgen vorhanden ist und führt dann erst Destroy aus.

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 00:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
zu 1. Wovon sonst?

zu 2. Stimmt, das ist wichtig, häng an die deklaration in der klasse noch nen override ran.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 00:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Lord Horazont hat geschrieben:
zu 1. Wovon sonst?

Hm, bei genauerer Betrachtung passts schon, hab grad mal wieder nen paar Sachen durcheinander geworfen. :oops:

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 14:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
Sry mein Fehler :oops:
Problem Datein die ich in der Archiv datei speichere sind wenn ich sie wieder Temporär aus der Daei auslese kleiner ... Wenn jemand denn Fehler findet danke

Streams wären ne lösung wäre aber nett wenn jemand mir nen Beispiel giebt

mfg FrenK


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 16:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
FrenK hat geschrieben:
Streams wären ne lösung wäre aber nett wenn jemand mir nen Beispiel giebt

http://dsdt.info/tutorials/streams/

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 23, 2007 00:54 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich hab ne etwas komplexere Streamklasse für meine aktuelle Engine geschrieben, die über Protokolle arbeitet.
Aktuell hab ich HTTP,File und Mem drin und hab auch schon mit einen Archive experimentiert.
Dabei baut sich das Archive durch ein Header(Metadaten zu jeder Datei(Name,Größe,offset zu Daten,Flags)) und den Data Teil(binäre oder gezipte daten).
Ich nutze die zlib Bibliothek, da diese auf allen bekanteren OS läuft.
So kann ich dann alle meine Medienklassen, wie z.B. TKar_Sound drauf ansetzen.
Code:
  1. kSoundManager.AddSound(TKar_Sound.Create(TKar_Stream.Create('file:///gemeinsame_daten/tada.wav',kStreamProtocolManager)));

Das ist ein höllischer Erstaufwand aber das macht es beim Programmieren sehr viel leichter.
Mein Konzept für VFS ist aber noch ned ausgereift und so sieht meine aktuelle Variante so aus.
Code:
  1. kSoundManager.AddSound(TKar_Sound.Create(TKar_Stream.Create('vfs:///gemeinsame_daten/sound.vfs/tada.wav',kStreamProtocolManager)));

Vieleicht konnte ich dir ein bischen Inspiration bringen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 16 Queries | GZIP : On ]