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:
|
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'); CompoWoAlleDrinne. DestroyComponents; LoadCompoFromFile(CompoWoAlleDrinne,'c:\schlagmichtot.dfm'); |
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
TINIFILE und
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:
| 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!