Autor Beitrag
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mi 15.06.11 10:45 
Also um es umzusetzen musst du für jedes deiner Felder die du Speichern möchtest genau das machen was Andreas geschrieben hat. Zum auslesen machst du dann eben nicht write sondern read. Und anschließend kannst du die Prozedur speichern überall wo du sie ausführen möchtest einbinden.

Z.b.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure Button1.Click(Sender: TObject);
begin
  Self.Speichern; // Das wars auch schon.
end;


So musst du den Quellcode auch nur an einer Stelle ändern wenn du etwas am Speichern ändern möchtest.
Außerdem ist es immer gut sinnvolle Namen für die Einträge in die INI-Datei zu vergeben.
Salieri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 15.06.11 10:54 
Danke, dann werd ich damit erstmal beginnen, das wird sicher ein wenig Zeit in Anspruch nehmen. Danke soweit.
Frage: Kann ich auch einen relativen Pfad für die Ini-Datei angeben? Also so, dass die Datei immer im Selben Ordner gespeichert wird wie die Exe?
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Mi 15.06.11 10:56 
ausblenden Delphi-Quelltext
1:
ExtractFilePath(Application.ExeName)					


Gibt den Pfad zur EXE zurück
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 15.06.11 11:00 
Wobei das Speichern in den eigenen Ordner nicht funktioniert, wenn du später einmal das Programm irgendwo installierst. Zum Testen geht das, aber nicht zum echten Einsatz, es sei denn als portables Programm:
www.delphi-library.d...ewtopic.php?p=548600
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Mi 15.06.11 11:05 
@Jaenicke: Er sagt doch das er das Programm nur für sich selbst schreibt. Wenn es natürlich irgendwann mal weitergegeben wird ist deine Aussage vollkommen richtig :zustimm:
Salieri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 15.06.11 11:37 
Ich muss mich entschuldigen, dass man mir alles haarklein erklären muss, aber ich vergesse auch recht gern was und ich kann mir das grad nicht selber zusammen reimen:

ausblenden Delphi-Quelltext
1:
2:
3:
type
  TReMe = class(TForm)
    procedure TReMe.Speichern;

Was muss ich hinter dem Speichern noch setzen? Egal was ich versuche ich bekomme die Fehlermeldung = erwartet, aber ; gefunden.

Und:

Zitat:
ausblenden Delphi-Quelltext
1:
ExtractFilePath(Application.ExeName)					

Vielen Dank, aber wie verwende ich das hier konkret?
Edit: Ah, ich glaub ich habs schon im Tutorial gefunden...

Ach ja und das ist tatsächlich nur für den Eigengebrauch und selbst wenn ich es weiter geben würde, dann eh nur portabel, zumal ich es eh auf einen Stick kopieren werde den ich dann ans DVD-Regal hänge.
Aber danke für den Einwand, könnte für zukünftige Überlegungen wertvoll sein.
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Mi 15.06.11 11:40 
1.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TReMe = class(TForm)
    procedure Speichern;

...

procedure TReMe.Speichern;
begin
  //
end;


2.
ausblenden Delphi-Quelltext
1:
  ini := TMemIniFile.Create(ExtractFilePath(Application.ExeName) + 'Dateiname.ini');					
Salieri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 15.06.11 12:00 
Zu 1.:
Natürlich, manchmal sieht man den Walt vor Bäumen nicht. xD
Danke.

Zu 2.:
ausblenden Delphi-Quelltext
1:
  ini := TMemIniFile.Create(ExtractFilePath(Application.ExeName) + 'Savedata.ini');					

So hab ich es, es wird aber nur eine Datei namens filepath ohne Endung ausgegeben. Wenn ich sie um .ini erweitere und im Editor öffne enthält sie die eingegebenen Werte.

ausblenden Delphi-Quelltext
1:
    ini.writeinteger('Abschnitt''Feld1', StrToInt(E1.Text));					

Wie muss das bei einem Text aussehen, also für die Serientitel?
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mi 15.06.11 12:09 
aus write"integer"
wird write"string"
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mi 15.06.11 14:52 
Ich würde in die IniDatei auch den Feldnamen mit angeben:



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:
uses ..., IniFiles;

:
:
:

type
  TForm1 = class(TForm)
    e_Nr1: TEdit;
    e_Nr2: TEdit;
    e_Nr3: TEdit;
    procedure Speichern(Sender: TObject);
