| Autor |
Beitrag |
Salieri
      
Beiträge: 20
|
Verfasst: Di 14.06.11 19:22
Hallo.
Ist es möglich Eingaben die der Anwender in allerlei Feldern (z.B. Edit) macht sofort zu speichern? Damit meine ich, dass Änderungen an den Boxen gleich nach der Eingabe gespeichert werden und das so, dass die Eingaben nach dem Schließen und erneutem Öffnen der Anwendung wieder aufgerufen und angezeigt werden.
Wenn ja: Wie wird sowas gemacht.
Wenn nein: Gibt es eine Alternative die jemandem einfallen würde? Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Di 14.06.2011 um 22:42
|
|
haentschman
      
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: Di 14.06.11 19:51
Hallo...
die Frage ist was du mit "gleich nach der Eingabe" meinst.
Für dich kommen folgende Ereignisse in Frage:
OnChange - > nach jedem Ändern = nach jedem Zeichen
OnExit - > wenn der Focus das TEdit verläßt
Zum speichern gibt es je nach Menge verschiedene Möglichkeiten. Wenn es nicht zu viel ist könnte TIniFile für dich in Frage kommen.
Für genauere Antworten mußt du schon mehr erklären 
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Di 14.06.11 20:05
haentschman hat folgendes geschrieben : | Für dich kommen folgende Ereignisse in Frage:
OnChange - > nach jedem Ändern = nach jedem Zeichen
OnExit - > wenn der Focus das TEdit verläßt |
Es macht eigentlich wenig Sinn, nach jedem Tastendruck zu speichern. Was nützt es, wenn die Eingaben erst im ersten Edit-Feld erfolgen und die anderen noch leer sind?
Ich würde das Speichern erst im OnClose bzw. im OnCloseQuery des jeweiligen Formulars bzw. des Hauptformulars erledigen. Laden dann z. B. im OnCreate-Ereignis.
|
|
Salieri 
      
Beiträge: 20
|
Verfasst: Di 14.06.11 20:09
haentschman hat folgendes geschrieben : |
Für genauere Antworten mußt du schon mehr erklären |
Aber immer doch. Danke schonmal für deine Antwort.
OnChange wäre das passende, wie wende ich das an?/Wo finde ich das?
Es handelt sich um 3 mal 10 Editfelder, davon 10 mit Text (kurz, +/-20 Zeichen) die restlichen zwanzig mit je zwei Ziffern resp. einer Zahl (03, 15, etc.), gesteuert mit je einem UpDown.
Kannst du mir bitte auch erklären wie ich das mit diesem TIniFile mache?
|
|
haentschman
      
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: Di 14.06.11 20:16
Da hätten wir ein Tutorial im Angebot...
www.delphi-treff.de/...-dateien/einleitung/
OnChange:= Objektinspektor + Reiter Ereignisse + Doppelklick auf OnChange
|
|
beastofchaos
      
