Autor Beitrag
V!P3R
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151



BeitragVerfasst: Sa 14.06.08 11:46 
Hallo.
Ich habe ein Programm, in dem man viel ändern kann. also z.b datum, uhrzeit, positionen von 20 verschieden Memos usw.
die einzige art, wie ich es schaffe an die informationen ranzukommen, die ich beim letzen nutzen des programms verändert habe, ist die Funktion:
ausblenden Delphi-Quelltext
1:
Memo1.Lines.SaveToFile('Beispiel.txt');					


Ich suche jetzt aber eine bessere möglichkeit wirklich ALLE Änderungen in meinem Projekt zu speichern, und beim nächsten starten des Programms wieder aufzurufen.

Habt ihr eine gute Idee?

Vielen Dank im Voraus

MfG


Moderiert von user profile iconTino: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 17.07.2008 um 10:13


Zuletzt bearbeitet von V!P3R am So 13.07.08 13:06, insgesamt 1-mal bearbeitet
GericasS
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 540

Windows Vista Home Premium
D2010, VisualStudio2008
BeitragVerfasst: Sa 14.06.08 11:58 
Eine gute Möglichkeit wäre da ein Ini-File anzulegen und da die Informationen reinzuspeichern =)

LG

GericasS

_________________
Alexander N.
Neue Bewaffnung Amilo xi2428 T9300
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 14.06.08 12:35 
Wofür musst du das denn genau haben? "Alles speichern" ist sehr allgemein. Du solltest die Daten schon selektiv in einem sinnvollen Format speichern. Und wenn du nur die Änderungen speichern willst muss das Programm rausfinden können, was sich verändert hat, wozu es u.U. notwendig ist, die Werte vor der Änderung zu kennen.

Du kannst eine Komponente und alle darunterliegenden Komponenten mit TStream.WriteComponent/ReadComponent serialisieren/deserialisieren. Wenn das aber nicht ein rein privates Projekt ist, ist das aber logischerweise die falsche Lösung.
V!P3R Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151



BeitragVerfasst: Sa 14.06.08 12:44 
Ich nenne mal ein paar beispiele:

Ich habe ein TabbedNotebook mit 5 verschiedenen Tabs.
Im 1.Tab ist zum Beispiel : eine bestimmte Uhrzeit, die immermal geändert wird, ein datum was auch geändert wird usw. es wäre umständlich das ganzen mit meiner lösung anzugehen (s.o.)
Im 2.Tab habe ich z.B. 20 Memos, deren eigenschaften: Color, Text und Top, Left ich ändern kann
sprich 20 mal 4 möglichkeiten beläuft sich auf 80 verschiedenen informationen, was mit SaveToFile verdammt viel Arbeit wäre, da ich für jede änderung eine eigene *.txt datei erstellen müsste.

Ich suche eine möglichkeit wie ich alle änderungen (also Topwerte, Leftwere, Color, Texte, Daten usw.) in einer datei speichern kann, um sie beim nächsten start wieder aufrufen zu können.


MfG

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Hi ich hab INI ausprobiert aber Delphi meldet fehler:
ausblenden Delphi-Quelltext
1:
[Fehler] Unit1.pas(4430): Undefinierter Bezeichner: 'TIniFile'					


Gibts ein Objekt das sah heißt? wenn ja, unter welchem reiter wäre das zu finden?

Edit1: Hab fehler gefunden, ich hab jetzt bei uses noch IniFiles hinzugefügt.

MfG

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Okay
Ich möchte den Text aus Edit1 in der Ini speichern und anschließend wieder einlesen.

wie mache ich das? und ist der rest richtig?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button1Click(Sender: TObject);
var Ini: TIniFile;
begin
Ini :=TIniFile.Create('C:\Versuch.INI');
Ini.WriteString('??', '??', '??');
Ini.Free;
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button2Click(Sender: TObject);
var Ini: TIniFile;
begin
Ini :=TIniFile.Create('C:\Versuch.INI');
Ini.ReadString('??', '??', '??');
Ini.Free;
end;



MfG
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Sa 14.06.08 14:06 
Ja, der Text dürfte so richtig sein.

ini.writestring (und writeinteger, writebool etc) erwartet drei parameter, der erste ist der Sektionsmname in der ini Datei der zweite der Schlüssel (dient beides nur zur lokalisierung der Information) der dritte parameter ist der Text (integer...) der in der angegebenen sektion unter dem angegebenen schlüssel gespeichert werden soll.

