Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Record mit array in Datei schreiben? (https://www.delphipraxis.net/39517-record-mit-array-datei-schreiben.html)

alcaeus 3. Feb 2005 19:40


Record mit array in Datei schreiben?
 
Hallo allerseits,

ich habe folgende Datenstruktur:

Delphi-Quellcode:
type
  TComponentEntry = record
    sComponentName: String;
    cCaption: TCaption;
    cHint: TCaption;
  end; //type TComponentEntry = record

  TFormEntry = record
    sFormName: String;
    cCaption: TCaption;
    ComponentEntries: array of TComponentEntry;
  end; //type TFormEntry = record

  TLanguageEntry = record
    sLanguageName: String;
    FormEntries: array of TFormEntry;
  end; //type TLanguageEntry = record

var
  LanguageEntries: array of TLanguageEntry;
Diese Struktur dient dazu, alle Texte fuer meine Anwendung zu speichern, so dass diese auch schnell gewechselt werden. Nun moechte ich die Texte aber nicht jedesmal neu aus der ini-Datei laden, sondern das LanguageEntries-Array direkt in eine Datei schreiben und neu auslesen.
Ich habe bereits folgendes versucht:
Speichern
Delphi-Quellcode:
var
  MS: TMemoryStream;
begin
  ShowMessage(IntToStr(Length(LanguageEntries)));
  MS := TMemoryStream.Create;
  try
    MS.Position := 0;
    MS.Write(LanguageEntries, SizeOf(LanguageEntries));
    MS.SaveToFile('C:\temp.tmp');
  finally
    MS.Free;
  end;
  ShowMessage('Saved');
Laden:
Delphi-Quellcode:
var
  MS: TMemoryStream;
begin
  MS := TMemoryStream.Create;
  try
    MS.Position := 0;
    MS.LoadFromFile('C:\temp.tmp');
    MS.Read(LanguageEntries, SizeOf(LanguageEntries));
  finally
    MS.Free;
  end;
  ShowMessage(IntToStr(Length(LanguageEntries)));
Nun, beim Speichern kam keine Fehlermeldung, kein gar nichts, die Datei wurde sogar geschrieben, und zwar mit folgendem Inhalt (Hex):
Code:
00 00 00 00 FF FF FF FF
Vor dem Speichern war eben ein Spracheintrag mit insg. 4 Forms und wasweisich wieviel Komponenten pro Form, nach dem Laden nichts.

Hat jemand eine Idee wie ich diese Struktur speichern kann? Die Texte sollten auch nicht unbedingt im Klartext drinstehn, ich haette lieber sowas wie bei einem File of <Datentyp>

Thanx and Greetz
alcaeus

Robert_G 3. Feb 2005 19:56

Re: Record mit array in Datei schreiben?
 
Ich plädiere ein weiteres Mal für die dpCollectiondpCollection.
Wenn du es nicht in Klartext speichern willst, speichere sie doch in einen Stream, den du mit irgendeiner PackLib schrumpfst. ;)
Das hätte auch den Vorteil, dass du dir deine Anwendung nicht mit diesem Array und dem Record entstellen musst. :)

Keldorn 3. Feb 2005 19:57

Re: Record mit array in Datei schreiben?
 
ich persönlich würde zum speichern streams verwenden und die Daten einzeln reinschreiben. Wenn sich der aufbau mal ändert (ist ja nie ausgeschlossen) hat man bessere Möglichkeiten, darauf zu reagieren. Es gab da schon mehrere Anregungen auch hier im Forum.

http://www.delphipraxis.net/internal...ghlight=stream
http://www.delphipraxis.net/internal...stream&start=0

sowie du das machst, wird das bei dynamsichen array und Strings nichts, da die Länge unbestimmt ist. ein sizeof auf einen String wird dir auch nur 4 zurückgeben, egal wie lang er ist.

Mfg Frank

alcaeus 3. Feb 2005 20:08

Re: Record mit array in Datei schreiben?
 
Danke, ich werd die entsprechenden Beitraege mal als PDF speichern, und es morgen auf dem Weg zur Arbeit ausprobieren.

@Robert: Koenntest du mir bitte ein kleines Beispiel/einen Link zur Sache mit der PackLib geben? Ich habe auch schon an die DP-Collection gedacht, aber bisher noch nicht drauf zurueckgegriffen, da alles im Klartext gespeichert wird.

Danke schonmal :thumb:

Greetz
alcaeus

Robert_G 3. Feb 2005 20:23

Re: Record mit array in Datei schreiben?
 
Zitat:

Zitat von alcaeus
@Robert: Koenntest du mir bitte ein kleines Beispiel/einen Link zur Sache mit der PackLib geben?