:
:
  private
:
    { Private-Deklarationen }
  public
:
    { Public-Deklarationen }
  end;

implementation
:

procedure TForm1.Speichern(Sender: TObject);
var
  ini: TIniFile;
  FName : string;
begin
  ini := TIniFile.Create('C:\temp\Datei.ini');
  FName := (Sender as TEdit).Name;
  try
    ini.writeString('Edit', FName, (Sender as TEdit).Text);
  finally
    ini.free;
  end;
end;



Dann würde ich diese Speicheroperation als ONExit der Editfelder belegen. Schon wird jedes Edit-Feld mit seinem Inhalt beim Verlassen in die Inidatei gespeichert. Wenn es eh nur wenige Editfelder sind, macht die Speicheroperation geschwindigkeitsmäßig nicht so viel aus. Ich habe allerdings

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mi 15.06.11 16:21 
Hey,

warum machst du dir nich einfach ein Record-Array für die Werte? Das kann man dann auch ganz einfach speichern.

ausblenden 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:
type
  TDataRec: packed record
    str: String[25]; //String mit 25 Zeichen Länge
    int1, int2: Integer; //dazugehörige Integerwerte
  end;

  TDataRecArr = array[0..9of TDataRec;

var
  MyDataArray: TDataRecArr;

//speichern:
Stream := TFileStream.Create('C:\test.dat', fmCreate);
try
  Stream.Write(MyDataArray, SizeOf(MyDataArray));
finally
  Stream.Free;
end;

//laden:
Stream := TFileStream.Create('C:\test.dat', fmOpenRead);
try
  Stream.Read(MyDataArray, SizeOf(MyDataArray));
finally
  Stream.Free;
end;

Das Laden und Speichern machst du jeweils beim Starten bzw. Beenden des Programms. Dann hast du so wenig Zugriffe auf die Festplatte wie möglich. Wenn ein Edit geändert wird kannst du dann im OnChange die Werte im Array ändern. Wenn du den Tag deiner Edits noch richtig einstellst kannst du auch alle Edits in einer OnChange-Methode behandeln und dir aus dem Tag den Array-Index und die zu schreibenden Daten errechnen. Ein weitere Vorteil dieses Ansatzes ist, das du Model und View sauber getrennt hast und gut mit den Werten im Array arbeiten kannst.

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Salieri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 15.06.11 18:57 
user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
aus write"integer"
wird write"string"

Eben das reicht offenbar noh nicht aus. Ich erhalte jedenfall immernoch die Meldung, dass das kein Integerwert ist.



user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Ich würde in die IniDatei auch den Feldnamen mit angeben:

Keine Ahnung was das is und was es mir bringt...



user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
warum machst du dir nich einfach ein Record-Array für die Werte? Das kann man dann auch ganz einfach speichern.

Weil ich das nicht kenne und du damit leider zu spät kommst. Tut mir leid, ich weiß deine Hilfe auch durchaus zu schätzen, aber ich möchte jetzt erstmal eine Sache meistern bevor ich wieder eine neue Baustelle anfange.

Und um das hier nicht in Vergessenheit geraten zu lassen:
user profile iconSalieri hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden Delphi-Quelltext
1:
  ini := TMemIniFile.Create(ExtractFilePath(Application.ExeName) + 'Savedata.ini');					

So hab ich es, es wird aber nur eine Datei namens filepath ohne Endung ausgegeben. Wenn ich sie um .ini erweitere und im Editor öffne enthält sie die eingegebenen Werte.
beastofchaos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: Mi 15.06.11 22:51 
Herrlich, was für Diskussionen hier entflammen für so ein Themachen :P Aber schön, dass hier so viele sich dafür bemühen
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 16.06.11 00:38 
Hey,

vlt solltest du dein Konzept nochmal überdenken. Was ist wenn der User mehr als 10 Serien gleichzeitig schaut? Dann musst du jedesmal 3 neue Edits und 2 UpDownButtons machen? Wie wäre es denn mit einem Edit für den Titel, ein Edit+UpDown für die Staffel und ein Edit+UpDown für die Serie. Dann noch ein Button in dem du die Werte ausliest und in ein Memo oder ein ListBox schreibst. Die kannst du dann ganz easy mit SaveToFile speichern und mit LoadFromFile laden. Und der User kann auch so viel Serien eintragen wie er will...

Aber zu deinem Problem. Du kannst natürlich nicht einfach die Methode von WriteInteger in WriteString umbenennen und erwarten das alles geht, du musst dir auch die Parameter ansehen. WriteString erwartet 3 Strings (Section, Ident und Value) und WriteInteger erwartet 2 Strings und ein Integer (Section, Ident als String und Value als Integer). Und genau bei dem letzten Parameter meckert er rum, weil du noch einen String übergibst, er aber einen Integer haben will. Also entweder den String in einen Integer umwandeln (was dumm wäre, weil es in der Ini eh wieder ein String wird) oder einfach bei WriteString bleiben.

Eig ist in dem Thread schon alles gesagt was über Ini-Files zu sagen ist. Dir mangelt es eher an den Grundlagen. Ich würd dir erstmal das empfehlen: Delphi Crashkurs. Wenn du das gelesen (und damit meine ich lesen und verstehen und nicht nur überfliegen) hast, dann solltest du keine Schwierigkeiten mehr haben deine jetzige Idee in die Tat umzusetzen.
Wir helfen natürlich gern weiter wenn es noch irgendwo klemmt, aber die Grundlagen solltest du schon beherrschen...

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Salieri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 16.06.11 07:22 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
vlt solltest du dein Konzept nochmal überdenken. [...]

Wenn der User mehr als 10 Serien speichern wollte würde ich ihn fragen wo er das Programm überhaupt her hat; das ist - wie bereits gesagt - nur zum persönlichem Gebrauch und ich weiß im Moment noch nichtmal ob ich überhaupt 10 Felder brauche. Würde ich das Ergenis der Allgemeinheit präsentieren dann wäre deine Vorschlag sicher eine gute Sache aber da ich - wie du ja auch weiter unten feststellst - eig nicht mal alle Grundlagen beherrsche bleib ich erstmal bei dem Konzept.
Es ist übrigens nicht so dass ich überhaupt keine Ahnung von dem habe was ich da tue, ich bin einfach nur etwas eingerostet.

Zitat:
[...] oder einfach bei WriteString bleiben.

Ja ich bleib ja auch bei WriteString. Die Frage ist doch was ich mit dem letzten Teil mache:
ausblenden Delphi-Quelltext
1:
    ini.writeString('Abschnitt''Feld1', [b][u]StrToInt[/u](E1.Text)[/b]);					

Ich bin wie gesagt eingerostet, aber irgend eine Stimme aus dem All flüstert mir zu dass da nicht einfach StrToInt stehen bleiben kann. Oder lieg ich damit falsch?
Wenn ja: Woher kommt dann die Fehlermeldung (dass es sich nicht um einen Integerwert handelt)?
Wenn nein: Was kommt da sonst hin?

Zitat:
Dir mangelt es eher an den Grundlagen. Ich würd dir erstmal das empfehlen: Delphi Crashkurs.

Ich dachte ich käme wieder rein.
Was ich so sehe ist das ausführlicher als alles was ich inner 13. Klasse Informatikunterricht damals hatte. xD Ja okay, werd ich mir dann mal durchlesen, für den Moment muss das aber noch warten.
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Do 16.06.11 07:51 
www.planet-source-co...eId=568&lngWId=7
Dann sollte dir dein Fehler auffallen. ;)