Beiträge: 247
Erhaltene Danke: 4
|
Verfasst: Di 14.06.11 23:40
.inis sind also so eine art Textart mit einem festgelegten Schema, oder? Wäre also das gleich, bloß umständlicher, eine txt-Datei zu speichen/ auszulesen.
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Mi 15.06.11 05:04
|
|
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 07:04
Für diesen Zweck sind INIs so ungefähr das Ungünstigste was es gibt. Grund: Wenn ein Wert geändert wird, muss die ganze Datei neu geschrieben werden, da sich alles dahinter verschieben kann.
Hier eignet sich ein einfacher TFileStream z.B. viel besser. Man definiert alle Felder mit einer festen Länge und kann dann an die Position der Änderung springen und nur die paar Byte schreiben.
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Mi 15.06.11 07:33
jaenicke hat folgendes geschrieben : | | Hier eignet sich ein einfacher TFileStream z.B. viel besser. |
Auch ein TFileStream muss irgend wann auf Platte geschrieben werden. Das macht man am besten im OnClose oder im OnCloseQuery. Dann kann man aber auch gleich direkt in den genannten Ereignissen die Werte der Edit-Felder auslesen und wegschreiben. Damit erspart man sich das hier in meinen Augen sinnlose Verbraten von Rechenzeit, um jede einzelne Änderung /Tastenanschlag im TFileStream einzutragen.
|
|
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 08:03
Gerd Kayser hat folgendes geschrieben : | | Auch ein TFileStream muss irgend wann auf Platte geschrieben werden. |
Darum geht es ja nicht, das ist klar. Aber dort müssen eben nur ein paar geänderte Byte geschrieben werden, während bei einer INI konzeptbedingt mindestens alles nach dem Eintrag mit geschrieben werden muss.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 15.06.11 08:40
jetzt lasst mal die Kuh im Dorf. Er ist Anfänger und für die Datenmenge kann man durchaus noch ohne bedenken Ini-Dateien verwenden. Das dürfte für ihn erst mal die am einfachsten umzusetzende Lösung sein.
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Mi 15.06.11 08:52
jaenicke hat folgendes geschrieben : | | während bei einer INI konzeptbedingt mindestens alles nach dem Eintrag mit geschrieben werden muss. |
Man könnte auch TMemIniFile nehmen.
--- Moderiert von Narses: Beiträge zusammengefasst---
Luckie hat folgendes geschrieben : | | für die Datenmenge kann man durchaus noch ohne bedenken Ini-Dateien verwenden. |
Sehe ich genau so. ABER: Er möchte jeden einzelnen Tastendruck bei den Edit-Feldern sofort speichern, damit nach einem Neustart der Anwendung die Edit-Felder wieder den gleichen Inhalt haben. Bei 10 Editfeldern mit jeweils 20 Zeichen sind das beim erstmaligen Ausfüllen 200 Speichervorgänge, also 200-mal die Datei auf Platte schreiben.
| Zitat: | | Das dürfte für ihn erst mal die am einfachsten umzusetzende Lösung sein. |
Die einfachste Lösung besteht darin, beim Programmende die Daten einmalig wegzuschreiben und nicht 200-mal während des Ausfüllens. Dabei ist egal, ob INI oder FileStream oder sonst was.
Auch wenn der Threadstarter ein Anfänger ist, sollte man ihn schon auf den feinen Unterschied zwischen einmal und 200-mal hinweisen. Auch wenn ich es mittlerweile zum dritte Male predige: Es wird ja nicht darauf eingegangen.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 15.06.11 09:22
Ich bin davon ausgegangen, dass ihr ihn mittlerweile davon abbringen konntet bei jedem Tastendruck zu speichern. 
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Mi 15.06.11 09:39
Luckie hat folgendes geschrieben : | Ich bin davon ausgegangen, dass ihr ihn mittlerweile davon abbringen konntet bei jedem Tastendruck zu speichern.  |
Nö, anscheinend nicht.
Mir fällt gerade noch etwas anderes ein:
Nach einem Neustart der Anwendung und dem Zuweisen der Werte an die 30 Editfelder werden auch 30-mal die OnChange-Ereignisse ausgelöst. Daraus folgt, es wird zum Programmstart 30-mal der Inhalt der Editfelder auf der Festplatte gespeichert, obwohl sich da nichts geändert hat.
Ein solches Programm wäre sicherlich gut geeignet, um die Festplatte mal auszutesten. 
|
|
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 09:43
Also ich habe jetzt nicht alles gelesen hoffe das dieser Vorschlag noch nicht kam. ^^
Wenn es darum geht diese Daten der Felder zu sichern würde ich empfehlen.
1. Speichern im Onclose. (Wurde sicher schon genannt)
2. Wenn man es jetzt mit dem Taskmanager abschießt würde das natürlich nicht anspringen daher wäre IMHO ein Timer
welcher die Daten in einem angemessenen Intervall sichert eine gute Lösung für dieses Problem.
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 15.06.11 09:49
Gerd Kayser hat folgendes geschrieben : | Nach einem Neustart der Anwendung und dem Zuweisen der Werte an die 30 Editfelder werden auch 30-mal die OnChange-Ereignisse ausgelöst. Daraus folgt, es wird zum Programmstart 30-mal der Inhalt der Editfelder auf der Festplatte gespeichert, obwohl sich da nichts geändert hat.
Ein solches Programm wäre sicherlich gut geeignet, um die Festplatte mal auszutesten.  |
Vor allem würden die Daten in den Feldern gelöscht werden, da beim ersten OnChange die INI-Datei mit dem aktuellen Inhalt (also nichts) der Edit-Felder geschrieben würde. Nur ein Feld würde dann noch korrekt sein.
Also muss auch noch eine Prüfung rein, in welchem Zustand sich das Programm befindet (Neustart oder Bearbeitung).
Irgendwie ein bisschen viel Aufwand, finde ich. Ist es dem Anwender denn nicht zuzumuten, die Erfassung zu wiederholen?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 15.06.11 09:54
thepaine91 hat folgendes geschrieben : | Wenn man es jetzt mit dem Taskmanager abschießt würde das natürlich nicht anspringen daher wäre IMHO ein Timer
welcher die Daten in einem angemessenen Intervall sichert eine gute Lösung für dieses Problem. |
Überflüssig. Wenn ich ein Programm bewusst über den Taskmanager beendet, sollte mir klar sein, dass es zu Datenverlust kommen kann. Und wenn ich es über den Taskmanager schließ0en muss, weil es nicht mehr reagiert, dann hat wahrscheinlich auch schon der Timer die letzte Änderung nicht mehr gespeichert oder er war gerade dabei und die Daten sind dann in einem inkonsistenten Zustand und somit unbrauchbar. Man kann es auch übertreiben.
|
|
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:02
@Luckie es gibt noch weitere Szenarien warum das Programm nicht richtig beendet wird.
Ich bin daher der Meinung das die Intervallgesteuerte Speicherung die 0 Aufwand bedeutet daher nicht übertrieben ist.
Die Chance das die Anwendung allerdings genau in dem Moment abgeschossen wird in dem die Speicherung durchgeführt ist aufgrund der geringen Datenmenge sehrrrrr gering. Aber vieleicht sehe ich das auch falsch...
(Dieses Problem könnte man zwar auch einfach abfangen aber das wäre dann doch zu viel Arbeit...)
|
|
Salieri 
      
