Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - [TEdit] Wert in .txt. speichern


ConditionZero - Mo 25.12.06 16:44
Titel: [TEdit] Wert in .txt. speichern
tach,
Ich will ein Trainer machen, wo man Fragen und Antworten eingeben kann und man sich später die Fragen abfragen kann... Jetzt will ich es so das wenn man eine Neue Frage hinzufügen will, das Thema der Frage eingeben soll, z.B. Mathematik etc. Das kann man dann in Edit's eingeben alles und ich will es so machen, dass eine Textdatei erstellt wird für jedes Thema also z.B. eine Textdatei die Mathematik.txt heißt und dann die erste Zeile eine Frage ist, die zweite Zeile die dazugehörende Antwort dann die 3. Zeile eine neue Frage usw... Meine Frage: Wie kann ich denn eine Textdatei anlegen welche den Namen vom Wert Edit1.Text hat? Ich kannte das bisher nur aus TStringGrids mit SaveToFile diese Funktion gibt es aber nicht bei Edit's und Memo's.

LG


Marco D. - Mo 25.12.06 17:04

Memo1.Lines.SaveToFile gibt es. Du kannst den String eines Edits entweder per FileStream speichern oder die SaveToFile-Methode einer Stringlist benutzen. ;)


ConditionZero - Mo 25.12.06 17:12

öhm wäre ganz doll nett wenn du mir en konkretes beispiel zu FileStream geben kannst, ich blick die methode nicht so ganz :)


jaenicke - Mo 25.12.06 17:22

Du kannst zum Beispiel eine TStringList benutzen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  tmp: TStringList;
begin
  tmp := TStringList.Create;
  tmp.Add(edtDeinEdit.Text);
  tmp.Add(edtNochEinEdit.Text);
  tmp.SaveToFile(ExtractFilePath(ParamStr(0)) + '\test.txt');
  tmp.Free;
end;

Ein FileStream ist für Strings dann doch eher ungeeignet. (Es sei denn man nimmt einen ShortString mit einer festen Länge bis 255 Zeichen natürlich.)


ConditionZero - Mo 25.12.06 17:45

ok es klappt bis auf die tatsache das, wenn ich

Delphi-Quelltext
1:
  tmp.SaveToFile(ExtractFilePath(ParamStr(0)) + TopicEdit.Text + '.txt');                    

mache, dann steht in der erstellten datei in der zeile 1 und 2 auch das topic...


jaenicke - Mo 25.12.06 18:00

Hmm??
Mit Add fügst du in die Liste der Strings welche hinzu. Zum Beispiel eben in meinem Beispiel nacheinander den Inhalt der Edit-Felder...


Matthias-K - Mo 25.12.06 18:01

dann hast du das in der stringliste auch noch drin!

nur was in der stringliste steht, wird dann auch eingetragen. allerdings finde ich deine lösung, das in dateien zu speichern, etwas schlecht! würde nicht eine db besser sein?

damit entgehst du auch dem totalen dateien crash, wenn du irgendwann mal 1000 fragen hast.

mfg matthias


ConditionZero - Mo 25.12.06 18:02

db?

//Edit: Ah jetzt LoL... naja da hab ich noch weniger Ahnung ;-)


jaenicke - Mo 25.12.06 18:06

Das ist aber auch nicht unbedingt schwierig, es gibt da gute Freeware-Units dazu...

Bei denen musst du nicht viel über DBs wissen. Nur was eine DB eigentlich ist ;-) und ein bisschen mehr.


ConditionZero - Mo 25.12.06 18:13

ja aber ich denke fürs erste reicht die 0815-Version
Da gehts nämlich noch weiter bei meiner "Problemsammlung" ^^

Jetzt soll das Programm ja so funktionieren, dass für jedes neue Thema eine neue .txt datei angelegt werden soll, muss ich dann für jedes Thema eine neue StringListe machen, wenn ja, ein array of StringLists (wenns sowas gibt...) also ein dynamisches hm ich weiß nicht wie ich des jz alles erkläre soll...
man kann leicht nachvollziehen was ich will wenn man folgt vorgeht:

Neues Projekt in Delphi
Alt+F12 drücken.
das einfügen:

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:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
object NewQuestion: TNewQuestion
  Left = 344
  Top = 502
  AutoScroll = False
  BorderIcons = [biSystemMenu, biMinimize]
  Caption = 'Neue Frage....'
  ClientHeight = 266
  ClientWidth = 476
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 0
    Top = 0
    Width = 123
    Height = 13
    Caption = 'Titel des Thema eingeben'
  end
  object Label2: TLabel
    Left = 0
    Top = 80
    Width = 106
    Height = 13
    Caption = 'Neue Frage eingeben:'
  end
  object Label3: TLabel
    Left = 224
    Top = 80
    Width = 148
    Height = 13
    Caption = 'Antwort für die Frage eingeben:'
  end
  object TopicEdit: TEdit
    Left = 0
    Top = 24
    Width = 321
    Height = 21
    TabOrder = 0
    Text = 'Thementitel'
    OnClick = TopicEditClick
  end
  object ShowTopicsBtn: TButton
    Left = 368
    Top = 8
    Width = 57
    Height = 25
    Caption = '---->'
    TabOrder = 1
    OnClick = ShowTopicsBtnClick
  end
  object QuestionMemo: TMemo
    Left = 0
    Top = 96
    Width = 185
    Height = 89
    Lines.Strings = (
      'Frage')
    TabOrder = 2
  end
  object AnswerMemo: TMemo
    Left = 224
    Top = 96
    Width = 185
    Height = 89
    Lines.Strings = (
      'Antwort')
    TabOrder = 3
  end
  object OKBtn: TButton
    Left = 272
    Top = 224
    Width = 75
    Height = 25
    Caption = 'Übernehmen'
    TabOrder = 4
    OnClick = OKBtnClick
  end
  object CancelBtn: TButton
    Left = 368
    Top = 224
    Width = 75
    Height = 25
    Caption = 'Abbrechen'
    TabOrder = 5
    OnClick = CancelBtnClick
  end
  object TopicsMemo: TMemo
    Left = 480
    Top = 16
    Width = 185
    Height = 233
    TabOrder = 6
  end
  object UnShowTopicBtn: TButton
    Left = 368
    Top = 8
    Width = 57
    Height = 25
    Caption = '<----'
    TabOrder = 7
    Visible = False
    OnClick = UnShowTopicBtnClick
  end
end


dann den quellcode mit diesem ersetzen:


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:
82:
83:
84:
85:
86:
87:
88:
unit Unit2;

interface

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

type
  TNewQuestion = class(TForm)
    TopicEdit: TEdit;
    Label1: TLabel;
    ShowTopicsBtn: TButton;
    Label2: TLabel;
    QuestionMemo: TMemo;
    Label3: TLabel;
    AnswerMemo: TMemo;
    OKBtn: TButton;
    CancelBtn: TButton;
    TopicsMemo: TMemo;
    UnShowTopicBtn: TButton;
    procedure ShowTopicsBtnClick(Sender: TObject);
    procedure UnShowTopicBtnClick(Sender: TObject);
    procedure CancelBtnClick(Sender: TObject);
    procedure OKBtnClick(Sender: TObject);
    procedure TopicEditClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  NewQuestion: TNewQuestion;

implementation

{$R *.dfm}

procedure TNewQuestion.ShowTopicsBtnClick(Sender: TObject);
begin
if NewQuestion.Width = 484 then
  begin
  NewQuestion.Width:= 680;
  ShowTopicsBtn.Caption:= '<----';
  ShowTopicsBtn.Visible:= false;
  UnShowTopicBtn.Visible:= true;
  end;


end;


procedure TNewQuestion.UnShowTopicBtnClick(Sender: TObject);
begin
if NewQuestion.Width = 680 then
  begin
  NewQuestion.Width:= 484;
  ShowTopicsBtn.Caption:= '---->';
  UnShowTopicBtn.Visible:= false;
    ShowTopicsBtn.Visible:= true;;
  end;

end;

procedure TNewQuestion.CancelBtnClick(Sender: TObject);
begin
NewQuestion.Visible:= false;
end;

procedure TNewQuestion.OKBtnClick(Sender: TObject);
var
  tmp: TStringList;
begin
  tmp := TStringList.Create;
  tmp.SaveToFile(ExtractFilePath(ParamStr(0)) + TopicEdit.Text + '.txt');
  tmp.Free;
end;

procedure TNewQuestion.TopicEditClick(Sender: TObject);
begin
if TopicEdit.Text = 'Thementitel' then
  begin
  TopicEdit.Text:= Trim('');
  end;
end;

end.


und dann kann man sich genau mein problem anschaun


Matthias-K - Mo 25.12.06 18:52

also,

das trim is unsinnig.

desweiteren, die stringliste wird ja ge'free't.

also wird nicht für alles einen neue stringlist angelegt, sindern nur jedesmal eine, die dann wieder gelöscht wird!

ich seh da kein problem.

wenn du magst, schreib ich dir mal ein beispielprogramm, wie ich das machen würde! ganz einfach, mit standart kompos aus delphi 5! oder 7, wie du auch magst.

pn an mich, inklusive 1-2 tage ruhepause.

mfg matthias


Blackheart666 - Mo 25.12.06 19:35

Hast Du Dir schon mal Ini Dateien angeschaut, sind sehr einfach aufgebaut und wenns nur erstmal 0815 sein soll und keine DB.

[Mathe]
Frage=
Antwort=

[Physik]
Frage=
Antwort=


hansa - Mo 25.12.06 19:42

Genau wie Blackheart es sagt siehts aus. Wäre nicht Weihnachten, dann hätte ich es schon selber geschrieben. Du suchst nach dem INI-Eintrag mit einem bestimmten Wert. Ist der falsch, dann wird der Standard-Wert zurückgeliefert und zwar in diesem Fall "falsche Antwort". :lol:


ConditionZero - Di 26.12.06 01:27

user profile iconBlackheart666 hat folgendes geschrieben:
Hast Du Dir schon mal Ini Dateien angeschaut,


Nein, kann ich nichts mit anfangen mit Ini...


hansa - Di 26.12.06 01:32

Seit Blackhearts Antwort und meinem Kommentar sind ziemlich genau 6 St. vergangen. Das dürfte ausreichen, Delphi zu starten und <F1> zu drücken. 8)


Blackheart666 - Di 26.12.06 10:17

Hier wird das sehr gut erklärt und im DF findet man auch massig zu Ini.
http://www.kuknet.de/tutorial1.pdf