(Ich hatte auch Informatik in der 11.) Und das war totaler schrott. ^^ Das könnten 50% dieses Forums sicher besser Unterrichten. ^^
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 16.06.11 08:14 
user profile iconSalieri hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
    ini.writeString('Abschnitt''Feld1', StrToInt(E1.Text));					

Oft mal hilft es auch schon, wen man einfach nur mal nachdenkt was man da macht. WriteString, du willst eine Zeichenkette in die Ini-Datei schreiben. Gut. Aber was machst du? StrtoInt. Jetzt überlege nur mal bitte fünf Sekunden, ob das so passen kann? Hinzukommt, man könnte sich auch mal die Fehlermeldungen des Compilers durchlesen und mal gucken auf welche Codestellen sie sich beziehen.
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: Do 16.06.11 09:00 
user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
Das könnten 50% dieses Forums sicher besser Unterrichten. ^^


Ich auch? 8)

_________________
Delphi: XE - OS: Windows 7 Professional x64
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Do 16.06.11 09:02 
user profile iconSalieri hat folgendes geschrieben Zum zitierten Posting springen:

Und um das hier nicht in Vergessenheit geraten zu lassen:
user profile iconSalieri hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden Delphi-Quelltext
1:
  ini := TMemIniFile.Create(ExtractFilePath(Application.ExeName) + 'Savedata.ini');					

