![]() |
Erkennen von Lines
Ich habe eine Textdatei die ich auslesen lassen mächte ! das ist für so ein kleines haushaltsbuch:
Delphi-Quellcode:
Jetzt sieht der text in der datei so aus:DateiName := OpenDialog1.FileName ; ChecklisteEin.Lines.LoadFromFile(OpenDialog1.FileName); // ChecklisteEin ist ein Memo wo alles aus txt datei angezeigt wird AssignFile (Datei, DateiName); Reset (Datei); for i := 1 To Max do begin ReadLn (Datei, zeile1); ReadLn (Datei, (zeile2)+1); ChecklisteEin Fernseher -500 Gehalt 1500 um die schleife (oben , for i =...) zu durchlaufen muss ich eine konstate angeben! jetzt wollte ich schreiben const Max : Ln / 2 aber das geht nicht ich möchte nämlich die Geldwerte erkennen lassen so das ich die zusammenrechnen kann, wie erkennt delphi, das es z.B. wie in diesem beispiel 2 werte sind und das er dann 1000 ausgibt??? [edit=Sharky]Delphi-Tags gesetzt. Mfg, Sharky[/edit] |
Re: Erkennen von Lines
Ist es das was du suchst?
Memo1.Lines[i]; bzw. ChecklisteEin.Lines[i]; Gruß, Robert |
Re: Erkennen von Lines
Ja das geht schonmal gut
doch wie kann ich jetzt erkennen lassen, (das jetzt nur für die rechnung) das die erste zeile ignoriert wird (ChecklisteEin) die zweite ein name ist (Fernseher) auch ignoriert wird und das die dritte Zeile eine Zahl ist (-500) und das er nun jede zweite zeile bis es nicht mehr geht zusammenrechnet! die rechnung soll dann in einem panel (panel1) ausgegeben werden |
Re: Erkennen von Lines
Bitte ganz langsam zum Mitschreiben - Was willst du machen? :gruebel:
|
Re: Erkennen von Lines
also, ich habe ein haushaltsprogramm jetzt gerade in bearbeitung
ein haushaltsbuch ist soetwas wo man seine ein und ausnahmen reinschreibt. jetzt habe ich ein memo feld in dem die ein und ausnahmen dokumantiert werden (ich habe noch zwei textfelder die die memo füllen) der speichern button geht schon doch jetzt will ich eine datei laden und das delphi die Beschreibung + preis im memo feld ausgibt (das hab ich schon hingekriegt) und das er die werte zu einem Kontostand zusammenrechnet : der text in der memobox und demzufolge auch in der textdatei die ich gespeichert habe sieht immer so aus; ChecklisteEin // Name des memo felds steht so da Fernseher -500 PC -1000 Gehalt 2500 usw. jetzt möchte ich das der pc beim öffnen der textdatei die daten liest Zeile 1 ChecklisteEin // soll ignoriert werden Zeile 2 Fernseher // erste Beschreibung soll auch ignoriert werden Zeile 3 -500 // erster wert der umgewandelt werden soll in strtofloat Zeile 4 PC // zweite Beschreibung soll wieder ignoroert werden Zeile 5-1000 // zweiter wert zum rechenen jetzt soll delphi selber erkennen wie viele zeilen noch kommen und jede zweite (ahlwert) soll zum vermägen dazugerechnet werden und in panel1 ausgegeben werden! also, der pc soll rechnen vermoegen := Von zeile 3 die -500 vermoegen := vermoegen + zeile 5 -1000 und dann panel1.caption := FloatToStr (vermoegen); |
Re: Erkennen von Lines
|
Re: Erkennen von Lines
kannst du mir dazu mal ein kleinen quelltext schreiben
if OpenDialog1.Execute then DateiName := OpenDialog1.FileName ; ChecklisteEin.Lines.LoadFromFile(OpenDialog1.FileN ame); AssignFile (Datei, DateiName); Reset (Datei); for i := 1 To Max do begin ReadLn (Datei, zeile1); ReadLn (Datei, (zeile2)+1); es ist wichtig das nur jede 2. zeile als zahl gelesen wird ! wie benutze ich das trystrtoint? |
Re: Erkennen von Lines
schreib es in deinen quelltext, setz den cursor drauf und drück F1 ;)
|
Re: Erkennen von Lines
okay aber das mit der konstante geht noch nicht so richtig
const Max= DateiName.Lines[i]; for i := 1 To Max do Max soll die Anzahl der Zeilen in der textdatei sein |
Re: Erkennen von Lines
Anzahl der Zeilen:
Delphi-Quellcode:
MfG
Memo1.Lines.Count
freak |
Re: Erkennen von Lines
und wie kann ich nun die erste zeile ignorieren und dann jeweils die zweite in integer konvertieren
Zeile1 ignorieren zeile 2 beschreibung zeile 3 preis // integer zeile 4 beschreibung zeile 5 preis// integer zeile 6 ........ |
Re: Erkennen von Lines
na mit trystrtoint....
Delphi-Quellcode:
Noch fragen?
for i:= 0 to sl.lines.count -1 do
if trystrtoint(sl.lines[i]) then sum:=sum + strtoint(sl.lines[i]); Und jetzt zurück zu den revolutionären tagesgeschäften... |
Re: Erkennen von Lines
Hi!
Schieb doch einfach ne temporäre String-Variable dazwischen:
Delphi-Quellcode:
Deklarationen:
AssignFile (Datei, DateiName);
Reset (Datei); ReadLn (Datei, Temp); // Zeile 1 ignorieren for i := 1 To Max do begin ReadLn (Datei, zeile1); // Bezeichnung ReadLn (Datei, zeile2); // +1 entfernt, da Betrag direkt in der nächsten Zeile kommt Val(Zeile2, int_Betrag, ErrCode); end; var ErrCode, int_Betrag: Integer; Temp: String; Arbeitest Du auch mit ungeraden Beträgen (mit Cent-Angaben) soltest Du int_Betrag als Real definieren. Hoffe, dir geholfen zu haben. Gruß, Andy |
Re: Erkennen von Lines
Code:
ich habe das jetzt erstmal so übernommen aber das mit der Konstanten geht irgendwie überhaupt nicht ??
[b]const Max = ChecklisteEin.Lines.Count;[/b]
begin if OpenDialog1.Execute then DateiName := OpenDialog1.FileName ; ChecklisteEin.Lines.LoadFromFile(OpenDialog1.FileName); AssignFile (Datei, DateiName); Reset (Datei); AssignFile (Datei, DateiName); Reset (Datei); ReadLn (Datei, Temp); // Zeile 1 ignorieren for i := 1 To Max DO begin ReadLn (Datei, zeile1); // Bezeichnung ReadLn (Datei, zeile2); // +1 entfernt, da Betrag direkt in der nächsten Zeile kommt Val(Zeile2, int_Betrag, ErrCode); end; Panel1.Caption := (); und wie kann ich nun alles zusammenrechnen lassen??? tut mir ja leid das ich euch so nerve [edit=Sharky]PRE-Tags eingefügt. Mfg, Sharky[/edit] |
Re: Erkennen von Lines
Hi,
Zitat:
Grüße vom marabu |
Re: Erkennen von Lines
mach aus dem const einfach ein var, homerunjack, und weise es zur laufzeit zu ( max:=memo1.lines.count -1). Konstanten funktionieren anders ;)
|
Re: Erkennen von Lines
@marabu: stimmt ich dachte die ist standardmäßig da und lässt sich nicht entfernen
@DGL-Luke: ja das ist mir auch gerade eingefallen so wie kann ich nun aus jeder zweiten zeile die werte zusammenrechnen??? procedure TForm1.ffnen1Click(Sender: TObject); var DateiName, zeile1, zeile2: String; Datei: TextFile; i, ErrCode, int_Betrag, Max, vermoegen: Integer; Temp: String; begin if OpenDialog1.Execute then DateiName := OpenDialog1.FileName ; ChecklisteEin.Lines.LoadFromFile(OpenDialog1.FileN ame); Max := ChecklisteEin.Lines.Count; AssignFile (Datei, DateiName); Reset (Datei); AssignFile (Datei, DateiName); Reset (Datei); for i := 1 To Max DO begin ReadLn (Datei, zeile1); // Bezeichnung ReadLn (Datei, zeile2); // +1 entfernt, da Betrag direkt in der nächsten Zeile kommt Val(Zeile2, int_Betrag, ErrCode); vermoegen := zeile2 + jede weitere 2. zeile ??? Panel1.Caption:= FloatToStr (vermoegen); end; |
Re: Erkennen von Lines
Hi,
die automatisch von der Delphi-IDE generierten Namen sind nur Platzhalter - du solltest die abändern, damit sich nicht sowas wie OpenDialog1 oder Edit1234 in deinem Programm breit macht. Schau mal, ob du das zum Laufen bringst:
Delphi-Quellcode:
Grüße vom marabu
procedure TMainForm.FileOpenClick(Sender: TObject);
var i, iError, iBetrag, iSaldo: integer; s: TStrings; begin if not OpenDialog.Execute then Exit; s := ChecklisteEin.Lines; s.LoadFromFile(OpenDialog.FileName); iError := 0; iSaldo := 0; for i := 0 To s.Count - 1 do begin if not Odd(i) then Continue; if not TryStrToInt(s[i], iBetrag) then Inc(iError) else iSaldo := iSaldo + iBetrag; end; SaldoPanel.Caption := IntToStr(iSaldo); end; |
Re: Erkennen von Lines
Ja das mit dem Laden klappt jetzt(danke, marabu und co.)
doch du hast ja geschrieben iSaldo := 0; wenn ich nun etwas geladen habe und eine neue Beschreibung mit preis hinzufüge fängt das programm wieder bei null an und rechnet dann normal weiter, sozusagen das laden geht doch den ausgangswert von der textdatei kann nicht weiterverwendet werden
Delphi-Quellcode:
[edit=Sharky]Delphi-Tags gesetzt. Bitte zukünftig selber machen Mfg, Sharky[/edit]
procedure TForm1.Button1Click(Sender: TObject);
begin // das passiert wenn einnahmen angeklickt wird begin if RadioEin.Checked then Neu:= StrToFloat (Edit2.Text); if RadioEin.Checked then ChecklisteEin.Lines.Add (Edit1.Text) ; if RadioEin.Checked then Edit3.text := FloatToStr(Neu); if RadioEin.checked then ChecklisteEin.Lines.Add(Edit3.Text ) ; if RadioEin.Checked then Gewinnzwei:= (Gewinn + Neu + Gewinn) ; if RadioEin.Checked then Panel1.Caption:= Floattostr (Gewinnzwei); end; // das passiert wenn ausgaben angeklickt wird begin if RadioAus.Checked then Neu:= StrToFloat (Edit2.Text); if RadioAus.Checked then ChecklisteEin.Lines.Add (Edit1.Text) ; if RadioAus.Checked then Edit3.text := FloatToStr(Neu * -1); if RadioAus.checked then ChecklisteEin.Lines.Add(Edit3.Text ) ; [b]if RadioAus.Checked then Gewinnzwei:= (Gewinnzwei - Neu + Gewinn) ; if RadioAus.Checked then Panel1.Caption:= Floattostr (Gewinnzwei); end;[/b] if (not RadioAus.checked) and (not RadioEin.checked) then ShowMessage ('Ein- oder Ausgabe anklicken'); end; procedure TForm1.Beenden1Click(Sender: TObject); begin close; end; procedure TForm1.ffnen1Click(Sender:TObject); var i, iError, iBetrag, Gewinn: integer; s: TStrings; begin if OpenDialog1.Execute then begin s := ChecklisteEin.Lines; s.LoadFromFile(OpenDialog1.FileName); iError := 0; Gewinn := 0; for i := 0 To s.Count - 1 do begin if not Odd(i) then Continue; if not TryStrToInt(s[i], iBetrag) then Inc(iError) else Gewinn := Gewinn + iBetrag; end; Panel1.Caption := IntToStr(Gewinn); end; |
Re: Erkennen von Lines
Muss denn das unbedingt eine Textdatei sein? Es wäre schöner und einfacher zu handeln, wenn du dir einen eigenen Datentyp deklarierst und den dann in eine typisierte Datei schreibst. Dir also quasi dein eigenes Dateiformat baust. Und ausgeben ließe sich das dann vielleicht in einer ListView im vsReport-Modus. Also so ungefährt so:
Name | Preis ----------+------ Gehalt | 500 Fernseher | -1500 Der Typ könnte dann z.B. so aussehen:
Delphi-Quellcode:
//edit
type TEintrag = record
Name: string; Preis: integer; end; Hrrmpf, hat meine ganze schöne Formatierung übern Jordan geschickt |
Re: Erkennen von Lines
ich habe davon leider noch keine ahnung wenn das hier irgendwo steht oder du mir dazu ein gutes buch empfehlen kannst dann schreib mal rein
homerunjack |
Re: Erkennen von Lines
Liste der Anhänge anzeigen (Anzahl: 1)
Setz dich am besten mal mit
![]() Hmm oder ich schick dir mal ne Klasse die ich mir abgeleitet hab und direkt typisiert u.a. auch Strings schreiben und lesen kann. Dann müsstest du ihm beim Laden nur noch folgenden Code (untested) schreiben:
Delphi-Quellcode:
Nur mal so als grobe Übersicht.
type TEintrag = record
Name: string; Preis: integer; end; var Eintraege = array of TEintrag; procedure Load(FileName: TFilename); var i: Integer; Count: cardinal; F: TAdvFileStream; // Das ist meine Klasse...such ich dir noch raus und schick dir das begin F := TAdvFileStream.Create(Filename, fmOpenRead); try Count := F.ReadCardinal; // Auslesen wieviele drin sind SetLength(Eintraege, Count); // Länge des Arrays setzen for i := 0 to (Count - 1) do with Eintraege[i] do begin // Und dann alle nacheinander auslesen Name := ReadStr; Preis := ReadInt; end; finally F.Free; end; end; // Beim Speichern alles einfach in der gleichen Reihenfolge wieder reinschreiben; procedure Speichern(Filename: TFilename); var i: integer; F: TAdvFileStream; begin F := TAdvFileStream.Create(Filename, fmCreate); try F.WriteCardinal(length(Eintraege)); // Hier auch: erst abspeichern wie viele Einträge jetzt kommen for i := 0 to length(Eintraege) - 1 do with Eintraege[i] do begin // Dann nacheinander alle reinschreiben F.WriteStr(Name); F.WriteInt(Preis); end; finally F.Free; end; end; @all: Ich weiß, dass ihr mich jetzt gleich zerreißen werdet, weil's kein OOP ist und noch dazu globale Variablen verwendet. :twisted: Ist aber ja auch nur ein Beispiel. :wink: PS: Benutz doch bitte in Zukunft für Quellcode die Delphi-Tags! Das kann ja kein Mensch lesen so. //edit So hier auch die Unit |
Re: Erkennen von Lines
Hi homerunjack,
Zitat:
Bevor du den eingeschlagenen Weg weiter gehst - hast du dir mal ein Haushaltsbuch angesehen? Ein Datensatz sollte mindestens folgende Informationen enthalten: Datum, Text, Einnahme, Ausgabe. Die Darstellung sollte tabellarisch erfolgen. Speichern kannst du die Daten auch tabellarisch. Als CSV-Datei:
Code:
oder auch in einer relationalen Datenbank als Tabelle.
Datum, Text, Einnahme, Ausgabe
2005-09-01,"Gehalt,Rente,Sonstiges",9999.99, 2005-09-03,DSL-Flatrate,,1.99 Bei der tabellarischen Darstellung ist die schon erwähnte ListView sehr hilfreich, aber für den Anfang kannst du auch mit einem StringGrid experimentieren. Wenn dich mein Beitrag irritiert, dann übersehe ihn einfach und mache da weiter wo du stehst. Freundliche Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz