Entwickler-Ecke
Sonstiges (Delphi) - String aus txt in Programm integrieren
$ebbi - Sa 12.03.11 20:58
Titel: String aus txt in Programm integrieren
hi,
angennommen ich hab einen string hallo und hallo:= 'edit1.text:= ' #39 + 'hallo' + #39 jetzt will ich quasi den string in einen button als befehl schreiben, also sobald ich auf den button klicke soll das im edit stehen. das alles will ich aber nur mithlife des strings erreichen. geht das?
mach das vllt mal an meinem aktuellen problem deutlich. tippt man in ein edit eine bestimmte nummer, so wird diese einem produkt zugewissen. das programm soll aber um neue produkte erweitert werden können dazu gibt man alles in bestimmte felder ein un das programm macht daraus den passenden code. dieser code wird in eine txt geschrieben. das programm müsste diesen code jetzt aber ins programm integrieren können. ohne das man selbst was am programm umschreiben muss.
Gausi - Sa 12.03.11 21:04
Was du suchst, nennt sich Parser oder auch Interpreter. Wird öfter mal nachgefragt, und Links zu einem finden sich hier bestimmt. Die such ich aber nicht raus, da ich mir fast 100%ig sicher bin, dass sich dein Problem einfacher und eleganter lösen lässt.
Was genau sollen denn die einzelnen "Produkte" können? Sollen da nur Informationen zu angezeigt werden, oder soll der Anwender wirklich eigene Funktionen in das Programm einbauen können?
$ebbi - Sa 12.03.11 21:12
wenn ich wüsste wonach ich genau suchen sollte kein problem ;)
meine scchwester hat von meinem dad einen scanner bekommen (auch software-engineeur aber anderes gebiet :)), damit kann sie barcodes scannen und kaufladen spielen :D. da ich "nur" schüler bin hab ich des jetzt ganz einfach gelöst, jedem code wird einfach das produkt zugeordnet und dazu noch der preis.
also z.B. 123456789 Eistee 1,00€
das programm macht das was eine normale Kasse auch macht, zählt alles zusammen, schreibt auf kassenzettel, etc.
zusätzlich muss das programm aber auch neue produkte "lernen" und die soll meine schwester selbst reinmachen können. deshalb der ganze aufwand. sie kann also im programm alles angeben also nummer, name, preis. das wird dann alles fertig in die txt geschrieben. daraus soll dann der code ausgelesen werden und quasi ins programm übernommen werden.
Gausi - Sa 12.03.11 21:23
Na, das ist doch eine klassische Datenbank-Anwendung. Da brauchst du sowas nicht. ;-)
Folgendes Grundprinzip:
In einem Fenster machst du die Dateneingabe. Da hast du ein Feld für "Name", "Nummer", "Preis", usw. Diese Eingaben speicherst du. Ob du dafür Objekte in einer ObjectList oder einfach ein Record in einem Array nimmst, ist erstmal wurscht.
Diese Liste von Daten speicherst du in einer Datei - meinetwegen einer Textdatei.
Für das eigentliche Programm lädst du aus dieser Textdatei die Daten wieder in den Speicher. Wenn du dann "an der kasse" einen Barcode eintippst, dann wird in den Daten der passende Eintrag gesucht, und z.B. der preis angezeigt oder zum bisherigen Gesamtpreis aufaddiert.
$ebbi - Sa 12.03.11 21:54
tut mir leid aber so ganz versteh ich das nicht
toll wär vllt ein kurzer quellcode auszug, wie ich die daten wieder in den speicher schreibe.
das grundprinzip muss ja aber nicht ändern oder? problem ist halt das alle nummern verschieden sind und da kein schema hintersteckt, wie gesagt sind ichtige barcodes.
versteh jetzt leider nicht was ich genau machen muss sry, kann nur mein bisschen 2 jahre schul delphi (da immerhin 13 punkte :D)
glotzer - Sa 12.03.11 22:29
$ebbi hat folgendes geschrieben : |
[...]roblem ist halt das alle nummern verschieden sind und da kein schema hintersteckt[...] |
es sind alles nummern, das ist doch schon gemeinsamkeit genug :)
$ebbi - So 13.03.11 19:10
Problem ist halt, wie schreib ichs rein, wie les ichs richtig aus? Wär cool wenn mir das jemand anhand des bsp edit1.text:='hallo' erklären könnte
glotzer - So 13.03.11 19:21
Speichern:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var StringList: TStringList; begin StringList := TStringList.create; StringList.Add('irgend ein dummer text'); try StringList.SaveToFile('eindummerpfad\einedatei.txt'); finally StringList.Free; end; end; |
Laden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| var StringList: TStringList; begin StringList := TStringList.create; try try StringList.LoadFromFile('eindummerpfad\einedatei.txt'); except showmessage('Die datei gibt es nicht'); raise; end; if StringList.Count > 0 then begin edit1.text := StringList.Items[0]; end else begin ShowMessage('ungültige datei'); end; finally StringList.Free; end; end; |
ungetested so im editor getippt, sollte aber funktionieren.
$ebbi - Mo 14.03.11 15:11
vielen dank für die mühe, aber irgendwie reden wir ein wenig aneinander vorbei glaube ich (kann auch sein das ichs nicht verstehe :D)
ziel wäre etwas in eine datei zu schreiben, dann den string auszulesen und diesen string als befehl zu nutzen. geht das überhaupt?
Edit: prinzipiel brauch ich ja ein parser(?) der mir einen string in einen befehl umwandelt.
Gausi - Mo 14.03.11 15:48
Nein, für das, was du oben beschrieben hast, brauchst du keinen Parser. Du willst doch in etwa so eine Datei haben, oder?
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| [summary] AnzahlItems = 42
[Item1] Barcode = 4711 Name = Eimer Preis = 10,00
[Item2] Barcode = 12178 Name = Schaukelstuhl Preis = 129,99
[Item3] Barcode = 0815 Name = Teddybär Preis = 13,39
... |
Dass der Preis dann in Edit1 erscheinen soll, und der Name in Edit43, ist doch völlig egal, oder? Dein Programm muss nun so ausgelegt sein, dass deine Schwester erstens diese Daten bequem in die Datei hineinbekommt und auch bearbeiten kann und zweitens in der Kaufladensimaulation zu den Barcodes die richtigen Daten angezeigt werden.
Das ist nicht mal eben in 10 Minuten runterprogrammiert, aber einen Parser brauchst du dafür nicht!
$ebbi - Mo 14.03.11 18:25
wenn ich das jetzt alles richtig versteh wäre es am sinnvollsten die nummer in einer (erweiterbaren) txt datei zu suchen und dann einem name/preis der ebenfalls in der txt steht zuzordnen, oder? problem wäre da aber wie ich die nummer in der txt suche un dazu den richtigen preis finde.
jaenicke - Mo 14.03.11 18:57
Du kannst ja mit einer for-Schleife alle Einträge in der INI durchgehen und nachschauen wo die Nummer steht.
Oder du nimmst eine XML-Datei, dann ist das nur eine Zeile. Aber das ist für dich denke ich unnötig kompliziert. Eine INI ist veraltet und bedeutet mehr Code, ist aber einfacher. Schau dir einfach TIniFile an.
$ebbi - Sa 19.03.11 18:54
so hab mich jetzt nochmal an der ini probiert
sieht jetzt so aus:
das reinschreiben funktioniert tadellos
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| ini := TIniFile.Create('.\neu.ini'); try ini.Writestring(nummer, 'name', name); ini.Writestring(nummer, 'Preis', preis); finally ini.Free; end; |
aber rauslesen macht probleme:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TKassenform.Button1Click(Sender: TObject); begin nummer:=edit1.Text; TIniFile.Create('.\neu.ini'); try ini.Readstring(nummer, 'name', wert1); ini.Readstring(nummer, 'preis', wert2); finally Free; end; showmessage(wert1); end; |
krieg da immer eine fehlermeldung vonwegen EAccessViolation und lesen von Adresse 00000000' aufgetreten. woran leigt das? was mach ich falsch?
jaenicke - Sa 19.03.11 18:57
Naja... vergleichen wir einmal...
$ebbi hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| ini := TIniFile.Create('.\neu.ini'); try ini.Writestring(nummer, 'name', name); ini.Writestring(nummer, 'Preis', preis); finally ini.Free; end; | |
$ebbi hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| nummer:=edit1.Text; TIniFile.Create('.\neu.ini'); try ini.Readstring(nummer, 'name', wert1); ini.Readstring(nummer, 'preis', wert2); finally Free; end; | |
Da sollte aber auch eine Warnung kommen, dass ini nicht initialisiert ist... Warum ignorieren die Warnungen eigentlich so viele? :roll:
$ebbi - Sa 19.03.11 19:27
So jetzt klappts aber irgendwie steht in der showmessage gar nix.
Edit: Ach ja wie mach ich, dass wenn er die nummer nicht findet er keine fehlermeldung bringt sondern ne nachricht Nummer nicht gefunden?
jaenicke - Sa 19.03.11 19:32
Du speicherst die ausgelesenen Werte ja auch nirgends, du schmeißt den Rückgabewert von ReadString ja weg. :nixweiss:
$ebbi hat folgendes geschrieben : |
Delphi-Quelltext 1: 2:
| try ini.Readstring(nummer, 'name', wert1); | |
$ebbi - Sa 19.03.11 19:33
Moderiert von
Narses: Komplett-Zitat des letzten Beitrags entfernt.
wie speichern? was müsst ich da ändern?
jaenicke - Sa 19.03.11 19:35
Du solltest dir
vielleicht einmal die Hilfe zu dem Befehl anschauen... :roll:
Delphi-Quelltext
1:
| wert1 := ini.Readstring(nummer, 'name', 'Standardwert'); |
$ebbi - Sa 19.03.11 20:19
Vielen dank hast mir sehr gegolfen :)
Eine Sache noch, wie mach iches, dass wenn er die nummer nicht findet er keine fehlermeldung bringt sondern ne nachricht Nummer nicht gefunden?
jaenicke - Sa 19.03.11 20:38
Eine Fehlermeldung sollte auch nicht kommen, sondern es wird einfach der Standardwert benutzt.
Aber wie wäre es, wenn du vorher abfragst, ob der Wert überhaupt existiert? Die Methode dafür müsste Reg.ValueExists heißen.
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!