readstring ist eine function. Die ersten parameter geben an welchen Teil der ini du ausliest (Sektion+Schlüssel) der dritte parameter ist der wert den die funktion dir liefert, wenn es die angegebene Sektion/Schlüssel nicht gibt. Richtig wäre der aufruf also ungefähr so

ausblenden Delphi-Quelltext
1:
edit1.text:=ini.readstring('Editfelder','1', 'Standardwert');					
Blackheart666
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Sa 14.06.08 14:16 
Danach dürften keine Fragen mehr auftauchen. :wink:
www.kuknet.de/tutorial1.pdf

_________________
Blackheart666
Der Irrsinn ist bei Einzelnen etwas Seltenes, - aber bei Gruppen, Parteien, Völkern, Zeiten die Regel. (Friedrich Nietzsche)
V!P3R Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151



BeitragVerfasst: So 15.06.08 11:14 
Vielen, vielen Dank euch allen, jetzt klappts wunderbar.

Außer ein Einzelfall:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.B_INI_WriteClick(Sender: TObject);
begin
Ini :=TIniFile.Create('C:\Versuch.INI');
Ini.WriteString('Sek2', 'CB_Anlass', CB_Anlass.Text);
Ini.WriteString('Sek2', 'CB_Von', CB_Von.Text);
Ini.WriteString('Sek2', 'CB_Und', CB_Und.Text);
Ini.Free;
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.B_INI_ReadClick(Sender: TObject);
begin
Ini :=TIniFile.Create('C:\Versuch.INI');
CB_Anlass.Text:=Ini.ReadString('Sek2', 'CB_Anlass', 'Normales Treffen');
CB_Von.Text:=Ini.ReadString('Sek2', 'CB_Von', 'Von');
CB_Und.Text:=Ini.ReadString('Sek2', 'CB_Und', 'Und');
Ini.Free;
end;


Randinformationen:

Alle 3 Strings sind TCombobox
CB_Von und CB_Und sind Visible=False beim Start
Wenn ich B_INI_WriteClick und anschließend B_INI_Read.Click mache ist CB_Von und CB_Und = 1 oder 0 warum? und wie kann ich das ändern?

PS: Die Visible Eigenschaft von beiden hab ich auch als WriteBool und ReadBool aufgeführt.


MfG


EDIT:

Achsoo jetzt hab ich meinen dämlichen fehler entdeckt

Wie gesagt habe ich: "Die Visible Eigenschaft von beiden hab ich auch als WriteBool und ReadBool aufgeführt." und denen hab ich die gleiche Sektion UND den gleichen Namen gegeben.


Okay, dann ist meine frage komplett beantwortet.

Vielen Dank
V!P3R Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151



BeitragVerfasst: So 15.06.08 16:37 
Hallo, eine Frage hab ich dann doch noch:

Ich will aus einem TFontDialog die Eigenschaften in eine INI schreiben

soweit so gut, aber wie komm ich an den Font Style ran?

ausblenden Delphi-Quelltext
1:
2:
3:
Ini.WriteBool('Sek5', 'FD.S', FontDialog1.Font.Style);
//Fehler: 
[Fehler] Unit1.pas(4787): Inkompatible Typen: 'Boolean' und 'TFontStyles'


ausblenden Delphi-Quelltext
1:
2:
3:
Ini.WriteBool('Sek5', 'FD.S', FontDialog1.Font.Style [fsBold,fsItalic,fsUnderline,fsStrikeOut]);
//Fehler:
[Fehler] Unit1.pas(4787): Array-Typ erforderlich


ausblenden Delphi-Quelltext
1:
2:
3:
Ini.WriteBool('Sek5', 'FD.S', FontDialog1.Font.Style []);
//Fehler:
[Fehler] Unit1.pas(4787): Ausdruck erwartet, aber ']' gefunden


Wie geht das denn?

MfG
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: So 15.06.08 16:45 
Hallo,

hier musst du die einzelnen Style-Eigenschaften separat speichern. Also so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
Ini.WriteBool('Sek5', 'FD.S.Bold', fsBold in FontDialog1.Font.Style);
Ini.WriteBool('Sek5', 'FD.S.Italic', fsItalic in FontDialog1.Font.Style);
Ini.WriteBool('Sek5', 'FD.S.Underline', fsUnderline in FontDialog1.Font.Style);
Ini.WriteBool('Sek5', 'FD.S.Strikeout', fsStrikeout in FontDialog1.Font.Style);

