Entwickler-Ecke

Dateizugriff - Mehrere Komponenten speichern


Delphi-Neuling :| - Do 06.11.03 18:03
Titel: Mehrere Komponenten speichern
Hi,

ich habe vor kurzem angefangen mit Delphi zuprogrammieren. Ich habe das folgende Problem:
Mein Programm soll mehrere Komponenten (RichEdit, CheckBox, EditMask) in eine *.txt Datei speichern. Da ich neu in diesem Gebiet bin, weiss ich das Prinzip nicht, wie man das macht. Ich habe nur gehört, dass es mit Streams funktioniert. Aber ich weiss auch nicht wie man Streams einsetzt.

Ich danke schon im voraus für eure Hilfe :eyes:


maximus - Do 06.11.03 18:19

Hallo, da bin ich der richtige :D Hab da nämlich eine unit für geschrieben, welche das component-streaming-system von delphi benutz:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
{ -- Author: max hub (aka maximov alias maximus) - 2003 --} 

unit dmService; 

interface 

uses classes, sysUtils, TypInfo; 


function SaveCompoToFile(aCompo : TComponent; FileName: string; asBinary: Boolean = false): boolean; 
function LoadCompoFromFile(aCompo : TComponent; FileName: string; asBinary: Boolean = false): boolean; 


implementation 



function SaveCompoToFile(aCompo : TComponent; FileName: string; asBinary: Boolean = false): boolean; 
var Stream1:TMemoryStream; 
    Stream2:TMemoryStream; 
      format : TStreamOriginalFormat; 
begin 
  result := false; 
  format  := sofText; 
  Stream1 := TMemoryStream.Create; 
  Stream2 := TMemoryStream.Create; 
  try 
    Stream1.WriteComponent(aCompo); 
    Stream1.Position := 0
    if not asBinary then 
    begin 
      format := sofText; 
      ObjectBinaryToText(Stream1,Stream2,format); 
    end else Stream1.SaveToStream(Stream2); 
    Stream2.SaveToFile(FileName); 
    result := true; 
  finally 
    Stream1.Free; 
    Stream2.Free; 
  end
end


function LoadCompoFromFile(aCompo : TComponent; FileName: string; asBinary: Boolean = false): boolean; 
var FileStream:TFileStream; 
    MemoryStream:TMemoryStream; 
    format:TStreamOriginalFormat; 
begin 
  result := false; 
  if not FileExists(fileName) then exit; 
  MemoryStream := TMemoryStream.Create; 
  FileStream := TFileStream.Create(FileName,fmOpenRead); 
  try 
    if not asBinary then 
    begin 
      format := sofBinary; 
      ObjectTextToBinary(FileStream,MemoryStream,format); 
    end else MemoryStream.LoadFromStream(FileStream); 
    MemoryStream.Position := 0;    
    MemoryStream.ReadComponent(aCompo); 
    result := true; 
  finally 
    FileStream.Free; 
    MemoryStream.Free; 
  end
end

end.



so kannst du dann speichern und laden:

Delphi-Quelltext
1:
2:
3:
4:
SaveCompoToFile(CompoWoAlleDrinne,'c:\schlagmichtot.dfm'); // zB. 
//... 
CompoWoAlleDrinne. DestroyComponents; // wichtig da sonst compos mit gleichem namen vorhanden wären ;)
LoadCompoFromFile(CompoWoAlleDrinne,'c:\schlagmichtot.dfm'); // zB.


Du erhälst dann einen 'normalen' DFM-text, der aber erst bei deiner compo anfängt...ich hoffe das meintest?

cu,
maximus.


Klabautermann - Do 06.11.03 18:22

Hallo,

Also das RichEdit kann die Daten selber speichern. Die andern beiden können das nciht von haus aus, wenn du die daten alle in der selben Datei haben möchtest, dann darfst du auch nicht die hauseigenene Funktion von RichEdit verwenden.

Wie soll denn deine Zieldatei aufgebaut sein?

Wenn dir da eine INI-Datei vorschwebt, dann bietet dir Delphi mit Suche in: Delphi-Forum, Delphi-Library TINIFILE und Suche in: Delphi-Forum, Delphi-Library TMEMINIFILE zwei herforagende Objekte für diesen zweck.
In den Tutorials findest du auch informationen darüber [http://www.delphi-forum.de/viewforum.php?f=14].

Gruß
Klabautermann


maximus - Do 06.11.03 18:26

Immer diese langweiligen, arbeitsintensiven standard methoden! :twisted:


Delphi-Neuling :| - Fr 07.11.03 17:13

hi maximus!

ähmm... den Quelltext verstehe ich fast gar nicht. Und ich weiss überhaupt nicht wo ich meine Komponenten hinschreiben soll... Könnest du bitte daher ein Beispiel mit 2 MaskEdits, 2 CheckBoxes und 2 RichEdits machen :?: :?: :?: :?: :?: :?:


maximus - Sa 08.11.03 20:48

Schreib dir morgen (sonntag) was dazu...muss jetzt erstma die reperbahn unsicher machen :wink:


Delphi-Neuling :| - Mo 10.11.03 19:34

maxentius hat folgendes geschrieben:
Schreib dir morgen (sonntag) was dazu...muss jetzt erstma die reperbahn unsicher machen

wird das noch was...?


maximus - Mo 10.11.03 19:43

Ich arbeite drann...sorry, aber ich wollt dir nicht so'ne halbe sache geben :wink:


Delphi-Neuling :| - Mo 10.11.03 20:16

achso... :oops: :oops: ! Danke :lol: :lol:!


maximus - Mo 10.11.03 23:11

Sooo! Hab da mal was cooles gebastelt :D

http://www.eyer-systems.de/data/mxPersistForm.zip

In den units 'mxPersistFm' und 'mxDFM' sind die funktionen.

Das testprog ist in 'PersistForm.dpr'

// alle 'published' properties werden automatisch gespeichert!
// Änderungen die zur laufzeit gemacht werden bleiben zur designzeit erhalten! and vice versa ;)

// WICHTIG: Damit die änderungen der designZeit nicht vom DFM-lade-speichern mechanismus überschrieben werden
// muss in Delphi die AUTO-SAVE option aktiviert sein: Tools->UmgebungsOptionen->AutoSave Editor files

Einfach mal testen und die kommentare im testprog lesen! ..kannst gerne fragen, wenn watt unklar ist :wink:

mfg.
maximus.


Delphi-Neuling :| - Di 11.11.03 15:44

Ja das Programm ist gut, aber ich wollte jeher eins mit: Btns für Laden und speichern und CheckBoxes. Aber das mit Laden/Speichern schaffe ich auch alleine auf die Btns zu übertragen :). Und ich wollte auch, dass das Programm die Daten in eine .txt datei speichert und dass beim Neuladen (des Programms) die Felder (der Komponenten) nicht verändert sind. Außerdem sollte es beim Starten abfragen ob es eine Datei Laden oder eine Neue erstellen soll.


maximus - Di 11.11.03 16:39

Junge das ist nur'n beispiel prog...nich immer den ganzen arm abreissen :mrgreen:

Die DFM datei ist eine text datei :wink: kannst von mir aus auch *.txt nennen. Musst nur eine kleiner direktive in deiner form-unit ändern:



Delphi-Quelltext
1:
{$R *.txt}                    


Zitat:
aber ich wollte jeher eins mit: Btns für Laden und speichern und CheckBoxes


Wer hält dich davon ab sie zu platzieren? ...es wird doch alles automatisch gespeichert, auch neue kompos da drauf :wink:

Auch das mit dem laden is kein thema: Im konstruktor, vor der 'DFMFile' zuweisung machst du deine abfragen (opendialog) und übergibst das resultat an 'DFMFile'. Willst du das eine neue datei erstellt wird, dann übergib einfach den neuen namen. Er läd dann nämlich die defaults aus den exe-resourcen und beim beenden wird die neue datei dann erstellt :wink: ...evtl. würd ich dir das mit dem file-selektieren noch basteln, wenn dich das überhaupt interessiert

Hab leider deinen namen ignoriert...passiert nicht wieder :twisted: Zum glück hab ich diese technik hauptsächlich für mich programmiert 8)


mfg.


G-man - Di 11.11.03 17:19

Du kanns die Kompos auch mit Threads speichern.


maximus - Di 11.11.03 17:23

G-man hat folgendes geschrieben:
Du kanns die Kompos auch mit Threads speichern.


Das musst du erklären? Wie können Threads speichern?


G-man - Di 11.11.03 17:28

Ich meine, dass man die speichern-procedure in einen Thread schreiben könnte und den dann aufrufen, wenn man speichern will.


maximus - Di 11.11.03 17:59

Im thread is was anderes. Aber warum sollte er das tun, wenn er nochnichtmal mit streams klar kommt? ...ausserdem seh ich da kein sinn, da es ja eh in 'no-time' geht :wink:


Delphi-Neuling :| - Mi 12.11.03 19:38

jetzt habe ich das programm gecheckt :wink: :!: :!:

maximus hat folgendes geschrieben:
...evtl. würd ich dir das mit dem file-selektieren noch basteln, wenn dich das überhaupt interessiert

was bedeutet selektieren?


maximus - Do 13.11.03 02:11

Zitat:
was bedeutet selektieren?


Bedeutet 'auswählen' :wink:


Delphi-Neuling :| - Fr 14.11.03 20:46

Meinst du eine Datei auswählen, wo man die *.dfm Daten speichert???

Wie kann ich die Speicher und Lade Funktion auf zwei Btns übertragen?


Tino - Mo 17.11.03 09:36

Delphi-Neuling :| hat folgendes geschrieben:
Wie kann ich die Speicher und Lade Funktion auf zwei Btns übertragen?

Du benutzt einfach die TOpenDialog und TSaveDialog Komponenten und rufst dann deine laden bzw. speichern Funktion auf.

Gruß
Tino