Autor Beitrag
Delphi-Neuling :|
Hält's aus hier
Beiträge: 9

Win XP
D7 Enterprise
BeitragVerfasst: 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 :eyes:
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: 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:

ausblenden volle Höhe 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:
ausblenden 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.

_________________
mfg.
mâximôv


Zuletzt bearbeitet von maximus am Do 06.11.03 18:24, insgesamt 1-mal bearbeitet
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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.

Gruß
Klabautermann
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Do 06.11.03 18:26 
Immer diese langweiligen, arbeitsintensiven standard methoden! :twisted:

_________________
mfg.
mâximôv
Delphi-Neuling :| Threadstarter
Hält's aus hier
Beiträge: 9

Win XP
D7 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Sa 08.11.03 20:48 
Schreib dir morgen (sonntag) was dazu...muss jetzt erstma die reperbahn unsicher machen :wink:

_________________
mfg.
mâximôv
Delphi-Neuling :| Threadstarter
Hält's aus hier
Beiträge: 9

Win XP
D7 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Mo 10.11.03 19:43 
Ich arbeite drann...sorry, aber ich wollt dir nicht so'ne halbe sache geben :wink:

_________________
mfg.
mâximôv
Delphi-Neuling :| Threadstarter
Hält's aus hier
Beiträge: 9

Win XP
D7 Enterprise
BeitragVerfasst: Mo 10.11.03 20:16 
achso... :oops: :oops: ! Danke :lol: :lol:!
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Mo 10.11.03 23:11 
Sooo! Hab da mal was cooles gebastelt :D

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.

_________________
mfg.
mâximôv
Delphi-Neuling :| Threadstarter
Hält's aus hier
Beiträge: 9

Win XP
D7 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: 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:


ausblenden 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.

_________________
mfg.
mâximôv
G-man
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 258

Win 2000, Win ME, SuSE 8.2
D5 Standard, D6 Professional
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 258

Win 2000, Win ME, SuSE 8.2
D5 Standard, D6 Professional
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: 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:

_________________
mfg.
mâximôv
Delphi-Neuling :| Threadstarter
Hält's aus hier
Beiträge: 9

Win XP
D7 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Do 13.11.03 02:11 
Zitat:
was bedeutet selektieren?


Bedeutet 'auswählen' :wink:

_________________
mfg.
mâximôv
Delphi-Neuling :| Threadstarter
Hält's aus hier
Beiträge: 9

Win XP
D7 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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