Beiträge: 20
|
Verfasst: Mi 15.06.11 10:25
Da verlässt man einmal das Haus um die Marketing-Prüfung abzulegen und wenn man wieder kommt ist der ganze Thread voll mit einem Streitgespräch. xD
Also erstmal vielen Dank für die Antworten, sicherlich hätte ich auch begriffen, dass es unsinn ist bei jeder Eingabe zu speichern, wenn man mir das einmal gesagt hätte, aber gut, so geht es auch. ^^ Wie Luckie sehr richtig festgestellt hat: Ich bin Anfänger, somit muss man mir halt einfach jeden Unsinn erklären, zumal ich auch nur alle paar Monate mal irgendwas mache und dann auch nur zum Eigengebrauch, denn eigentlich befasse ich mich mit Recht und Finanzen und weniger mit Programmierung.
Wie dem auch sei, für die Zahlreichen Vorschläe bin ich sehr dankbar, jetzt wollen wir das ganze aber ein wenig konkretisieren: Ich schätze beim Beenden des Programms zu speichern + Intervallspeicherung wäre auch ausreichend, ein Button zum manuellen Speichern wäre dazu auch nützlich. Außerdem muss ich wissen wie ich das mit dem Speichern schreibe, das Tutorial habe ich gelesen, aber bin daraus nicht ganz schlau geworden. Ich weiß jetzt zwar wie in die Ini geschrieben wird und wie abgerufen wird, aber an der praktischen Umsetzung haperts.
Ich hoffe ihr könnt mir dabei noch weiter helfen.
Aktueller Stand der Dinge:
Interface soweit fertig, ich habe alle Felder und die UpDown-Irgendwas sind den Feldern zugeordnet. (Wie legt man fest, dass eine führende Null bei einstelligen Nummern bleiben soll?)
Eventuell möchte ich später weitere 10 Felder ergänzend hinzu fügen, aber sofern das später keine Probleme bereitet würd ich das gern verschieben, weil das wieder ne Besonderheit ist. ^^
Ansonsten hat noch nichts irgend eine Funktion, aber da liegt ja der Hase im Pfeffer. Lediglich den Exit-Button könnte ich selbst machen.
Zur Benennung:
10x "Ser#" (Freitextfelder)
10x "S#" (Zahlenfelder)
10x "SUD#" (UpDown für S#)
10x "E#" (Zahlenfelder)
10x "EUD#" (UpDown für E#)
# = 01 bis 10
1x BuSave
1x BuExit
Erklärung: Es soll ein Programm werden mit dem man Staffel und Episode von Serien vermerken kann die man zeitgleich guckt. Entsprechend steht E für Episode, S für Staffel und Ser für Serie.
So, natürlich will ich nich, dass ihr mir alles vorkaut, aber sone kleine Starthilfe wäre nicht schlecht, denn ich bin grad etwas planlos.
|
|
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:33
So kannst du speichern:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| uses ..., IniFiles;
...
procedure TForm1.Speichern; var ini: TmemIniFile; begin ini := TMemIniFile.Create('C:\Datei.ini'); try ini.writeinteger('Abschnitt', 'Feld1', StrToInt(E1.Text)); ini.UpdateFile; finally ini.free; end; end; |
Steht aber alles in den Tutorial 
|
|