| Autor |
Beitrag |
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: 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.
Delphi-Quelltext 1: 2: 3: 4:
| procedure Button1.Click(Sender: TObject); begin Self.Speichern; 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 
      
Beiträge: 20
|
Verfasst: 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.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Mi 15.06.11 10:56
Delphi-Quelltext 1:
| ExtractFilePath(Application.ExeName) |
Gibt den Pfad zur EXE zurück
|
|
jaenicke
      
Beiträge: 19338
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: 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 
|
|
Salieri 
      
Beiträge: 20
|
Verfasst: 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:
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: | 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.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Mi 15.06.11 11:40
|
|
Salieri 
      
Beiträge: 20
|
Verfasst: Mi 15.06.11 12:00
Zu 1.:
Natürlich, manchmal sieht man den Walt vor Bäumen nicht. xD
Danke.
Zu 2.:
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.
Delphi-Quelltext 1:
| ini.writeinteger('Abschnitt', 'Feld1', StrToInt(E1.Text)); |
Wie muss das bei einem Text aussehen, also für die Serientitel?
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Mi 15.06.11 12:09
aus write"integer"
wird write"string"
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Mi 15.06.11 14:52
Ich würde in die IniDatei auch den Feldnamen mit angeben:
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 : public : 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
      
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)
|
Verfasst: 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.
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]; int1, int2: Integer; end;
TDataRecArr = array[0..9] of TDataRec;
var MyDataArray: TDataRecArr;
Stream := TFileStream.Create('C:\test.dat', fmCreate); try Stream.Write(MyDataArray, SizeOf(MyDataArray)); finally Stream.Free; end;
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 
      
Beiträge: 20
|
Verfasst: Mi 15.06.11 18:57
|
|
beastofchaos
      
Beiträge: 247
Erhaltene Danke: 4
|
Verfasst: Mi 15.06.11 22:51
Herrlich, was für Diskussionen hier entflammen für so ein Themachen  Aber schön, dass hier so viele sich dafür bemühen
|
|
Bergmann89
      
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)
|
Verfasst: 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 
      
Beiträge: 20
|
Verfasst: Do 16.06.11 07:22
Bergmann89 hat folgendes geschrieben : | | 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:
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
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: 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
|
Verfasst: Do 16.06.11 08:14
Salieri hat folgendes geschrieben : | 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. Write String, du willst eine Zeichenkette in die Ini-Datei schreiben. Gut. Aber was machst du? Str toInt. 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
      
Beiträge: 744
Erhaltene Danke: 54
Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
|
Verfasst: Do 16.06.11 09:00
_________________ Delphi: XE - OS: Windows 7 Professional x64
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Do 16.06.11 09:02
Zuletzt bearbeitet von Andreas L. am Do 16.06.11 09:03, insgesamt 1-mal bearbeitet
|
|
Salieri 
      
Beiträge: 20
|
Verfasst: Do 16.06.11 09:02
Luckie hat folgendes geschrieben : | Salieri hat folgendes geschrieben : | 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.
thepaine91 hat folgendes geschrieben : | 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?
Andreas L. hat folgendes geschrieben : |
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?
|
|
|