Damit meinte ich halt irgendwas, dass dir einen Stream packen, verschlüsseln, nach Sibirien verkaufen, ... kann. ;)
(zum Bleistift Hier im Forum suchenzlib, solltest du auf deiner Delphi CD finden)

Zitat:

Zitat von alcaeus
Ich habe auch schon an die DP-Collection gedacht, aber bisher noch nicht drauf zurueckgegriffen, da alles im Klartext gespeichert wird.

Setze sie auf Binary(wird dadurch etwas kleiner) und jage den Stream durch einen Zerhackstückeler deiner Wahl.

alcaeus 3. Feb 2005 20:29

Re: Record mit array in Datei schreiben?
 
Danke Robert,

wie gesagt, ich werd das morgen mal versuchen, das heisst ich werde euch am nachmittag wahrscheinlich wieder belaestigen :mrgreen:

Greetz
alcaeus

Jens Schumann 3. Feb 2005 20:38

Re: Record mit array in Datei schreiben?
 
Zitat:

Zitat von alcaeus
... Ich habe auch schon an die DP-Collection gedacht, aber bisher noch nicht drauf zurueckgegriffen, da alles im Klartext gespeichert wird.

das ist nicht richtig. TmxJsCollection hat die property Binary. Wenn Du diese Eigenschaft auf True setzt werden die Daten im binär gespeichert. Natürlich könnte man die Strings noch lesen. Die Strings wären bei der Verwendung von Streams ebenfalls lesbar.

alcaeus 3. Feb 2005 20:41

Re: Record mit array in Datei schreiben?
 
Zitat:

Zitat von Jens Schumann
Natürlich könnte man die Strings noch lesen. Die Strings wären bei der Verwendung von Streams ebenfalls lesbar.

Lesbar,nicht lesbar, der Teil ist eigentlich egal, schliesslich sieht man die Strings im Programm sowieso. :zwinker: Mir geht es mehr darum, dass man die Texte in der Datei nicht so einfach aendern kann...

Greetz
alcaeus

jfheins 3. Feb 2005 20:44

Re: Record mit array in Datei schreiben?
 
Denk' dir halt ne tolle Kodierung aus.

Du könntest z.B. jedes Byte durchgehen, und es negieren. dann kommt nur noch Buchstabensalat heraus :wink:

Oder sowas:
http://www.delphipraxis.net/internal...=256791#256791

Jens Schumann 4. Feb 2005 00:05

Re: Record mit array in Datei schreiben?
 
Zitat:

Zitat von alcaeus
Zitat:

Zitat von Jens Schumann
Natürlich könnte man die Strings noch lesen. Die Strings wären bei der Verwendung von Streams ebenfalls lesbar.

Lesbar,nicht lesbar, der Teil ist eigentlich egal, schliesslich sieht man die Strings im Programm sowieso. :zwinker: Mir geht es mehr darum, dass man die Texte in der Datei nicht so einfach aendern kann...

Greetz
alcaeus

Dann verwende doch die dpcollection mit Binary auf True.

alcaeus 4. Feb 2005 04:50

Re: Record mit array in Datei schreiben?
 
Zitat:

Zitat von Jens Schumann
Zitat:

Zitat von alcaeus
Zitat:

Zitat von Jens Schumann
Natürlich könnte man die Strings noch lesen. Die Strings wären bei der Verwendung von Streams ebenfalls lesbar.

Lesbar,nicht lesbar, der Teil ist eigentlich egal, schliesslich sieht man die Strings im Programm sowieso. :zwinker: Mir geht es mehr darum, dass man die Texte in der Datei nicht so einfach aendern kann...

Greetz
alcaeus

Dann verwende doch die dpcollection mit Binary auf True.

Werd ich machen, wie gesagt, ich melde mich heute nachmittag nochmal. Gleich gehts los :coder:

Greetz
alcaeus

maximov 4. Feb 2005 11:55

Re: Record mit array in Datei schreiben?
 
Moin,

da die dpCollection auf streams basiert und du sie nicht in reinform speichern willst (egal ob binär oder text), würde sich eine strom-verschlüsselung anbieten. Und dafür haben wir ja Hagens RC4 verschlüsselung, die sehr schnell ist unhd tausendmal sicherer als irgendwas einfach zu negieren:

http://www.delphipraxis.net/internal...ct.php?t=30830

Du könntest dort die TRC4Stream-klasse benutzen, welche leider hart von TMemoryStream abstammt. Wesentlich flexibler wäre hier eine RC4-dekorierer klasse. Die dekorierer-klasse würde, wie ein wrapper, um jede beliebige stream-klasse gelegt werden können. Das hatte ich damals verschlafen. Wenn interesse besteht würde ich ihn basteln, da es mich wurmt, das ich hier ein so unflexibles gebilde eingebracht habe.

Konstrukte der art wären dann möglich:

