Entwickler-Ecke

Dateizugriff - Eingabe in Textfile ausgeben ??


[SaWa]barrier23 - Do 02.03.06 13:06
Titel: Eingabe in Textfile ausgeben ??
ich würde gern ein kleines programm schreiben wo man besimmte dinge eingeben muss und das programm dann die eingegebenen werte in ein textfile speichert!

also zbsp im programm so

Label1 (zbsp. Name) : Edit1 (Zbsp Peter)


und im textfile soll es dann so aussehen

Name:Peter


ist das irgendwie für einen anfänger im delphi möglich?


Moderiert von user profile iconraziel: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 02.03.2006 um 12:23


mkinzler - Do 02.03.06 13:12

Ja, in eine Datei kannst du wie auf den Bildschirm mit write/Writeln schreiben.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var 
    datei: TextFile;
begin
    AssignFile( datei, 'datei.txt');
    Rewrite( datei);
    Write( datei, Label1.Caption); Write( datei, ':'); WriteLn( datei, Edit1.Text);
   ...


[SaWa]barrier23 - Do 02.03.06 13:23

klingt gut!
gleich mal ausprobieren!fragt er mich dann auch nach dem pfad wo er die datei anlegt oder legt er die automatisch in das programm verzeichniss?


mkinzler - Do 02.03.06 13:31

Er legt es in den aktuellen Pfad, was normalerweise das Verzeichnis der Anwendung ist. Wenn aber zwischenzeitlich der Pfad gewechselt wurde, legt er es dort ab. Wenn du erzwingen willst, daß die datei im Pfad der Exe angelegt wird, kannst du das durch Änderung auf ExtractFilePath( Application.ExeName)+'datei.txt' bewerkstelligen. Wenn du den Pfad auswählen willst verwende einen Filedialog.


[SaWa]barrier23 - Do 02.03.06 19:14

ok das funktiniert schon mal :)
nur wenn ich mein programm jetzt schließe und wieder aufmache will ich nicht das er die datei neu anlegt sondern unter dem text den er schon drin gespeichert hat weiter macht und nicht alles aus der datei löscht!

also sagen wir das programm schreibt den text "hallo" in die datei!dann schließe ich das programm!dann öffne ich es wieder und will das er "du" reinschreibt.also das dann "hallo du" drin steht.so wie es jetzt ist steht aber nur "du" drin
also hat wer eine lösung?


mkinzler - Do 02.03.06 19:48

Einfach das rewrite(...); durch append( ...); ersetzen


[SaWa]barrier23 - Do 02.03.06 20:12

ok thx und jetzt eins noch!
hab jetzt 2 eingabefenster

Name: Edit1
Nachname : Edit2

nur wenn er das jetzt so macht setzt er sie in der textdatei genau nebeneinander!
ich möchte aber das er sie auch untereinander setzt

also nicht

PeterLustig

sondern

Peter
Lustig


Sinspin - Do 02.03.06 20:20

verwende einfach anstatt von write(...) writeln(...). denn mit writeln(...) wird automatisch am ende der eingabe ein zeilenumbruch angehangen.


[SaWa]barrier23 - Do 02.03.06 20:35

jetzt hab ich ein neues problem!

Einfach das rewrite(...); durch append( ...); ersetzen


das hab ich gemacht nur wenn es die datei noch nicht gibt (sagen wir beim allerersten programm start) bringt er mir ologischer weise den fehler das es die datei noch nicht gibt!
wie umgehe ich das?


edit: jetzt bringt er mir auch bei vorhandener datei den fehler ?(


mkinzler - Do 02.03.06 21:01

Beim ersten mal muß Rewrite aufgerufen werden, da Append() ein Fehler bringt, wenn die Datei noch nicht existiert.
Das kannst du durch einfügen von

Delphi-Quelltext
1:
if not FileExists( ...) then Rewrite(...) else Append(...);                    

machen


[SaWa]barrier23 - Do 02.03.06 23:06

das will nicht so wirklich!



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
 var 
    datei: TextFile;
begin
    AssignFile( datei, 'datei.txt');
    if not FileExists( datei) then Rewrite(datei) else Append(datei);
    Write( datei, Label1.Caption); Write( datei, ':'); Writeln( datei, Edit1.Text);


was ist daran falsch?

Moderiert von user profile iconraziel: Quote- durch Delphi-Tags ersetzt


klezmor - Fr 03.03.06 00:16

Will nicht stören aber für sowas würde ich ini files verwenden erklärung siehe hier: http://www.dsdt.info/tutorials/ini/


JayEff - Fr 03.03.06 03:37

Was auch nen Tick einfacher sein könnte:
TStringList.
TStringList kannst du wie die Lines Eigenschaft eines Memos benutzen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var s:TStringList; //deklarieren
begin
  s:=TStringList.Creage; //erstmal initialisieren
  s.text:='hallo'//inhalt: einfach nur 'hallo'
  s.Add('hallo du'); //inhalt: 'hallo'+neueZeile+'hallo du'
  s.SaveToFile('C:\asd.txt'); //Speichern
  s.LoadFromFile('C:\asd.txt'); //Laden
  s.Free; //Zum Speicher reinhalten, aber nicht zwangsläufig erforderlich. Das Objekt wird dann freigegeben.
          //das heist, das Objekt ist WEG und muss neu initialisiert werden, siehe oben.
end;


[SaWa]barrier23 - Fr 03.03.06 18:55

kannst du mir den quelltext noch mal an meinem bsp posten?
also mit einem label und einem edit-fenster

nur zur infos ich habe nicht nur eine abfrage sondern 32 label und 32 editfenster!


Martin1966 - Fr 03.03.06 19:06


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
 var 
    datei: TextFile;
begin
    AssignFile( datei, 'datei.txt');
    if not FileExists ('datei.txt'then Rewrite(datei) else Append(datei);
    Write( datei, Label1.Caption); Write( datei, ':'); Writeln( datei, Edit1.Text);


[SaWa]barrier23 - Fr 03.03.06 23:53

machts auch.nur hab ich dann noch einen befehl das er alles löscht aber da gibts nenn fehler den ich noch sleber beheben kann!
nur wie mach ich es das er die textdatei mit dem name speichert den ich bei name eingegeben!

also name: peter

und die textdatei heißt dann peter.txt!


JayEff - Sa 04.03.06 01:24

Du wirst doch noch einen String zusammensetzen können? ;)

Delphi-Quelltext
1:
name+'.txt'                    


[SaWa]barrier23 - Sa 04.03.06 09:49

also so

Delphi-Quelltext
1:
2:
AssignFile( datei, name+'.txt');
if not FileExists (name+'.txt'then Rewrite(datei) else Append(datei);




aja mal offtopic!wie findet man den bbcode fürn delphi quelltext :(

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt


Blackheart666 - Sa 04.03.06 09:56

Klick mal Oben Rechts auf Hilfe dort wird alles beschrieben.


[SaWa]barrier23 - Sa 04.03.06 12:44

ok geht!könnte man den thread mal umbennen und mir die frage hier noch erklären!
wie kann ich die datei jetzt wieder laden?

also in der textdatei steht

Name: Peter

und dann soll er Peter ins Edit1 fenster laden
ist das ohne viel aufwand machbar?


Blackheart666 - Sa 04.03.06 15:11

Ich wusste das, das kommen würde.
Am besten Du schreibst mal was Du so allgemein vorhast, dann könnte man dir sagen was für dein Problem das einfachste ist aber Ich denke mal das mit der Stringlist solltest du dir genauer anschauen das wird dir sicher weiter helfen.
Oder schau mal nach Ini Dateien damit ist es auch sehr einfach.


[SaWa]barrier23 - Sa 04.03.06 18:17

jo ok
das ganze ist für eine handyübersicht gedacht die online gestellt werden soll und das sammeln der infos erleichtern soll!

und dann gibt man halt bei name :nokia 3210 ein,dann größe etc
nun findet man ja nicht immer alle angaben und dann speichert man und nimmt das nächste handy

jetzt findet man wieder neue infos
wenn man jetzt bei wieder nokia 3210 eingibt soll er dann automatisch die datein wieder laden und mann kann ergänzen!
alles verstanden?


Blackheart666 - So 05.03.06 10:42

Daraus wird man auch nicht ganz schlau, hier mal ein kleines Bsp.mit Ini vieleicht hilft dir ja das.


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:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IniFiles;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Zuruecksetzen: TButton;
    Laden: TButton;
    Speichern: TButton;
    procedure ZuruecksetzenClick(Sender: TObject);
    procedure SpeichernClick(Sender: TObject);
    procedure LadenClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ZuruecksetzenClick(Sender: TObject);
begin
  Edit1.Clear;
  Edit2.Clear;
  Edit3.Clear;
  Edit4.Clear;
  Edit5.Clear;
end;

procedure TForm1.SpeichernClick(Sender: TObject);
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Handy.ini');
  with Ini do
  begin
    WriteString(Edit1.Text,'Name',Edit1.Text);
    WriteInteger(Edit1.Text,'Groesse',StrToInt(Edit2.Text));
    WriteInteger(Edit1.Text, 'Gewicht',StrToInt(Edit3.Text));
    WriteString(Edit1.Text,'Farbe',Edit4.Text);
    WriteInteger(Edit1.Text,'Preis',StrToInt(Edit5.Text));
  end;
 Ini.Free;
end;

procedure TForm1.LadenClick(Sender: TObject);
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Handy.ini');
  with Ini do
  begin
    Edit1.Text:=ReadString(Edit1.Text,'Name','Kein Eintrag');
    Edit2.Text:=IntToStr(ReadInteger(Edit1.Text,'Groesse',0));
    Edit3.Text:=IntToStr(ReadInteger(Edit1.Text, 'Gewicht',0));
    Edit4.Text:=ReadString(Edit1.Text,'Farbe','Kein Eintrag');
    Edit5.Text:=IntToStr(ReadInteger(Edit1.Text,'Preis',0));
  end;
 Ini.Free;
end;
end.


[SaWa]barrier23 - So 05.03.06 23:38

ich probiers morgen mal!
sieht aber vertändlich aus! ;)


Blackheart666 - Mo 06.03.06 21:12

Hab extra den Edits etc. keine Namen gegeben, wiel Ich denke das verwirrt den (Anfänger) zu sehr.


jomeier85 - Di 07.03.06 00:42

Hallo

Also wenn ich das richtig sehe, willst du ne Datenbank mit Infos über Handys schreiben.

Dafür würde ich zunächst einmal die Einzelnen Infos in einem Record definieren. Etwa so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
Type  THandy = RECORD
    Name : string//Produktbezeichnung des Handys
    Hersteller : string//Hersteller des Handys
    Preis : real; //Was kostet das Handy
    Kamera : boolean; //Hat das Handy eine Kamera
    // usw. was du halt noch alles speichern willst
  end;


Dann würde ich mit einem eigenen Dateityp arbeiten: z.B. *.han

Jetzt kannst du eine Variable einführen, die etzwa wie folgt aussieht:


Delphi-Quelltext
1:
Var  Handy : File of THandy                    


In dieser Datei werden jetzt nur vollständige Datensätze vom typ THandy gespeichert.

Um diese zu verwalten, könntest du zum Beispiel beim öffnen der Datei die bereits vorhandenen Einträge in einfacher Form in einer ListBox ausgeben.

Will man nun einen Datensatz veränder wählt man ihn aus und verändert diesen.

Du solltest mit den folgenden Befehlen die Grundlagen zur Dateibehanbdlung kenne:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
AssignFile(File of Typ,Name) //meldet eine Datei unter dem angegebenen Namen an
Rewrite(File of Typ) //erzeugt und öffnet die angemeldete Datei und überschreibt diese auch
Reset(File of Typ) //öfnnet die Datei ohne sie zu überschreibern
CloseFile(File of Typ) //Schließt die Datei
Seek(File of Type, Stelle) //Springt in der Datei zur angegebenen Stelle
Append(File of Typ) //Öffnet die Datei und sprngt zum Ende um Daten anzuhängen
Read(File of Typ, Text) // Liest den Inhalt der aktuellen Zeile der Datei in Text ein
ReadLn(File of Typ, Text) //Siehe Read. Nur hier wird automatisch zur nächsten Zeile gesprungen
Write(File of Typ, Text) // Schreibt den Inhalt der aktuellen Zeile der Datei in Text
WriteLn(File of Typ, Text) //Siehe Write. Nur hier wird automatisch zur nächsten Zeile gesprungen

FileSize(File of Typ) //Liefert die aktuelle größe der Datei
FilePos(File of Typ) //Liefert die aktuelle Position des Dateizeigers
Eof(File of Type// ist true wenn das Dateiende erreicht ist


Ich hoffe das konnte dir weiterhelfen

mfg jomeier85


Sinspin - Di 07.03.06 18:24

@jomeier85, tschuldige das ich mich gerade vor unbehagen krümme!

ich dachte die erfindung mit der strukturierten textdatei wäre die lösung für sämmtliche probleme die beim speichern von daten via records und co auftreten können.
was soll zum beispiel passieren wenn irgendwann eine weitere eigenschaft hinzukommen soll? allen bestehenden daten müssen dann gelesen und wieder geschrieben werden. oder wenn auf einmal ein längerer name nötig wird. wobei noch zu erwähnen ist das das ganze mit dem generischen typen "string" nix wird!

ich finde die lösung mit der Ini datei ganz brauchbar. oder wenn man etwas anspruchsvolleres will kann man auch XML verwenden.
jedoch würde es auch reichen die werte alle als einfache strings zu speichern wobei alle daten eines handys in einer zeile gespeichert werden und die einzelnen werte mit einem sonst nicht in den werten vorkommendem zeichen voneinander getrennt werden.

eine ini datei hat allerdings den vorteil das sie einem das speichern und laden der datei abnimmt.


jomeier85 - Mi 08.03.06 10:49

ich gebe zu dass es bei der behandlung von ausschließlich strings sinnvoller ist textfiles zu benutzten.

zu dem ini file kann ich leider nicht s sagen, weil ich mir das tut noch nich durchgelesen habe, aber das klingt vielversprechend

mfg jomeier85