| Autor |
Beitrag |
Delphi-Neuling :|
Hält's aus hier
Beiträge: 9
Win XP
D7 Enterprise
|
Verfasst: Do 06.11.03 18:03
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 
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Do 06.11.03 18:19
Hallo, da bin ich der richtige  Hab da nämlich eine unit für geschrieben, welche das component-streaming-system von delphi benutz:
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.
_________________ mfg.
mâximôv
Zuletzt bearbeitet von maximus am Do 06.11.03 18:24, insgesamt 1-mal bearbeitet
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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.
Gruß
Klabautermann
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Do 06.11.03 18:26
Immer diese langweiligen, arbeitsintensiven standard methoden! 
_________________ mfg.
mâximôv
|
|
Delphi-Neuling :| 
Hält's aus hier
Beiträge: 9
Win XP
D7 Enterprise
|
Verfasst: Fr 07.11.03 17:13
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Sa 08.11.03 20:48
Schreib dir morgen (sonntag) was dazu...muss jetzt erstma die reperbahn unsicher machen 
_________________ mfg.
mâximôv
|
|
Delphi-Neuling :| 
Hält's aus hier
Beiträge: 9
Win XP
D7 Enterprise
|
Verfasst: 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
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Mo 10.11.03 19:43
Ich arbeite drann...sorry, aber ich wollt dir nicht so'ne halbe sache geben 
_________________ mfg.
mâximôv
|
|
Delphi-Neuling :| 
Hält's aus hier
Beiträge: 9
Win XP
D7 Enterprise
|
Verfasst: Mo 10.11.03 20:16
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Mo 10.11.03 23:11
Sooo! Hab da mal was cooles gebastelt
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
mfg.
maximus.
_________________ mfg.
mâximôv
|
|
Delphi-Neuling :| 
Hält's aus hier
Beiträge: 9
Win XP
D7 Enterprise
|
Verfasst: 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
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Di 11.11.03 16:39
Junge das ist nur'n beispiel prog...nich immer den ganzen arm abreissen
Die DFM datei ist eine text datei  kannst von mir aus auch *.txt nennen. Musst nur eine kleiner direktive in deiner form-unit ändern:
Delphi-Quelltext
| 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
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  ...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  Zum glück hab ich diese technik hauptsächlich für mich programmiert
mfg.
_________________ mfg.
mâximôv
|
|
G-man
      
Beiträge: 258
Win 2000, Win ME, SuSE 8.2
D5 Standard, D6 Professional
|
Verfasst: Di 11.11.03 17:19
Du kanns die Kompos auch mit Threads speichern.
_________________ ...To err is human, but to really foul things up requires a computer.
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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?
_________________ mfg.
mâximôv
|
|
G-man
      
Beiträge: 258
Win 2000, Win ME, SuSE 8.2
D5 Standard, D6 Professional
|
Verfasst: 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.
_________________ ...To err is human, but to really foul things up requires a computer.
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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 
_________________ mfg.
mâximôv
|
|
Delphi-Neuling :| 
Hält's aus hier
Beiträge: 9
Win XP
D7 Enterprise
|
Verfasst: Mi 12.11.03 19:38
jetzt habe ich das programm gecheckt
| 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
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Do 13.11.03 02:11
| Zitat: | | was bedeutet selektieren? |
Bedeutet 'auswählen' 
_________________ mfg.
mâximôv
|
|
Delphi-Neuling :| 
Hält's aus hier
Beiträge: 9
Win XP
D7 Enterprise
|
Verfasst: 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
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: 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
|
|