Delphi-Quellcode:
var rc4DekoStream:TRC4StreamDecorator;
begin
  rc4DekoStream:= TRC4StreamDecorator( TFileStream.Create('c:\dat'), fmCreate) );
  try
    myCollection.saveToStream( rc4DekoStream );
  finally
    rc4DekoStream.free;
  end;
end;
egal welcher stream sich im inneren befindet, die daten laufen erstmal durch die verschlüsselung und dann in den eigentlichen stream. Damit ist man nicht mehr von irgendwelcher ableitungshierarchien abhängig und kann die funktionalitäten beliebig kombinieren :-D

dpCollection rules :dp:

alcaeus 4. Feb 2005 12:53

Re: Record mit array in Datei schreiben?
 
Hallo maximov,

Zitat:

Zitat von maximov
da die dpCollection auf streams basiert und du sie nicht in reinform speichern willst (egal ob binär oder text), würde sich eine strom-verschlüsselung anbieten. Und dafür haben wir ja Hagens RC4 verschlüsselung, die sehr schnell ist unhd tausendmal sicherer als irgendwas einfach zu negieren:

es geht nicht unbedingt darum, die Texte unknackbar zu verschluesseln, sondern mehr darum, ein zufaelliges Aendern der Texte zu verhindern (es soll ja User geben die sowas machen wuerden :roll:). Das mit der Wrapper-klasse kannst du ja gerne machen falls du Zeit hast, es waere definitiv ein gutes Feature fuer die Collection.

Zitat:

dpCollection rules :dp:
Stimmt :thumb: Ich habs heute probiert, und musste zwar das ganze Language-Support-System neu schreiben, hatte aber 2 Stunden nach Beginn alles fertig (Klassen, speichern, laden, setzen von Texten, ...). Die Collection ist echt gut :thumb:

Greetz
alcaeus

maximov 4. Feb 2005 13:15

Re: Record mit array in Datei schreiben?
 
Zitat:

Zitat von alcaeus
...es geht nicht unbedingt darum, die Texte unknackbar zu verschluesseln, sondern mehr darum, ein zufaelliges Aendern der Texte zu verhindern (es soll ja User geben die sowas machen wuerden :roll:). ...

Na, dann reicht Binary = true völlig aus, denn dann kann man es höchstens mit BinE zufällig änder (sofern es eine TmxJsCollection ist).

Den dekorierer mach ich bei gelegenheit :wink:

alcaeus 4. Feb 2005 13:32

Re: Record mit array in Datei schreiben?
 
Zitat:

Zitat von maximov
Na, dann reicht Binary = true völlig aus, denn dann kann man es höchstens mit BinE zufällig änder (sofern es eine TmxJsCollection ist).

Joa, das sollte reichen...

Zitat:

Den dekorierer mach ich bei gelegenheit :wink:
Super, darf ich dich um einen Gefallen bitten? Halte die neue Klasse abwaertskompatibel (evtl. ein zusaetzliches Flag), so dass ich nicht alles neu bearbeiten muss ;)

Greetz
alcaeus

Robert_G 4. Feb 2005 13:56

Re: Record mit array in Datei schreiben?
 
[quote="alcaeus"]
Zitat:

Zitat von maximov
Zitat:

Den dekorierer mach ich bei gelegenheit :wink:
Super, darf ich dich um einen Gefallen bitten? Halte die neue Klasse abwaertskompatibel (evtl. ein zusaetzliches Flag), so dass ich nicht alles neu bearbeiten muss ;)

Sollte sich eigentlich nicht viel ändern.
Das DFM-streaming ist eigentlich immer abwärtskomptibel. ;) (ist einer DER Vorteile gegenüber solchen Bastelleien wie file of <type>)

maximov 4. Feb 2005 14:44

Re: Record mit array in Datei schreiben?
 
Jungs! Ihr habt nicht richtig zugehört :-D Der stream-dekorierer hat nix mit der dpCollection zu tun. Höchstens mit dem stream, den man zum streamen benutzt und, da ein Dekorierer nach aussen immer eine kompatible schnittstelle haben muss, braucht ihr euch keine sorgen zu machen.

alcaeus 4. Feb 2005 16:20

Re: Record mit array in Datei schreiben?
 
Super! Ich werde dann mal alles fertigstellen, vielleicht stell ich ja das Language Support System mal hier rein...
Thema erledigt, danke an alle! :thumb:

Greetz
alcaeus

maximov 20. Feb 2005 15:19

Re: Record mit array in Datei schreiben?
 
Zitat:

Zitat von maximov
...
Den dekorierer mach ich bei gelegenheit :wink:

So die gelegenheit war gestern und zu finden is der RC4 Stromdekorierer hier: http://www.delphipraxis.net/internal...586&highlight=

Nich das man denkt ich würde sachen versprechen, die ich nicht halte :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz