Hallo liebe Community!
Ich habe folgendes Problem:
Ich habe mir ein Programm geschrieben, was aus 2 Teilen besteht: Dem Wizard zum Erstellen von 2 Konfigurationsdateien und dem Hauptprogramm was Informationen aus den beiden Konfigurationsadateien ausliest.
Jetzt möchte ich es so machen, dass der Wizard die 2 erstellten Konfiguartionsdateien mit an die exe-Datei des Hauptprogrammes anhängt bzw. einbindet.
Weil im Moment muss ich immer alle 3 Dateien weitergeben:
Die 2 Konfigurationsdateien und das Hauptprogramm. Und das soll dann jetzt alles nur noch eine Datei sein!
Das habe ich jetzt so realisiert:
Delphi-Quellcode:
function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
aStream: TFileStream;
iSize: Integer;
begin
Result := False;
if not FileExists(AFileName) then
Exit;
try
aStream := TFileStream.Create(AFileName, fmOpenWrite or fmShareDenyWrite);
MemoryStream.Seek(0, soFromBeginning);
// seek to end of File
// ans Ende der Datei Seeken
aStream.Seek(0, soFromEnd);
// copy data from MemoryStream
// Daten vom MemoryStream kopieren
aStream.CopyFrom(MemoryStream, 0);
// save Stream-Size
// die Streamgröße speichern
iSize := MemoryStream.Size + SizeOf(Integer);
aStream.Write(iSize, SizeOf(iSize));
finally
aStream.Free;
end;
Result := True;
end;
function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
aStream: TFileStream;
iSize: Integer;
begin
Result := False;
if not FileExists(AFileName) then
Exit;
try
aStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
// seek to position where Stream-Size is saved
// zur Position seeken wo Streamgröße gespeichert
aStream.Seek(-SizeOf(Integer), soFromEnd);
aStream.Read(iSize, SizeOf(iSize));
if iSize > aStream.Size then
begin
aStream.Free;
Exit;
end;
// seek to position where data is saved
// zur Position seeken an der die Daten abgelegt sind
aStream.Seek(-iSize, soFromEnd);
MemoryStream.SetSize(iSize - SizeOf(Integer));
MemoryStream.CopyFrom(aStream, iSize - SizeOf(iSize));
MemoryStream.Seek(0, soFromBeginning);
finally
aStream.Free;
end;
Result := True;
end;
procedure TForm1.SaveClick(Sender: TObject);
var
aStream: TMemoryStream;
begin
aStream := TMemoryStream.Create;
Memo1.Lines.SaveToStream(aStream);
AttachToFile('Test.exe', aStream);
aStream.Free;
end;
procedure TForm1.LoadClick(Sender: TObject);
var
aStream: TMemoryStream;
begin
aStream := TMemoryStream.Create;
LoadFromFile('Test.exe', aStream);
Memo1.Lines.LoadFromStream(aStream);
aStream.Free;
end;
Habe das von SwissDelphiCenter.
Ist das eine vernünfitige Lösung oder gibt es noch eine bessere?
Wenn das die Beste ist, dann folgende Fragen:
Die eine Datei von meinen beiden Konfigurationsdateien ist im Ini-Format. Da ist das Einlesen kein Problem, aber die andere Datei wird bei mir wie folgt erstellt:
Delphi-Quellcode:
type
TProdukt = record
Nummer: integer;
Beschreibung: string[200];
Preis: real;
end;
begin
AssignFile(datei, 'test.abc'); // Dateizuweisung
Rewrite(datei); // Erstellt die Datei
for i := 0 to Produkte.Items.Count - 1 do // Durchläuft alle Zeilen wobei Produkte eine TListView-Komponente ist
with Produkte.Items.Item[i] do
begin
datensatz.Nummer := StrToInt(Caption); // Spalte 1
datensatz.Beschreibung := SubItems.Strings[0]; // Spalte 2
datensatz.Preis := StrToFloat(SubItems.Strings[1]); // Spalte 3
write(datei, datensatz); // Schreibt die Datei
end;
CloseFile(datei);
end;
Und jetzt ist das Problem, wie ich die wieder einlese.
Bis her habe ich das so gemacht:
Delphi-Quellcode:
AssignFile(datei, 'test.abc');
Reset(datei);
i := 0;
while (not EOF(datei)) do
begin
SetLength(produkte, i + 1);
read(datei, produkte[i]);
cbProdukt1.Items.Add(produkte[i].Beschreibung); // cbProdukte ist jeweils eine Combobox
cbProdukt2.Items.Add(produkte[i].Beschreibung);
cbProdukt3.Items.Add(produkte[i].Beschreibung);
cbProdukt4.Items.Add(produkte[i].Beschreibung);
cbProdukt5.Items.Add(produkte[i].Beschreibung);
inc(i);
end;
CloseFile(datei);
Wie kann ich nun das gleiche damit erreichen, aber so, dass die beiden Dateien trotzdem an die exe-File mit rangehängt werden?
Wie sicher sind die Daten, die ich an die exe-Datei mitranhänge?
Sollte ich die noch verschlüsseln mit RSA oder so bzw. lohnt es sich?
Kann die eigtl. exe-Datei irgendwie Schaden nehmen oder kann es da zu unerwarteten Fehlern kommen?
Hoffe, dass ihr mir helfen könnt!
Danke im Voraus!
Eagelone