Benutzung von SaveToFile();

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Inventio
Beiträge: 39
Registriert: So 21. Mär 2010, 14:00

Benutzung von SaveToFile();

Beitrag von Inventio »

Servus,
bevor ich diesen thread eröffnet habe, habe ich eine gute stunde im Internet nach einer Antwort für meine Frage gesucht.
Hier ist sie also :
Wie benutze ich SaveToFile bzw. LoadToFile?
Folgenedes Problem:
Ich will ein sehr einfaches chat programm schreiben (GUI basiert).
Das Programm soll 1 Memo Feld,1Edit Feld und 1 Button haben. Das Edit Feld zum verfassen der Nachrichten und das Memo Feld zum Lesen des Chatprotokolls.
Es soll folgendermaßen funktionieren:
Man gibt etwas in das Edit Feld ein, klickt auf den Button "Senden" und der eingegebene Text wird in einer datei namens "Chat.txt" gespeichert.
Das Memofeld soll diese datei ("Chat.txt") anzeigen. Das Memo Feld soll sich alle x Milisekunden aktualisieren.
Ich schreibe also bei "Procedure Button1.click" "Memo1.SaveToFile(chat.txt);", dabei wird aber der Error
"Error: Indentifier idents no member" ausgegeben". Daher meine oben gestellte Frage.

Mfg Inventio

Ps. Ich habe noch 2 weitere Fragen, welche aber erstmal nicht so wichtig sind:
Wie kann ich verhindern, das der user des Programm etwas in das Memo Feld tippen kann?
Wenn ich die Funciton SaveToFile benutze, wird dann der Inhalt des Edit Felds immer in eine neue Zeile geschrieben?

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Benutzung von SaveToFile();

Beitrag von Socke »

Willkommen im Forum!
Inventio hat geschrieben:Man gibt etwas in das Edit Feld ein, klickt auf den Button "Senden" und der eingegebene Text wird in einer datei namens "Chat.txt" gespeichert.
Das Memofeld soll diese datei ("Chat.txt") anzeigen. Das Memo Feld soll sich alle x Milisekunden aktualisieren.
Ich schreibe also bei "Procedure Button1.click" "Memo1.SaveToFile(chat.txt);", dabei wird aber der Error
"Error: Indentifier idents no member" ausgegeben".


Das Chatlog immer aus einer Datei zu laden ist nicht sehr effizient. Kommen die Texte der Chatpartner über andere Wege (TCP/IP, Bibliothek, etc.) in dein Programm, sollte das Chatlog nur noch als wirkliches Log verwendet werden. Schreiben aber mehrere Programme in eine Datei um zu kommunizieren sollte das auch funktionieren.

Die Funktionen Load/SaveFrom/ToFile() gehören nicht zu TMemo! Das sagt auch der Fehler aus. Stattdessen musst du Memo1.Lines.LoadFromFile() oder Memo1.Lines.SaveToFile() aufrufen (Klasse TStrings).
Damit das Memo alle x Sekunden neu geladen wird, musst du einen Timer verwenden (Tab: System), als Interval die gewünschte Zeit (in Millisekunden) eintragen und OnTimer-Event dann Memo1.Lines.LoadFromFile() aufrufen.

Inventio hat geschrieben:Wie kann ich verhindern, das der user des Programm etwas in das Memo Feld tippen kann?

Verwende ein TListBox oder setze die Eigenschaft ReadOnly auf True.

Inventio hat geschrieben:Wenn ich die Funciton SaveToFile benutze, wird dann der Inhalt des Edit Felds immer in eine neue Zeile geschrieben?

