Entwickler-Ecke

Sonstiges (Delphi) - Wieder Funktionen, ich lerne es nie ;(


Teddyman - Di 13.04.04 15:01
Titel: Wieder Funktionen, ich lerne es nie ;(
Hallo, da ich wirklich Anfänger bin, fällt ir einiges schwer. Ich bitte um euer Verständnis.
Und ich finde die Hilfe hier sehr gut, Danke.

Habe folgendes Problem:
Ich will vier Seriennnummern eingeben ANS1 bis ANS4 und diese in eine Textdatei speichern.
Wie kann ich den unten stehenden Code durch evtl. einer Funktion kürzen?
Danke.


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:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
//Seriennummer ANS1 eingeben
procedure TForm1.Edit2Exit(Sender: TObject);
var Text_Datei: TextFile;
    s:String;
begin
 AssignFile (Text_Datei, 'C:\Messwerte.txt');
 Append(Text_Datei);
 s := Edit2.Text;
 Writeln(Text_Datei,s+'  '+'ANS1');
 CloseFile(Text_Datei);
end;


//Seriennummer ANS2 eingeben
procedure TForm1.Edit3Exit(Sender: TObject);
var Text_Datei: TextFile;
    s:String;
begin
 AssignFile (Text_Datei, 'C:\Messwerte.txt');
 Append(Text_Datei);
 s := Edit3.Text;
 Writeln(Text_Datei,s+'  '+'ANS2');
 CloseFile(Text_Datei);
end;


//Seriennummer ANS3 eingeben
procedure TForm1.Edit4Exit(Sender: TObject);
var Text_Datei: TextFile;
    s:String;
begin
 AssignFile (Text_Datei, 'C:\Messwerte.txt');
 Append(Text_Datei);
 s := Edit4.Text;
 Writeln(Text_Datei,s+'  '+'ANS3');
 CloseFile(Text_Datei);
end;


//Seriennummer ANS4 eingeben
procedure TForm1.Edit5Exit(Sender: TObject);
var Text_Datei: TextFile;
    s:String;
begin
 AssignFile (Text_Datei, 'C:\Messwerte.txt');
 Append(Text_Datei);
 s := Edit5.Text;
 Writeln(Text_Datei,s+'  '+'ANS4');
 CloseFile(Text_Datei);
end;


Moderiert von user profile iconMotzi: Delphi-Tags hinzugefügt.


raziel - Di 13.04.04 17:03

so (habs grad nich getestet..., wenns net funzt einfach nochma mit fehlermeldung melden ;-) ):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.EditExit(Sender: TObject);
var Text_Datei: TextFile;
    sendername, s:String;
begin
   sendername := TButton(Sender).Name;
   AssignFile (Text_Datei, 'C:\Messwerte.txt');
   Append(Text_Datei);
   s := TButton(Sender).Text;
   Writeln(Text_Datei,s+sendername);
   CloseFile(Text_Datei);
end;

dieses Ereignis allen Edits zuweisen.
Evtl würd ich da jetzt noch die Edits umbenennen:
Edit2 in ANS1
Edit3 in ANS2, etc, da beim Speichern einfach der Name des entsprechenden Edits angehängt wird!


raziel


PhilGo - Di 13.04.04 17:15

Oder du haust die ganzen Edit[1-5] 's in einen Stream und speicherst diesen in einer Datei.


Mfg PhilGo


bms - Di 13.04.04 17:35

Liebe Leute ich bitte euch.



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 
  sl: TextFile; 
  s:String
var
  f = 'C:\Messwerte.txt';
begin 
  sl := TStringList.Create;
  try
    s := Edit2.Text; 
    sl.Add(s + ' ' + 'ANS1'); 
    s := Edit3.Text; 
    sl.Add(s + ' ' + 'ANS2'); 
    s := Edit4.Text; 
    sl.Add(s + ' ' + 'ANS3'); 
    s := Edit5.Text; 
    sl.Add(s + ' ' + 'ANS4'); 

    sl.SaveToFile(f);
  finally
    sl.Free;
  end;
end;


PhilGo - Di 13.04.04 17:40

Oder so. :wink:


raziel - Di 13.04.04 20:07

*hüstel*
das führt aber imho zu einem anderen ergebnis als bei teddyman!
bei dir werden die 4 ergebnisse in der datei gespeichert.
bei teddyman und mir wird jeweils das "angeklickte" ergebnis hintenrangehängt...


raziel


bms - Di 13.04.04 20:11

Teddyman hat folgendes geschrieben:
Ich will vier Seriennnummern eingeben ANS1 bis ANS4 und diese in eine Textdatei speichern.


raziel - Di 13.04.04 20:17

Teddyman hat folgendes geschrieben:
Wie kann ich den unten stehenden Code durch evtl. einer Funktion kürzen?

ja, wie denn nu?


Inferno - Mi 14.04.04 14:55

hi

vielleicht so:


die funktion die das in ein file schreibt


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure WriteToFile(Text : string);
var Text_Datei: TextFile; 
begin 
  AssignFile(Text_Datei, 'C:\Messwerte.txt'); 
  Append(Text_Datei); 
  Writeln(Text_Datei, Text); 
  CloseFile(Text_Datei); 
end;


und hier 2 beispiel buttons:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Edit3Exit(Sender: TObject); 
begin 
  WriteToFile(Edit3.Text + '  ' + 'ANS3'); 
end;

procedure TForm1.Edit2Exit(Sender: TObject); 
begin 
  WriteToFile(Edit2.Text + '  ' + 'ANS2'); 
end;

...


besser :)

mfg

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt


bms - Mi 14.04.04 15:21

Wenn so, dann aber richtig:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure WriteToFile(Text : string);
var
  Text_Datei: TextFile;
const
  Datei = 'C:\Messwerte.txt';
begin
  AssignFile(Text_Datei, Datei);
  try
    if FileExists(Datei)
      then Append(Text_Datei)
      else Rewrite(Text_Datei);
    Writeln(Text_Datei, Text);
  finally
    CloseFile(Text_Datei);
  end;
end;


Zuerst sollte die Datei geschlossen werde auch wenn ein Fehler vorkommt. Deshalb ist es besser es in finally Block zu packen. Dann gibt es eine mechtige Fehelermeldung wenn die Textdatei nicht existiert. Also sollte man zuerst prüfen ob die Datei bereits existiert. Wenn nicht, dann zuerst eine neue erstellen.


Inferno - Mi 14.04.04 15:29

@bms

ersten wollte ich den code jetzt ned so genau schreiben sonst hätte ich das schon mit


Delphi-Quelltext
1:
2:
3:
4:
5:
try  
  ...
except
  ...
end;


gemacht.

zweitens wieso willste die datei vorher zumachen, und warum schreibst du das du das willst und es dann aber gar nicht im quellcode stehen hast ??

mfg
Inferno

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt


bms - Mi 14.04.04 16:00

Except ist falsch. Die Datei soll jedes mal geschlossen werden wenn die Prozedur zu ende ist. Nicht nur wenn es ein Fehler gibt, sondern immer. Und dafür gibt es Finally. Finally wir ausgeführt wenn es einen Fehler gibt, aber auch wenn es einen Fehler gibt. Also immer. Except nur wenn es einen Fehler gibt.

Die Datei sollte geschlossen werden weil sie das nächste mal wieder geöffnet wird. Sollange sie nicht geschlossen wird können kein anderen Programme in die Datei schreiben.

Und wieso hab ich es nicht im Quellcode stehen. Die Datei wird im Finally-Block geschlossen.


Inferno - Mi 14.04.04 16:32

bms hat folgendes geschrieben:

Zuerst sollte die Datei geschlossen werde auch wenn ein Fehler vorkommt. Deshalb ist es besser es in finally Block zu packen. Dann gibt es eine mechtige Fehelermeldung wenn die Textdatei nicht existiert. Also sollte man zuerst prüfen ob die Datei bereits existiert. Wenn nicht, dann zuerst eine neue erstellen.