Grüße,
Yogu
V!P3R Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151



BeitragVerfasst: So 15.06.08 17:10 
Vielen Dank

Und wie muss es dann beim einlesen heißen??

Ich hab probiert:

ausblenden Delphi-Quelltext
1:
2:
3:
fsBold in FontDialog1.Font.Style:=Ini.ReadBool('Sek5', 'FD.S.Bold', False);
//Fehler:
[Fehler] Unit1.pas(5127): Inkompatible Typen: 'TFontStyles' und 'Boolean'


MfG
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: So 15.06.08 17:20 
Hallo,

ausblenden Delphi-Quelltext
1:
2:
3:
if Ini.ReadBool('Sek5', 'FD.S.Bold', False) then
  FontDialog1.Font.Style := FontDialog1.Font.Style + [fsBold];
{...}

Vielleicht geht es auch eleganter, aber mir fällt keine bessere Möglichkeit ein.

Grüße,
Yogu
Andymann
Hält's aus hier
Beiträge: 1

Win 2000, Win XP, Win Vista, Suse 10
Delphi 2007 Prof., VS 2008 Standard, #Develop, Lazarus
BeitragVerfasst: So 15.06.08 18:14 
Hallo,

eine weitere Alternative wäre:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
//unit TypInfo in uses aufnehmen

//Schreiben in die Ini ->
Ini.WriteString('Font', 'Style', GetPropValue(FontDialog1.Font, 'Style'));

//Lesen aus der Ini ->
SetPropValue(FontDialog1.Font, 'Style', Ini.ReadString('Font', 'Style', ''));


Gruß Andy
V!P3R Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151



BeitragVerfasst: So 15.06.08 18:37 
Danke an euch beide,

Ich habe jetzt aber die möglichkeit von Yogu genommen

MfG

PS: Alle Fragen geklärt!
V!P3R Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151



BeitragVerfasst: So 13.07.08 13:05 
Hallo, ich hab jetzt mal ne ganz neue Frage: (Die trotztdem eng mit dem rest zusammen hängt)

Ich habe ein RichEdit mit VERSCHIEDENEN FontStyles, FontFarben und FOntgrößen und alles im selben RichEdit
(Ich habe vorher mit "SelAttributes" gearbeitet, wenn ich das einfach normal in die INI reinschreibe, und am schluss wieder einlese, ist der Style, die Farbe und die Größe von allen Gleich.

Wie kann ich das in eine INI schreiben, (bzw. aus einer INI lesen) ohne das sich die werte ändern bzw. alle gleichwerden?

kann ich das auch irgentwie mit "SelAttributes" managen?

MfG
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: So 13.07.08 13:10 
Du könntest einfach den Inhalt des RichEdits speichern. Dann werden neben dem eigentlichen Text auch die entsprechenden Formatierungs-Einstellungen mitgespeichert.

Eine andere Möglichkeit wäre, die Bereiche, die unterschiedliche Formatierungen haben, abzuklappern und diese Informationen über SelAttributes zu speichern. Ich kenne mich aber damit nicht aus, benutzt habe ich es noch nie.
V!P3R Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151



BeitragVerfasst: So 13.07.08 13:22 
ja, aber ich hab alle eigenschaften von dem richedit in die INI geschrieben,

-Font.Style
-Font.Color
-Font.Charset
-Font.Name
-Font.Height
-Font.Pitch
-Font.Size
-RichEdit.Text

trotzdem funktioniert es nicht.

MfG
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: So 13.07.08 13:56 
warum speicherst du nicht das richedit im RichTextFormat? vielleicht mittels Stream oder so. und dann einfach als string in die INI anhängen. Damit bleibt die Formatierung.

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
V!P3R Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151



BeitragVerfasst: So 13.07.08 14:12 
RichTextFormat? wie speicher ich das)
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: So 13.07.08 14:15 
Richedit1.Lines.SaveToStream(MyStream); -> Wenn du es in einen Stream speichern möchtest.

Richedit1.Lines.SaveToFile(MyPathToFile); -> Wenn du es in ein File speichern willst.

ACHTUNG!!! RICHEDIT1.PLAINTEXT MUSS FALSE SEIN!!!!

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
V!P3R Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 151



BeitragVerfasst: So 13.07.08 14:23 
achso, ja die ide mit "SaveToFile" hatte ich auch schon, aber wie schreibe ich das in die INI wie du das gesagt hast?