Jede Zeile im Memo wird mit einem Zeilenende (unter Windows ist das #13#10) abgeschlossen: also ja. Ein Button Click wäre also:

Code: Alles auswählen

procedure TFrm.OnBtnClick(Sender: TObject);
begin
Memo1.Lines.Add(Edit1.Text);
Memo1.Ĺines.SaveToFile('C:/chatlog.txt');
end;

Wie bereits gesagt ist das nicht die beste Methode für einen Chatlog (besonders nicht, wenn mehrere Programme gleichzeitig auf die Datei zugreifen). Für deine Zwecke sollte das aber vorerst ausreichen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Inventio
Beiträge: 39
Registriert: So 21. Mär 2010, 14:00

Re: Benutzung von SaveToFile();

Beitrag von Inventio »

WOW danke.
Ich habe noch nie eine so gute und genaue Antwort bekommen (ungelogen!).
Bis ich mit TCP/IP arbeite brauche ich noch ein bisschen^^.
Bis dahin verusche ich das so wie ich mir das gedacht habe.

Mfg Inventio

//Edit
So ich habe das alles gemacht so siehts aus :

Code: Alles auswählen

unit form_ChatGUI;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil,FileCtrl, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ExtCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Memo1: TMemo;
    Memo2: TMemo;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Memo2Change(Sender: TObject);
    procedure Memo3Change(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
  start:integer;
  Name,leer:string[128];
 
implementation
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
var i :integer;
begin
  leer:=' ';
  Edit1.clear;
  Memo1.clear;
  Memo2.clear;
  if (start=0)
  then begin
  name:=InputBox('Willkommen','Bitte gebe deinen Namen ein','');
  end;
 
end;
 
procedure TForm1.Memo2Change(Sender: TObject);
begin
 
end;
 
procedure TForm1.Memo3Change(Sender: TObject);
begin
 
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Memo1.Lines.LoadFromFile('chatlog.txt');
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo2.Lines.Add(name);
  Memo2.Lines.Add(Edit1.Text);
  Memo2.Lines.Add(leer);
  Memo2.Lines.SaveToFile('chatlog.txt');
  Edit1.clear;
end;
 
initialization
  {$I form_ChatGUI.lrs}
 
end.

Wenn nur ich in die Datei schreibe ist alles in Ordnung.
Wenn aber ein 2. client dazukommt und etwas schreibt, wird die letze von meinen Nachrichten gelöscht.
Was ist mein Fehler ?

Mfg Inventio-

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Benutzung von SaveToFile();

Beitrag von Socke »

Memo1.Lines.SaveToFile() speichert immer den gesamten Inhalt des Memos. Der zweite Client muss also die Datei zuerst laden, dann eine Zeile zum Memo hinzufügen und dann speichern.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Inventio
Beiträge: 39
Registriert: So 21. Mär 2010, 14:00

Re: Benutzung von SaveToFile();

Beitrag von Inventio »

Ich verstehe nicht was du meinst.
ICh habe keine Memo1.Lines.SaveToFile(), nur ein Memo2...
Was das Memo1 macht, ist doch ,dass es den inhalt der chatlog.txt darstellt.
Mit Memo2.Lines.SaveToFile() wird der Textdatei doch eine Zeile hinzugefügt.
Deswegen vestehe ich den Error nicht.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Benutzung von SaveToFile();

Beitrag von Socke »

Ich war davon ausgegangen, dass Memo1 sowohl die Datei ausliest als auch wieder abspeichert.
Bei dir funktioniert das ein wenig anders.
Solange nur Programm 1 die Datei bearbeitet, sind in Memo1 und Memo2 die gleichen Daten enthalten. Sobald Programm 2 hinzukommt, liest dessen Memo1 den Inhalt der chatlog.txt und zeigt ihn an. Programm 2 Memo2 schreibt jetzt in die Datei. Da es die Daten vorher nicht geladen hat, sind sie nicht vorhanden und alles wird überschrieben.

Lösungen wären, dass nur ein Memo alles erledigt oder du dich in die Tiefen des Dateizugriffes einarbeitest. Bei letzterem hast du mehr Möglichkeiten zu kontrollieren, was mit den Dateien passiert.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

COMMANDER86
Beiträge: 20
Registriert: Di 23. Feb 2010, 01:11
OS, Lazarus, FPC: Win XP, Vista Busi.; L 0.9.28.2; FPC 2.2.4
CPU-Target: 32Bit

Re: Benutzung von SaveToFile();

Beitrag von COMMANDER86 »

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo2.Lines.Add(name);
  Memo2.Lines.Add(Edit1.Text);
  Memo2.Lines.Add(leer);
  Memo2.Lines.SaveToFile('chatlog.txt');
  Edit1.clear;
end;

Was ich nicht verstehe: Du lädst die Chatlog-Datei in Memo1... dann schreibst Du, ich vermute den Beitrag des Users, in Memo2. Dann speicherst Du Memo2. Eigentlich dürfte immer nur der letzte Beitrag angezeigt werden. :shock: [EDIT: Es sei denn, Memo2 wird nicht neu geladen... s. u.]

Wenn ich das richtig verstanden habe, müsste folgende Zeile...

Code: Alles auswählen

Memo2.Lines.LoadFromFile('chatlog.txt');

...am Anfang der Prozedur eigentlich das Problemchen lösen... das das nicht wirklich geeignet ist, für einen Massenchat, wurde ja schon erwähnt. ;)

PS: Wofür ist eigentlich Memo1? Nur für die Anzeige?
"Da programmierste ohne Fehler, alles funktioniert und dann benutzt irgendein User Vista."

Inventio
Beiträge: 39
Registriert: So 21. Mär 2010, 14:00

Re: Benutzung von SaveToFile();

Beitrag von Inventio »

Ja genau so habe ich mir das eigentlich gedacht...
Ein Memofeld nur zum Anzeigen, das andere zum in die Datei speichern.
Danke für eure Hilfe

Antworten