Autor Beitrag
gubbl
Hält's aus hier
Beiträge: 15



BeitragVerfasst: So 26.02.06 21:31 
Hi,

ich sitze jetzt schon den ganzen Tag an einem Problem, lese mich durch sämtliche Foren aber werde trotzdem nicht schlauer.
Es geht um folgendes:

Ich habe ein Programm zur Adressenverwaltung geschrieben. Der Benutzer kann also zB Name, Strasse, Wohnort usw angeben. Diese Daten soll der Benutzer jetzt speichern, wieder laden, bearbeiten und noch mehr Adressen speichern können.
Das Problem ist nur, dass der Benutzer bei allen Eingaben die Möglichkeit haben soll, mehr als 255 Elemente zu speichern. Er soll also zB einen Strassennamen speichern können, der 500 oder 600 Elemente lang ist.

Zuerst wollte ich das ganze mit einer typisierten Datei lösen und habe mir dieses Tutorial hier durchgelesen:
www.dsdt.info/tutorials/typdateien/
Irgendwann habe ich dann aber gemerkt, dass man auf diese Weise nur Strings mit einer Länge von höchstens 255 Elementen speichern kann. Ich will aber wie gesagt mehr Elemente speichern können, jenseits der 1000.


Ich habe jetzt den ganzen Tag damit verbracht eine Lösung für das Problem zu finden, allerdings habe ich die meisten Lösungsansätze nicht verstanden (habe vor ein paar Wochen erst mit Delphi angefangen). ZB habe ich ziemlich oft gelesen, dass man dieses Problem mit TStream umgehen kann, aber die Lösungsansätze haben mir nie ausgereicht um etwas damit anfangen zu können.


Was schlagt ihr mir vor?

MfG
gubbl
DaRkFiRe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 526

WinXP Home & Professional
C, C++, Delphi
BeitragVerfasst: So 26.02.06 21:38 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
WFS:TFileStream;
S:STRING;
...
WFS := TFileStream.Create('anyfile.dat',fmCreate);
WFS.Write(S[1],LENGTH(S));
WFS.Free();
...


Wenn Du einen String so speichern willst, kein Problem.
Soll der String dynamisch lang sein!?
Dann sollte man vorher ein Word oder Dword speichern, wie lang der String ist, um später die genaue Ziellänge und Puffergröße für das Auslesen bereit zu legen.

_________________
Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
gubbl Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 27.02.06 12:01 
Hi,

ich checks nicht...
Gibts nicht irgendwo ein Tutorial zum Speichern und Laden mit TFileStream?

Ich bekomme es noch nicht mal hin einen einfachen String mit TFileStream zu speichern und anschließend wieder zu laden.
Bei mir schaut das ganze so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);
var
  stream: TFileStream;
  text: string;
begin
  text:= Edit1.Text;
  stream:= TFileStream.Create('daten.dat', fmCreate);
  stream.Write(text, length(text));
  stream.Free;

end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button2Click(Sender: TObject);
var
  stream: TFileStream;
  text: string;
begin
  stream:= TFileStream.Create('daten.dat', fmCreate);
  stream.Read(text, 1000); //Was soll hier als 2. Parameter hin?
  Edit1.Text:= text;
  stream.Free;


end;



Bei meinem Programm besteht eine Adresse ja aus einem Record, nämlich Strasse, Name, PLZ usw. Wie bekomme ich das gespeichert?


Schonmal Danke im Voraus
gubbl
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 27.02.06 12:09 
Moin!

Hast du denn sehr viele Adressen? Wenn nicht (falls es sich also eher um ein "Lern-Programm" handelt :wink:), dann schau dir doch mal INI-Dateien an. Damit sollte sich das auch schön elegant lösen lassen.

cu
Narses
gubbl Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 27.02.06 12:33 
Also der Anwender soll so viele Adressen speichern können wie er will. Im Prinzip soll das Programm ein Adressenverwalter sein. Man soll also eine Adresse eingeben und speichern können. Wenn man will kann man danach noch eine eingeben und speichern und noch eine usw. Bei Bedarf soll der Anwender dann eine Adresse bearbeiten können (zb bei einem Umzug) oder löschen können.

INI's hatte ich mir auch schon mal angeschaut, aber da war das Problem dass man nichts löschen kann bzw das bei INI's extrem umständlich ist.



MfG
castro
DaRkFiRe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 526

WinXP Home & Professional
C, C++, Delphi
BeitragVerfasst: Mo 27.02.06 12:36 
Wie ich bereits in meinem Source schrieb: FS.Write(text[1],length(text))

Du darfst das "[1]" nicht vergessen - und dann immer nur soweit speichern, wie der String lang ist (oder weniger), sonst Zugriffsverletzung!

_________________
Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
gubbl Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 27.02.06 12:58 
Oops, mein Fehler, sorry.

Aber wie lade ich das Ganze jetzt wieder?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button2Click(Sender: TObject);
var
  stream: TFileStream;
  text: string;
begin
  stream:= TFileStream.Create('daten.dat', fmCreate);
  stream.Read(text, 100);
  Edit1.Text:= text;
  stream.Free();


end;

funktioniert wie gesagt nicht, er gibts mir nur ein leeres Editfeld aus.


MfG
castro
gubbl Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 27.02.06 16:48 
Habe mich jetzt entschieden das Problem über Listboxen und mehrere Dateien zu lösen.
Die Frage hat sich somit erübrigt :)
Tastaro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: Mo 27.02.06 17:35 
Ich verrate dir aber trotzdem mal die Lösung:

fmCreate öffnet die Datei nicht zum lesen. Deswegen hätte es so vielleicht besser funktioniert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var  
  stream: TFileStream;  
  text: string;  
begin  
  stream:= TFileStream.Create('daten.dat', fmOpenRead);  
  stream.Read(text, 100);  
  Edit1.Text:= text;  
  stream.Free();  
end;


Achja: Hier im Thread wurden schon mal ini-files erwähnt. Für deine Anwendung lohnt es sich wirklich sich die mal anzugucken.

Beste Grüße
Tastaro