Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Benutzereingaben speichern
Salieri - Di 14.06.11 19:22
Titel: Benutzereingaben speichern
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 - 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 - 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 - 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?
beastofchaos - 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 - Mi 15.06.11 05:04
Salieri hat folgendes geschrieben : |
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 - 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 - 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 - 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.
Delete - 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 - 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.
Delete - Mi 15.06.11 09:22
Ich bin davon ausgegangen, dass ihr ihn mittlerweile davon abbringen konntet bei jedem Tastendruck zu speichern. ;)
Gerd Kayser - 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 - 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 - 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?
Delete - 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 - 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 - 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. - 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 ;-)
thepaine91 - 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 - 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. - Mi 15.06.11 10:56
Delphi-Quelltext
1:
| ExtractFilePath(Application.ExeName) |
Gibt den Pfad zur EXE zurück
jaenicke - 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:
http://www.delphi-library.de/viewtopic.php?p=548600
Andreas L. - 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 - 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. - Mi 15.06.11 11:40
1.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TReMe = class(TForm) procedure Speichern;
...
procedure TReMe.Speichern; begin end; |
2.
Delphi-Quelltext
1:
| ini := TMemIniFile.Create(ExtractFilePath(Application.ExeName) + 'Dateiname.ini'); |
Salieri - 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 - Mi 15.06.11 12:09
aus write"integer"
wird write"string"
Tranx - Mi 15.06.11 14:52
Ich würde in die IniDatei auch den Feldnamen mit angeben:
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 : 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
Bergmann89 - 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.
Salieri - Mi 15.06.11 18:57
thepaine91 hat folgendes geschrieben : |
aus write"integer"
wird write"string" |
Eben das reicht offenbar noh nicht aus. Ich erhalte jedenfall immernoch die Meldung, dass das kein Integerwert ist.
Tranx hat folgendes geschrieben : |
| Ich würde in die IniDatei auch den Feldnamen mit angeben: |
Keine Ahnung was das is und was es mir bringt...
Bergmann89 hat folgendes geschrieben : |
| 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:
Salieri hat folgendes geschrieben : |
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 - 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 - 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 [
http://www.christian-stelzmann.de/artikel/crashkurs.htm]. 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.
Salieri - 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?
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.
Delete - 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 - Do 16.06.11 09:00
thepaine91 hat folgendes geschrieben : |
| Das könnten 50% dieses Forums sicher besser Unterrichten. ^^ |
Ich auch? 8)
Andreas L. - Do 16.06.11 09:02
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.
Salieri hat folgendes geschrieben : |
| 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? |
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.
Salieri - Do 16.06.11 09:02
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:
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?
Delete - Do 16.06.11 09:18
Also wenn du weißt, dass es so nicht funktionieren kann, dann hast du doch schon deinen Fehler erkannt. Und so offensichtlich, wie der Fehler ist, zumal du ja sagst, du könntest schon programmieren, kann ich mir das nur mit Faulheit erklären, sich mal eine Minute hinzusetzen und mal über die Fehlermeldung des Compilers und dem zugehörigen Code nachzudenken. Sorry, dafür fehlt mir jegliches Verständnis.
Salieri - Do 16.06.11 10:47
Ich habe jetzt zum Laden der Ini folgendes:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TReMe.Load; var ini: TmemIniFile; begin ini := TMemIniFile.Create(ExtractFilePath(Application.ExeName) + 'Savedata.ini'); try Ser01.Text := ini.ReadString('Serie01', 'Name', 'Ser01'); S01.Text := ini.ReadInteger('Serie01', 'Season', 0); E01.Text := ini.ReadInteger('Serie01', 'Episode', 0); finally ini.free; end; end;
procedure TReMe.FormCreate(Sender: TObject); begin Self.Load; end; |
Den dritten Parameter als Standard habe ich (wie eig alles) aus dem Tutorial entnommen, allerdings gibt es da bei den Nullen wohl Probleme. Ich habe da ein bisschen rum probiert, aber hat alles nichts genützt.
jaenicke - Do 16.06.11 10:53
S01.Text ist ein String, du liest aber einen Integerwert aus, wie soll das gehen? Da fehlt die Umwandlung...
Bergmann89 - Do 16.06.11 14:18
Hey,
du machst immer die gleichen Fehler. Und unsere Ratschläge nimmst du auch nicht ernst. Wenn wir dir für jeden Fehler den du machst den richtigen Code posten sollen, dann kannst du auch gleich in der Jobbörse posten und jmd schreibt das Programm. Und ich denke du erkennst den Sinn dieses Forums nicht. Wir geben Hilfe zur Selbsthilfe. Heißt wenn du unsere Ratschläge befolgen würdest, dann könntest du 90% deiner Fehler in nichma einer Minute selbst erkennen und lösen.
Salieri hat folgendes geschrieben : |
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. |
Wie man sieht kommst du eben nicht wieder rein. Dann nimm dir die Zeit un les den Crashkurs, da wird die Typumwandlung ausführlich erklärt. Aber du sitz lieber die ganze Zeit vor deinem Programm, probierst wahrscheinlich sinnlose Sachen aus und dann beleidigst du Leute hier im Forum, die dir helfen wollen? Da kann ich Luckie nur recht geben, denn dafür fehlt mir auch jegliches Verständnis...
MfG Bergmann.
Delete - Do 16.06.11 15:08
Delphi-Quelltext
1:
| E01.Text := ini.ReadInteger('Serie01', 'Episode', 0); |
:wall: Und das nach dem es dir genau erklärt wurde.
Salieri - Do 16.06.11 15:21
Ja sicher ich bin der Bösewicht. Ich war ganz freundlich, Luckie war der der mich angepisst hat. Und ja, wenn ich immer den selben Fehler mache kann mans ja vlt auch mal erklären, stattdessen werd ich hier als tumber Depp hingestellt, der Stundenlang auf den Bildschirm glotzt und lieber ne Stunde wartet als zu denken. Das muss ich mir wirklich nicht bieten lassen. Irgendwo habt ihr recht, das streite ich in keinster Weise ab, aber denunzieren lass ich mich sicher nicht. Entweder ihr wollt helfen oder nicht, wenn nicht dann haltet euch einfach zurück.
Ich jedenfalls habe jetzt auch keine Lust mehr mich hier fertig machen zu lassen und versuchs nochmal selber wenns nicht klappt nehm ich Stift und papier, das is allemal besser als mir das hier anzutun, ehrlich.
ALF - Do 16.06.11 15:30
Salieri hat folgendes geschrieben : |
| Ich jedenfalls habe jetzt auch keine Lust mehr mich hier fertig machen zu lassen und versuchs nochmal selber wenns nicht klappt nehm ich Stift und papier, das is allemal besser als mir das hier anzutun, ehrlich. |
oder die Delphihelp :wink:
Angepisst hat Dich hier keiner, lediglich darauf aufmerksam gemacht, dass es Hilfe zur Selbsthilfe ist :les:
Gruss Alf
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!