Autor Beitrag
Salieri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: 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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 14.06.2011 um 22:42
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: 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 :zwinker:
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Di 14.06.11 20:05 
user profile iconhaentschman hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Di 14.06.11 20:09 
user profile iconhaentschman hat folgendes geschrieben Zum zitierten Posting springen:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Di 14.06.11 20:16 
Da hätten wir ein Tutorial im Angebot... 8)

www.delphi-treff.de/...-dateien/einleitung/

OnChange:= Objektinspektor + Reiter Ereignisse + Doppelklick auf OnChange
beastofchaos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mi 15.06.11 05:04 
user profile iconSalieri hat folgendes geschrieben Zum zitierten Posting springen:
OnChange wäre das passende,
[...]
Es handelt sich um 3 mal 10 Editfelder, davon 10 mit Text (kurz, +/-20 Zeichen)

Du willst wirklich nach jeder Zeicheneingabe speichern? Das sind hier an die 200 Speichervorgänge. Das ist doch nicht Dein Ernst??? :autsch:
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 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mi 15.06.11 07:33 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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
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 08:03 
user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mi 15.06.11 08:52 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
während bei einer INI konzeptbedingt mindestens alles nach dem Eintrag mit geschrieben werden muss.
Man könnte auch TMemIniFile nehmen.

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

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
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



BeitragVerfasst: Mi 15.06.11 09:22 
Ich bin davon ausgegangen, dass ihr ihn mittlerweile davon abbringen konntet bei jedem Tastendruck zu speichern. ;)
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mi 15.06.11 09:39 
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
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
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 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 15.06.11 09:49 
user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
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



BeitragVerfasst: Mi 15.06.11 09:54 
user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
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
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: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: 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.
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:33 
So kannst du speichern:
ausblenden 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));
    // ... weitere Felder
    ini.UpdateFile;
  finally
    ini.free;
  end;
end;


Steht aber alles in den Tutorial ;-)