Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Erkennen von Lines (https://www.delphipraxis.net/52749-erkennen-von-lines.html)

homerunjack 2. Sep 2005 20:50


Erkennen von Lines
 
Ich habe eine Textdatei die ich auslesen lassen mächte ! das ist für so ein kleines haushaltsbuch:

Delphi-Quellcode:
 
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);
Jetzt sieht der text in der datei so aus:

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]

Puhbaehr 2. Sep 2005 21:03

Re: Erkennen von Lines
 
Ist es das was du suchst?

Memo1.Lines[i]; bzw. ChecklisteEin.Lines[i];

Gruß, Robert

homerunjack 2. Sep 2005 21:14

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

malo 2. Sep 2005 21:19

Re: Erkennen von Lines
 
Bitte ganz langsam zum Mitschreiben - Was willst du machen? :gruebel:

homerunjack 2. Sep 2005 21:41

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);

DGL-luke 2. Sep 2005 21:45

Re: Erkennen von Lines
 
ganz einfach:

Delphi-Referenz durchsuchentrystrtoint

sollte dir schon weiter helfen.

homerunjack 2. Sep 2005 22:04

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?

DGL-luke 2. Sep 2005 22:09

Re: Erkennen von Lines
 
schreib es in deinen quelltext, setz den cursor drauf und drück F1 ;)

homerunjack 2. Sep 2005 22:14

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

freak4fun 2. Sep 2005 22:16

Re: Erkennen von Lines
 
Anzahl der Zeilen:
Delphi-Quellcode:
Memo1.Lines.Count
MfG
freak

homerunjack 2. Sep 2005 22:20

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 ........

DGL-luke 2. Sep 2005 22:53

Re: Erkennen von Lines
 
na mit trystrtoint....

Delphi-Quellcode:
for i:= 0 to sl.lines.count -1 do
 if trystrtoint(sl.lines[i]) then sum:=sum + strtoint(sl.lines[i]);
Noch fragen?

Und jetzt zurück zu den revolutionären tagesgeschäften...

Saarpoint 2. Sep 2005 23:04

Re: Erkennen von Lines
 
Hi!

Schieb doch einfach ne temporäre String-Variable dazwischen:
Delphi-Quellcode:
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;
Deklarationen:

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

homerunjack 3. Sep 2005 08:32

Re: Erkennen von Lines
 
Code:
[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 := ();
ich habe das jetzt erstmal so übernommen aber das mit der Konstanten geht irgendwie überhaupt nicht ??
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]

marabu 3. Sep 2005 09:05

Re: Erkennen von Lines
 
Hi,

Zitat:

Zitat von homerunjack
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
...

ist dir klar, dass der von dir für die Memo-Komponente vergebene Name als Standardtext übernommen wird und auf dem Formular nur zur Orientierung angezeigt wird? Entweder du verzichtest auf diesen "Komfort" indem du die Memo-Lines im Objekt-Inspektor löschst, oder du löschst die Zeilen in deinem Programm immer dann, wenn es nötig ist.

Grüße vom marabu

DGL-luke 3. Sep 2005 09:45

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 ;)

homerunjack 3. Sep 2005 09:47

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;

marabu 3. Sep 2005 10:11

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:
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;
Grüße vom marabu

homerunjack 3. Sep 2005 12:05

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:
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;
[edit=Sharky]Delphi-Tags gesetzt. Bitte zukünftig selber machen Mfg, Sharky[/edit]

tigerman33 3. Sep 2005 12:08

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:
type TEintrag = record
  Name: string;
  Preis: integer;
end;
//edit
Hrrmpf, hat meine ganze schöne Formatierung übern Jordan geschickt

homerunjack 3. Sep 2005 12:12

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

tigerman33 3. Sep 2005 12:26

Re: Erkennen von Lines
 
Liste der Anhänge anzeigen (Anzahl: 1)
Setz dich am besten mal mit Delphi-Referenz durchsuchenTFileStream auseinander.
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:
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;
Nur mal so als grobe Übersicht.

@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

marabu 3. Sep 2005 14:51

Re: Erkennen von Lines
 
Hi homerunjack,

Zitat:

Zitat von tigerman33
Benutz doch bitte in Zukunft für Quellcode die Delphi-Tags!

du kannst sogar deine Beiträge der letzten 24 Stunden bearbeiten und so lesbarer machen. Die Delphi-Tags - [.delphi] und [./delphi] ohne den Punkt - kannst du schreiben oder mit dem Button aus der Toolbar oberhalb vom Beitragseditor einbauen. Damit erhöhst du die Aufmerksamkeit für deine Beiträge und die Chance wächst, dass dir jemand mit didaktischem Geschick Ratschläge erteilt, die du mit deinem Kenntnisstand auch umsetzen kannst.

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:
Datum, Text, Einnahme, Ausgabe
2005-09-01,"Gehalt,Rente,Sonstiges",9999.99,
2005-09-03,DSL-Flatrate,,1.99
oder auch in einer relationalen Datenbank als Tabelle.

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