Entwickler-Ecke
Dateizugriff - Speicherfunktion in Konsolenanwendungen (Delphi 7)
Phil24696 - Di 02.07.13 19:32
Titel: Speicherfunktion in Konsolenanwendungen (Delphi 7)
Hallo Entwickler,
ich hab eine Frage bezüglich Konsolenanwendungen in Delphi 7.
Vorab möchte ich sagen, dass ich bereits bei der Delphi-Hilfe nachgeschaut habe, aber mich nicht ausgekannt habe bzw. nicht wirklich die Fachwörter und Bezeichnungen verstanden habe, deshalb bitte ich euch mir so anfängerfreundlich wie möglich zu antworten.
Ich möchte in Konsolenanwendungen eine Speicherfunktion einbinden, damit ich, wie man es wahrscheinlich ahnen kann, die Anwendung speichern kann und sie an einem Punkt aus fortsetzen kann.
Ich würde mich sehr auf eine schnelle und hilfreiche Antwort freuen.
Mfg Phil24696
jaenicke - Di 02.07.13 19:37
Hallo und :welcome: im Forum!
Eine solche Speicherfunktion gibt es so nicht. Du musst die Daten, die du dafür benötigst, selbst in Dateien speichern und beim Start auslesen.
Viel mehr wird dir niemand sagen können ohne ein wenig mehr über deine Anwendung zu wissen. ;-)
Phil24696 - Mi 03.07.13 11:17
Danke für die Antwort und den Willkommensgruß! :D
Naja prinzipiell will ich diese Speicherfunktion erst bei einem Testprogramm testen.
In diesem möchte ich einen Wert abspeichern und wenn ich das Programm wieder öffne möchte ich diesen Wert wieder haben bzw. sogar an der Stelle, wo ich gespeichert habe, wieder weitermachen.
Es handelt sich hierbei um ein einfaches Rechnerprogramm, sprich addieren, subtrahieren, dividieren, multiplizieren von einer Zahl mit der darauffolgenden Zahl. (Repeat-Schleife bis Eingabe "ende")
Wenn es für dich/euch hilfreich ist, dann werde ich natürlich auch kurz die Konsolenanwendung, soweit ich sie bereits habe, hochladen, bzw. einen Screenshot davon machen.
baumina - Mi 03.07.13 11:51
Du könntest die relevanten Daten vor dem Programmende in eine INI-Datei schreiben (siehe TIniFile) und dort wieder nach dem Programmstart auslesen.
Phil24696 - Mi 03.07.13 18:11
Zitat: |
Du könntest die relevanten Daten vor dem Programmende in eine INI-Datei schreiben (siehe TIniFile) und dort wieder nach dem Programmstart auslesen.
|
Danke für die Antwort, weiß aber nicht das geringste von "INI-Dateien" bzw. "TIniFile". :?
Ich werde mich darüber mal schlau machen und werde mal diesen Befehl in mein Programm einbinden und sollte ich es mit dieser Hilfe schaffen bzw. nicht schaffen werde ich es euch mitteilen.
Nur so nebenbei: Kann dieser Befehl den Fortschritt des Programmes abspeichern (von dem Punkt aus das Programm starten von dem man speichert) oder nur einen/mehrere eingegebenen/eingegebene Wert/Werte?
MeierZwoo - Mi 03.07.13 18:53
Was Du wohl möchtest, ist ein "Speicherabbild" des Programmes ähnlich dem Speicherabbild, welches Win zB beim Zuklappen eine Lappies erstellt.
Das geht nunmal nicht, schon deshalb nicht, weil der Speicher beim Neustart komplett anderes aufgebaut ist und Win (oder jedes andere OS) so etwas für einen einzelnen Task nicht zulassen kann.
Du brauchst doch nur den letzten Rechenschritt (oder alle letzten Rechenschritte seit einem "C") als Protokoll zu speichern - wie oben schon gesagt. Ob man das nun in einer *.INI nach den Konventionen der TIni macht oder nach eigenem Gusto, ist dabei völlig egal. Wesentlich ist doch nur, daß Du den Rechner mit den letzten Summen (Summe im Ergebnis-Werk, Summe im Additions-Werk, Konstanten-Speicher ...) neu initialisierst und auch evtl. den letzten Rechenschritt (und alle vorhandenen Speicherwerke) anzeigst.
Wenn Du das Protokoll nicht nur als letzten rechenschritt, sondern komplett als Protokoll aller Rechenschritte mit führst, hast Du zugleich einen "Kontrollstreifen" in der Datei - kann manchmal sehr sinnig sein. Die letzte Zeile wären dann die Neustart-Werte. Dann benötigst Du nur noch ein Command zum Löschen des Protokolls (oder löschst die Protokolldatei manuell).
Phil24696 - Do 04.07.13 00:34
Moderiert von
Narses: Komplett-Zitat des letzten Beitrags entfernt.
:?
Danke für die Antwort, aber leider verstehe ich nicht komplett was damit gemeint ist, daher hab ich einige Fragen:
Da ich mich nicht sonderlich mich Fachwörtern auskenne, könnte mir jemand erklären was mit "eigenem Gusto" und "Command" gemeint ist?
Was ist mit der Aussage "seit einem "C"" gemeint?
So ganz verstehe ich noch nicht was mit der Antwort gemeint ist (Fragen oben), aber ich hoffe, dass sich diese Unklarheit auflöst sobald ich mir das Infomaterial, das wovon ich schon bei meiner letzten Antwort gesprochen habe, angesehen habe und hilfreiche Antworten auf meine Fragen erhalten habe. :)
MeierZwoo - Do 04.07.13 01:01
Phil24696 hat folgendes geschrieben : |
Da ich mich nicht sonderlich mich Fachwörtern auskenne, könnte mir jemand erklären was mit "eigenem Gusto" und "Command" gemeint ist?
Was ist mit der Aussage "seit einem "C"" gemeint? |
"Eigenes Gusto" ist kein Fachbegriff, sondern Sprichwort/Redensart, meint nach eigenem Ermessen, eigener Meinung, eigener Lust und Laune.
[Zitat Duden]
Gusto, der
Wortart: Substantiv, maskulin
Bedeutung: 1. Neigung, Lust 2. Appetit
Synonyme: Lust, Neigung, Appetit, Bedürfnis, [Ess]lust, [Heiß]hunger; (gehoben) Gelüste, Verlangen; (umgangssprachlich) Hunger, Kohldampf
Beispiele: "das kannst du ganz nach Gusto machen"
[Duden Ende]
Was ein "Command" ist, solltest Du aber wissen wenn Du programmierst, besonders in der Console. "Command" ist die englische Form des deutschen "Kommandos", auch Befehl. Das was man in der Console (Console = englische Form der Konsole) eingibt, um ein Programm (neudeutsch App) zu starten, zu bedienen oder zu beenden.
Und was "C" auf einem Taschenrecner ist, den Du ja gerade programmierst, solltest Du auch wissen. Taste [C] löscht alles, [CE] setzt die aktuelle Eingabe zurück, [MC] den Summenspeicher, ...
Also meint "seit einem "C"" seit der letzten Gesamtlöschung ...
Wär es nicht einfacher, einfach den Windows-Rechner zu benutzen? Oder einen Rechner mit der Win-GUI/API zu programmieren?
Ansonsten FF :)
Tranx - Do 04.07.13 07:36
Das mit den Ini-Dateien ist gar nicht so kompliziert. Da gibt es bestimmt eine Hilfe. Prinzipiell sieht das so aus:
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:
| var IniFile : TIniFile; Dateiname : string; b : boolean; i : integer; s : string;
Dateiname := 'C:\TEMP\Test.Ini'; s := 'Wert'; i := 4; b := TRUE; IniFile := TIniFile.Create(Dateiname); IniFile.WriteString('Global','StringSchluessel',s); IniFile.WriteInteger('Global','IntSchluessel',i); IniFile.WriteBool('Global','BoolSchluessel',b); IniFile.Free;
Dateiname := 'C:\TEMP\Test.Ini'; IniFile := TIniFile.Create(Dateiname); s := IniFile.ReadString('Global','StringSchluessel',''); i := IniFile.ReadInteger('Global','IntSchluessel',0); b := IniFile.ReadBool('Global','BoolSchluessel',TRUE); IniFile.Free; |
Du kannst auch alle Komponenten und deren Eigenschaften in eine solche Inidatei schreiben, so dass Du diese dann zurückladen kannst. (z.B. Inhalte von Editfeldern (Text-Eigenschaft von TEdit), Checkboxeigenschaften (Checked-Eigenschaften von TCheckBox, Index von Radiogroupboxen (Itemindex-Eigenschaften von TRadioGroup) etc. Auch kannst Du die Komponente wieder aktivieren, die den Focus hat, also für Eingaben aktiviert ist (ActiveControl des TForm). Hier müsstest Du dann den Namen der Componente 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:
| if Form1.ActiveControl <> NIL then WriteString('Formular','Focus',ActiveControl.Name) else WriteString('Formular','Focus','');
beim Laden dann so vorgehen:
var Contr : TControl; ContrName : string; i : integer; CName : string;
ContrName := ReadString('Formular','Focus',''); if ContrName<>'' then begin for i := 0 to Form1.ControlCount-1 do begin Contr := Form1.Controls[i]; if Contr.Name = ContrName then begin Contr.SetFocus; break; end; end; end; |
So kannst Du über ini-Dateien Deine Programmeinstellungen wiederherstellen. Die anderen Eigenschaften kannst Du ja selber mal versuchen zu programmieren.
MeierZwoo - Do 04.07.13 09:00
Tranx hat folgendes geschrieben : |
Du kannst auch alle Komponenten und deren Eigenschaften in eine solche Inidatei schreiben, so dass Du diese dann zurückladen kannst. (z.B. Inhalte von Editfeldern (Text-Eigenschaft von TEdit), Checkboxeigenschaften (Checked-Eigenschaften von TCheckBox, Index von Radiogroupboxen (Itemindex-Eigenschaften von TRadioGroup) etc. Auch kannst Du die Komponente wieder aktivieren, die den Focus hat, also für Eingaben aktiviert ist (ActiveControl des TForm). |
Es ist ein Konsolenprogramm, das kennt keine Checkboxen etc..
Tranx - Do 04.07.13 12:55
Entschuldigung, das habe ich überlesen. Aber außerhalb der Komponenten ist alles andere gültig.
Tranx - Do 04.07.13 12:56
Entschuldigung, das habe ich überlesen. Aber außerhalb der Komponenten ist alles andere gültig.
Phil24696 - Do 04.07.13 13:47
Danke für die ausführliche Erklärungen meiner Fragen. :zustimm:
Auf das wäre ich nicht gekommen, das mit dem "C" der Knopf auf einem Taschenrechner gemeint ist. Tja manchmal steht man auf dem Schlauch, ebenso bei "Command". :lol:
Gut wieder ein neues Wort gelernt "Gusto". 8)
Natürlich wäre es einfacher einen schon vorhanden Rechner(Taschenrechner) zu verwenden, aber ich möchte es schließlich wissen wie so etwas aufgebaut ist, außerdem möchte ich nicht zwingend einen Taschenrechner programmieren, da es ja wie schon gesagt nur ein Testprogramm ist für mein eigentliches Programm. (Schließlich greift dieses ebenfalls auf mathematische Befehle zurück, daher dachte ich mir ein Testprogramm, dass ähnlich agiert hilft mir leichter in die Materie einzusteigen, anstatt diesen Befehl gleich in mein kompliziertes Programm einzubinden, zudem erstelle ich gerne "Bausteinprogramme" um schnell in einem selbst geschriebenen Programm nachzusehen wie ich es machen kann.)
Zitat: |
Oder einen Rechner mit der Win-GUI/API zu programmieren? |
Wie schon mal erwähnt bin ich noch nicht wirklich stark in die Programmierung involviert, daher stellt sich mir die Frage, was eine
"Win-GUI/API" ist.
Zitat: |
Das mit den Ini-Dateien ist gar nicht so kompliziert. Da gibt es bestimmt eine Hilfe. Prinzipiell sieht das so aus: (...) |
Mhm für mich sehen die Quelltexte die du(Tranx) mir geschickt hast schon ziemlich kompliziert aus. :?
Heute werde ich mich in mein vorhandenes Infomaterial zu Ini-Dateien und auch in die die Informationen, zu die der Link von WasWeißDennIch führt reinlesen und dann werde ich 2 Sprichwörter eines ehemaligen Mathematiklehrers von mir anwenden:
"Probieren geht über studieren" und "Macht es selbst sonst lernt ihr es nie." :D
MeierZwoo - Do 04.07.13 14:51
Bei deinen vielen Rückfragen simpelster Begriffe frage ich mich langsam, ob Du wirklich ein Consolen-Programm schreibst. Dieser Begriff ist nämlich auch festgenagelt und bezeichnet ein Programm, welches von außen guckende Laien auch als "DOS-Programm" bezeichnen würden.
Und da Delphi keine CRT-Unterstützung hat, frage ich mich wo Du eine einigermaßen funzende CRT-Unit her hast - wenn Du schon mit "Command" nichts anfangen konntest. Denn ohne CRT besteht dein ganzes Consolen-Programm ja NUR aus scrollenden Commandozeilen in der Console.
Du solltest wirklichmal einen ScreenShot hochladen ...
baumina - Do 04.07.13 15:17
MeierZwoo hat folgendes geschrieben : |
Bei deinen vielen Rückfragen simpelster Begriffe frage ich mich langsam, ob Du wirklich ein Consolen-Programm schreibst. |
Warum sollte man keine Rechnungen mit einem Konsolenprogramm erledigen können?
Eingabe : 40+8 [Enter]
Ausgabe : 48
Eingabe : 5*2
Ausgabe : 10
usw.
Was ist CRT?
Gammatester - Do 04.07.13 15:36
baumina hat folgendes geschrieben : |
Was ist CRT? |
CRT = cathode ray tube = Kathodenstrahlröhre = Bildschirm des Computer-Monitors.
In diesem Zusammenhang ist CRT eine Unit die in Turbopascal eingeführt wurde.
Zitat: |
Die Routinen dieser Unit ermöglichen die direkte Kontrolle des Bildschirms (Farben, Textattribute, Fenster), der Tastatur (direkte Abfrage, erweiterte Codes), der Farben und des Tongenerators.
|
Hier gibt es eine funktionierende
Delphi-CRT Unit [
http://www.wolfgang-ehrhardt.de/misc_de.html#CRT].
baumina - Do 04.07.13 15:42
Gammatester hat folgendes geschrieben : |
In diesem Zusammenhang ist CRT eine Unit die in Turbopascal eingeführt wurde |
oh, wohl schon zu lange her, danke.
MeierZwoo - Do 04.07.13 15:42
baumina hat folgendes geschrieben : |
Warum sollte man keine Rechnungen mit einem Konsolenprogramm erledigen können? |
Ich habe nichts davon gesagt, daß ein Consolenprogramm keine Berechnungen durchführen kann. Nur wer nicht weiß, was ein Command ist, weiß wohl auch nicht, daß die Eingabe 30+6 <enter> ein solches ist.
baumina hat folgendes geschrieben : |
Was ist CRT? |
CRT steht für Routinen für den stdout, den Bildschirm (CRT). Die sind in Delphi ja nur noch per write/writeLn, read/readLn ohne Datei als Ziel/Quellangabe, also stdout/stdin, enthalten.
MeierZwoo - Do 04.07.13 15:51
Diese CRT-Unit ist im Gegensatz zu der von Ziegler-Soft (kostenpflichtig) leider nicht mit der Turbo-Pascal CRT kompatibel. Sie funktioniert wunderbar, nur beim Umstellen alter TP/BP-Quellcodes muß doch einiges grundsätzlich überarbeitet werden.
WasWeißDennIch - Do 04.07.13 15:53
Mir erschließt sich der Zusammenhang zwischen einem Konsolenprogramm, das etwas berechnen soll und der CRT-Unit nicht. Um z.B. eine Addition durchzuführen, brauche ich doch weder clrscr noch GoToXY oder sonst irgend eine der alten TP-CRT-Routinen.
Gammatester - Do 04.07.13 16:02
MeierZwoo hat folgendes geschrieben : |
Diese CRT-Unit ist im Gegensatz zu der von Ziegler-Soft (kostenpflichtig) leider nicht mit der Turbo-Pascal CRT kompatibel. Sie funktioniert wunderbar, nur beim Umstellen alter TP/BP-Quellcodes muß doch einiges grundsätzlich überarbeitet werden. |
Würde mich schwer wundern :!: Was funktionert denn nicht ohne 'grundsätzliche Überarbeitung'?
MeierZwoo - Do 04.07.13 20:13
Ich habe mir vorkurzem mal die CRT-Unit von wolfgang-ehrhardt.de angesehen. Ich selbst benutze die CRT-Unit von Ziegler mit eigener Pflege über D2007 hinaus.
Mir ist bei der CRT-Unit von wolfgang-ehrhardt.de folgendes wesentliches aufgefallen:
Die Funktion KeyPressed und die Funktion ReadKey unterscheiden sich zwar "äußerlich" nicht von der BP/TP-CRT, aber sehr wohl "intern". Und wenn man selber die Tasten-Lese-Funktionen intensiv nutzt und verfeinert hat, muß man dort Anpassungen vornehmen, wenn man alte TP/BP-DOS-Programme auf Win-Console umstellen will.
KeyPressed ist bei TP/BP eine einfache boolche Funktion, die nur feststellt, ob etwas im Tastaturpuffer vorhanden ist - egal was. Ansonsten faßt sie den Tastaturpuffer nicht an (mit Ausnahme BREAK, aber nur, wenn dies so geschaltet ist). Die Funktion liefert auch "nach Jahren" immer weiter TRUE zurück, solange niemand anderes den Tastaturpuffer leert. Dies übernimmt normal Readkey (KeyRead bis 3.0), sowohl für das Zeichen (und ScanCode) wie auch den Status.
Bei der CRT-Unit von wolfgang-ehrhardt.de ist es intern genau umgekehrt - zwar liefern beide Funktionen extern dieselben Funktionsergebnisse (KeyPressed : bool, ReadKey : AnsiChar) aber hier werden alle Tastaturwerte, ScanCode und Status intern von KeyPressed gelesen und global (auch für ReadKey) zur Verfügung gestellt.
Wenn man die beiden Funktionen nur so benutzt hat ohne weiterer Werte auszulesen, sich also auf die Zeichen beschränkt hat, macht es keinen Unterschied - wenn man dagegen aber ScanCodes und Status benutzt, muß man dies umstellen. Das wären im Normalfall zwar auch nur ein bis zwei Kernroutinen, aber ohne Umstellung stolpert man.
Weitere Unterschiede habe ich mir (noch) nicht angesehen, da ich ja meine funzende, gepflegte CRT benutze.
Knackpunkte wären z.B. noch: Führt ein Beschreiben des letzten Feldes (Unterste Zeile, ganz rechte Schreibstelle) zum Scrollen des gesamten Feldes oder nicht. Wie verhält sich die Codepage vorallem beim Zurücklesen?
Phil24696 - Sa 06.07.13 09:56
Ich bezog mich bei meiner Aussage, es sei eine Konsolenanwendung, da in Delphi 7 (mit dem ich übrigens programmiere) bei einem Button "Konsolenanwendung" geschrieben steht, nachdem man eingegebenen hat, dass man ein neue Datei erstellen will.
Zitat: |
Du solltest wirklichmal einen ScreenShot hochladen ... |
Bitteschön. Einmal von dem Programm selbst und dann einmal von der "Programmieroberfläche"(weiß leider den Fachbegriff nicht)
Was ist der Unterschied zwischen Console-Programm und Dos-Programm?
MeierZwoo - Sa 06.07.13 10:16
Korrekt, es ist ein Konsolenprogramm.
Der Unterschied zwischen einem Windows-Consolenprogramm und eine DOS-Programm ist das, was der Name schon sagt: Ein DOS Programm läuft unter DOS (bei heutigen Wins im DOS-Emulator, besser 16-Bit-Subsystem, ab Win 64bit nicht mehr enthalten) und ein Windows-Konsolenprogramm läuft unter Windows und ist ein völlig normales Windows-Programm, nur ohne GUI (Grafische Benutzer Oberfläche, Grafics User Interface). Nur wird diese Textbasierte Oberfläche von Delphi nur rudimentär unterstützt.
Und was davon soll nun unbedingt gespeichert werden, so daß Du auch einen Speicherauszug in Erwägungs zogst?
Das Programm startet doch neu ganz leer. Außer den Abfragen am Anfang, Anzeige ... und so evtl.. Die paar Parameter kannst Du doch locker in einer simplen INI ablegen und, wenn eine INI vorhanden ist, dann nur noch abfragen, ob die Vorgabewerte (mit Anzeige der Vorgabewerte aus der INI) benutzt werden sollen oder alles neu abgefragt werden soll.
Phil24696 - Mo 08.07.13 18:25
Wenn ich deine Aussage richtig verstanden habe, dann kann ich mit den Ini-Dateien exakt das machen was ich machen will.
Ich will nämlich das Ergebnis eines "Programmdurchlaufes" bevor man beendet, speichern, wenn gewollt, und das Ergebnis dann bei dem neuen Start, sprich Programm schließen und wieder starten, wieder abfragen und mit diesem weiter berechnen.
Sobald ich Zeit gefunden habe, was leider noch nicht so ganz der Fall war, dann werde ich, dies mit den Ini-Dateien in mein vorhandenes "Testprogramm" einbauen. Sollte etwas nicht funktionieren oder ich kapiere nicht wie es funktioniert, dann werde ich mich wieder melden und hoffe das ihr wieder Zeit habt und mir wieder helft.
Danke für eure Hilfe! :zustimm:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!