Also zum einen hätte ich das closefile auch in den try block geschrieben von daher warum soll es da ned gehen.
zum anderen schreibst du ZUERST die datei schließen, deswegen frage ich einmal Warum und sagt das du es auch nicht machst ;)

Achja:
Bei try finally wird jeder block immer ausgeführt das heißt du musst auch jedesmal eine Fehlerbehandlung durchführen und die willste ja wohl ned ausser acht lassen, oder??
bei try except wird der except teil nur dann ausgeführt wenn ne exception auftrat und somit wird auch nur dann ne fehlerbehandlung gemacht und nicht jedesmal.

mfg

Inferno


bms - Mi 14.04.04 17:03

Mit "zuerst" meinte ich nicht nicht die erste Zeile, sondern "fangen wir mit der Aufzählung der Punkte an". Es ist also als ein wichiger Punkt gemeint. Jetzt verstanden? Ich galaube, daß alle anderen es verstanden haben.

Und jetzt das 1 mal 1 des Finally: ein Try Block ist kein Errorblock, sondern ein geschützter Block. Das hat nichts mit Fehlerbehandlung zu tun. Oder willst du behaupten, das das Fehlerbehandlung ist?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
variable := typename.Create;
try

finally
  variable.Free;
end;


Finally ist der Bereich der immer ausgeführt wird. Auch wenn es zwischen try und finally einen Fehler gibt. Es muß aber nicht zum Fehler kommen. Finally sagt einfach aus, daß es gemacht werden muß. Except ist nur für Fehler. Wo siehst du aber im oberen Bereich eine Fehlerbehandlung?

Da tust du anscheinend jeden Menge durcheinander bringen.


Inferno - Mi 14.04.04 17:10

du kannst aber schon lesen oder???

ich hab doch geschrieben das der EXCEPT Block nur bei Exception ausgeführt wird. und deswegen auch nur dort die fehlerbehandlung rein muss, wobei sie bei try..finally immer mit geprüft werden muss.


ausserdem weiß ich nicht warum du mich so angehst ich wollte lediglich mich dazu äußern warum ich try..except benutze und du meinstest das das Falsch wäre.

noch was:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
variable := typename.Create; 
try 

finally 
  variable.Free; 
end;


was bringt diese zusammenstellung, sollte die variable nicht erstellt werden können, kann dir dein prog mit ner exception abkacken, und dann bringt es mir nix die var wieder freizugeben wenn sie noch nicht mal erstellt wurde ;)

mfg
Inferno

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt


bms - Mi 14.04.04 17:20

Entschuldige bitte, aber ich weiß nicht wie ich weiter argumentiern kann ohne dir keine Kenntnis in dem Bereich zu bescheinigen. Warum diskutierst du überhaupt weiter? Warum machst du nicht einfach ein Beispiel und läufst in das Messer? In dem Beispiel oben ist kein Platz für Except. Verstehst du das nicht? CloseFile(Text_Datei) soll auf jeden Fall ausgeführt werden und deshalb muß es in ein Finally Block. Nicht in ein Except-Block. Lies dir bitte noch mal die Hilfe ausführlich durch bevor du dich nochmal meldest.


bms - Mi 14.04.04 17:23

Inferno hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
variable := typename.Create; 
try 

finally 
  variable.Free; 
end;


was bringt diese zusammenstellung, sollte die variable nicht erstellt werden können, kann dir dein prog mit ner exception abkacken, und dann bringt es mir nix die var wieder freizugeben wenn sie noch nicht mal erstellt wurde ;)


Es bringst schon was wenn der Fehler nicht beim Objekt liegt. Hier wird das Objekt immer freigegeben, ob es einen Fehler gab oder nicht. Beispiel: du lädst in ein StringList eine Textdatei die nicht existiert. Das führt dazu, daß die Prozedur abgebrochen wird.

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt


Inferno - Do 15.04.04 13:48

wer lesen kann is klar im vorteil ;)