So hab ich es, es wird aber nur eine Datei namens filepath ohne Endung ausgegeben. Wenn ich sie um .ini erweitere und im Editor öffne enthält sie die eingegebenen Werte.

Der Code sieht korrekt aus und funktioniert bei mir auch. Kopier bitte den Code aus Delphi hier ins Forum, irgendwo muss da was falsch sein, vllt. nur ein Zeichen, das kann schon eine Menge ausmachen.

EDIT: Statt Application.Exename kannst du auch ParamStr(0) verwenden. Glaube aber nicht das hier der Fehler liegt.

user profile iconSalieri hat folgendes geschrieben Zum zitierten Posting springen:

Zitat:
[...] oder einfach bei WriteString bleiben.

Ja ich bleib ja auch bei WriteString. Die Frage ist doch was ich mit dem letzten Teil mache:
ausblenden Delphi-Quelltext
1:
    ini.writeString('Abschnitt''Feld1', [b][u]StrToInt[/u](E1.Text)[/b]);					

Ich bin wie gesagt eingerostet, aber irgend eine Stimme aus dem All flüstert mir zu dass da nicht einfach StrToInt stehen bleiben kann. Oder lieg ich damit falsch?
Wenn ja: Woher kommt dann die Fehlermeldung (dass es sich nicht um einen Integerwert handelt)?
Wenn nein: Was kommt da sonst hin?


Also: Die Eigenschaft Text von eine TEdit ist vom Typ String (steht z. B. auch in der Delphi-Hilfe). Wenn du einen Wert als Integer abspeichern willst (WriteInteger), musst du diesen String erst in einen Integer umwandeln (das macht StrToInt). Wenn du den String aus dem Edit auch als String speichern möchtest, musst du ihn logischerweise auch nicht in einen Integer umwandeln. Entferne StrToInt und der Code sollte funktionieren.


Zuletzt bearbeitet von Andreas L. am Do 16.06.11 09:03, insgesamt 1-mal bearbeitet
Salieri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 16.06.11 09:02 
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconSalieri hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
    ini.writeString('Abschnitt''Feld1', StrToInt(E1.Text));					

Oft mal hilft es auch schon, wen man einfach nur mal nachdenkt was man da macht. WriteString, du willst eine Zeichenkette in die Ini-Datei schreiben. Gut. Aber was machst du? StrtoInt. Jetzt überlege nur mal bitte fünf Sekunden, ob das so passen kann? Hinzukommt, man könnte sich auch mal die Fehlermeldungen des Compilers durchlesen und mal gucken auf welche Codestellen sie sich beziehen.

Ja weißte du kannst mich mal. Ich sage noch, dass mir bewusst ist dass das nicht passt und du *mist*t mich hier an. Solche "Hilfe" brauch ich nun wirklich nich, vielen Dank auch. :roll:

user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
www.planet-source-co...eId=568&lngWId=7
Dann sollte dir dein Fehler auffallen. ;)

(Ich hatte auch Informatik in der 11.) Und das war totaler schrott. ^^ Das könnten 50% dieses Forums sicher besser Unterrichten. ^^

Alles klar, danke.
Ja, ich frag mich auch manchmal woher die diese Leute bekommen. Der Typ hat damals nichmal den Debugger erklrt, mehr noch, er hat ihn nichtmal erwähnt. Aber naja, was will man machen?

user profile iconAndreas L. hat folgendes geschrieben Zum zitierten Posting springen:

Der Code sieht korrekt aus und funktioniert bei mir auch. Kopier bitte den Code aus Delphi hier ins Forum, irgendwo muss da was falsch sein, vllt. nur ein Zeichen, das kann schon eine Menge ausmachen.

Hm jetzt wo die Eingaben der Textfelder richtig gespeichert werden (können) funktioniert es auch auf einmal. Zum testen hatte ich vorher einfach jedes Feld wo Text rein sollte frei gelassen, könnte das damit zusammen hängen?