Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Memo und typisierte Dateien (https://www.delphipraxis.net/143997-memo-und-typisierte-dateien.html)

Mysterio08 27. Nov 2009 15:38


Memo und typisierte Dateien
 
Guten Tag Programmierer!

Ich habe folgendes vor: Ich habe ein Formular entworfen, mit dem ein Benutzer Daten zu Notizen eingeben kann, z.B. Datum und Betreff. Natürlich auch die Notiz(en) selber, diese sollen in ein Memo eingegeben werden können. Nun sind all diese Daten Bestandteil eines Records, welches dann in einer typisierten Datei gespeichert werden kann. Jetzt gibt es aber Probleme mit den Notizen/Memo. Deklariere ich sie nur als String, also so
Delphi-Quellcode:
Text: String;
wird mir eine Fehlermeldung angezeigt, nämlich dass String-Literale nicht mehr als 255 Zeichen aufnehmen können. Es kann aber sehr gut sein, dass die Notiz mehr als 255 Zeichen beinhaltet.

Ich weiß gerade nicht so recht, wie ich damit umgehen soll, ihr seid doch bestimmt auch schonmal auf solch ein Problem gestoßen, oder?

mfg.

p80286 27. Nov 2009 15:43

Re: Memo und typisierte Dateien
 
Hallo Mysterio08,

das von Dir beschriebene Verhalten kenn ich nur bei Constanten-Deklarationen.
Wenn Du etwas mehr Sourcecode zeigst wird der Fehler vielleicht offensichtlicher.

Gruß
K-H

DeddyH 27. Nov 2009 15:44

Re: Memo und typisierte Dateien
 
Strings in Records sind immer so eine Sache. Die einfachste Möglichkeit wäre ShortString, aber der nützt Dir hier nichts (max. 255 Zeichen). Wenn Du String nimmst, speicherst Du nur den Zeiger, kommt also auch nicht in Frage. Bliebe noch die Möglichkeit, das Memo in eine separate Datei zu speichern und den Pfad dorthin im Record. Was auch noch klappen könnte, wäre ein Array[0..X] of Char, aber damit legst Du Dich wieder auf eine maximale Größe fest, außerdem wird u.U. der Record natürlich sehr groß. Das Geschmeidigste wäre daher IMO der Einsatz einer Datenbank, ist das eine Option?

Bernhard Geyer 27. Nov 2009 15:47

Re: Memo und typisierte Dateien
 
Wieso nimmst du nicht XML als speicherformat. Damit hast du dann keine Probleme falls weitere Elemente gespeichert werdne sollen oder du mal Unicode mit D2009 oder neuer willst.

Luckie 27. Nov 2009 15:52

Re: Memo und typisierte Dateien
 
String ist nur ein Zeiger auf einen Speicherbereich, wo die Zeichenkette steht. Wird der Datentyp in einem Record verwendet, macht Delphi anscheinend automatisch einen Shortstring daraus, da es keinen Sinn macht den Zeiger zu speichern. Ein Shortstring hat eine feste Größe von 255 Zeichen.

Du könntest alles nach einander in einem Stream speichern. dabei musst du aber die Größe der Felder und die Größe des Datensatzes mit abspeichern, damit du die Daten wieder trennen kannst.

Allerdings würde ich mir überlegen, ob man nicht besser XML-Dateien oder gar eine kleine Datenbank nutzt.

Mysterio08 27. Nov 2009 15:52

Re: Memo und typisierte Dateien
 
Danke schonmal für die Antworten.
Nein, eine Datenbank ist keine Lösung, aus schulischen Gründen bin ich "gezwungen", eine typisierte Datei zu erstellen.
Habe ich das denn richtig verstanden, es ist möglich 2 von diesen Dateien zu erstellen, eine für das Memo und eine für den Rest der Daten?
Eine Textdatei möchte ich nicht verwenden, denn es soll nur möglich sein, im Programm selbst Änderungen vorzunehmen.
Aber das mit dem
Delphi-Quellcode:
Text: Array[1..x] of Char
wäre noch eine Lösung. Kann das Array mehr als 255 Zeichen aufnehmen? Wenn ja, wäre dies eine in Frage kommende Option, denn ich kann Text als dynamisches Array deklarieren und später die Zeichenanzahl des Memos feststellen und das Array dimensionieren?
Und noch etwas ist mir in den Sinn gekommen: die TSTringList, was ist damit?

Edit/
Mit XML habe ich noch nicht gearbeitet, ich würde, wie gesagt, schon gerne erstmal mit der typisierten Datei arbeiten

Mithrandir 27. Nov 2009 15:54

Re: Memo und typisierte Dateien
 
Zitat:

Zitat von Luckie
Allerdings würde ich mir überlegen, ob man nicht besser XML-Dateien oder gar eine kleine Datenbank nutzt.

Man muss es im Prinzip für sich selbst entscheiden, ob nun XML oder ne "richtige" DB. Aber bei so einem Notizzettel würde ich schon n DBMS einsetzen, allerdings ein kleines, wie SQLite. Dazu gibts hier auch die passende Library.

Luckie 27. Nov 2009 15:57

Re: Memo und typisierte Dateien
 
aber anscheined handelt es sich um eine Schulaufgabe und es sollen typisierte Dateien verwendet werden.

DeddyH 27. Nov 2009 16:05

Re: Memo und typisierte Dateien
 
Dann wäre wie gesagt ein array of char eine Möglichkeit.

Mithrandir 27. Nov 2009 16:06

Re: Memo und typisierte Dateien
 
Zitat:

Zitat von Luckie
aber anscheined handelt es sich um eine Schulaufgabe und es sollen typisierte Dateien verwendet werden.

Der TE zeigt sich XML aber auch nicht abgeneigt. ;)

Mysterio08 27. Nov 2009 16:13

Re: Memo und typisierte Dateien
 
Mhm, also ich werde wohl eine sehr unelegante Methode verwenden, ich werde zwei Variablen für den Text deklarieren, bei können 255 Zeichen aufnehmen, dann bin ich schonmal bei mehr als 500 und dann werde ich die Zeichen in die erste und ggf. in die zweite Variable transportieren. Dann muss sich der Nutzer wohl mit 510 Zeichen zufrieden geben.
Ehrlich gesagt überzeugt mich die Alternative nicht....

DeddyH 27. Nov 2009 16:25

Re: Memo und typisierte Dateien
 
Delphi-Quellcode:
type
  TMyRec = record
    Inhalt: array[1..1024] of char;
  end;

procedure TFormTest.FormCreate(Sender: TObject);
var s: string;
    f: file of TMyRec;
    R: TMyRec;
begin
  FillChar(R,SizeOf(R),0);
  s := StringOfChar('a',Length(R.Inhalt));
  StrPCopy(@R.Inhalt,s);
  AssignFile(f,'C:\Test\Test.dat');
  {$I-}
  try
    Rewrite(f);
    write(f,R);
    CloseFile(f);
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
  {$I+}
end;
Hat bei mir einwandfrei funktioniert.

Mysterio08 28. Nov 2009 15:03

Re: Memo und typisierte Dateien
 
Ich wollte Deine Idee gerade umsetzen, DeddyH, aber ich weiß nicht so recht, an welcher Stelle ich den Inhalt des Memos einsetzen soll, denn wie ich gelesen habe, füllt StrOfChar immer nur mit dem gleichen Zeichen!?
Ich stehe gerade auf'm Schlauch

DeddyH 28. Nov 2009 15:05

Re: Memo und typisierte Dateien
 
Das war ja auch nur ein Test. Du müsstest statt
Delphi-Quellcode:
s := StringOfChar('a',Length(R.Inhalt));
Delphi-Quellcode:
s := Memo1.Text;
schreiben.

[edit] Oder sicherheitshalber besser
Delphi-Quellcode:
s := Copy(Memo1.Text, 1, Length(R.Inhalt));
[/edit]

Mysterio08 2. Dez 2009 15:25

Re: Memo und typisierte Dateien
 
Also, mir ist heute noch eine Alternative eingefallen, die evtl. klappen könnte: mit einer TStringList arbeiten. Der Compiler zeigt mir wegen der Variablendeklaration und des records keine Fehlermeldung an, allerdings habe ich es nur grob getestet. Ich werde das Ganze morgen mal ausführlicher testen.

DeddyH 2. Dez 2009 15:30

Re: Memo und typisierte Dateien
 
Du meinst eine TStringlist im Record? Da hättest Du aber wieder nur den Pointer gespeichert, der nützt Dir ja nichts.

Mysterio08 2. Dez 2009 18:09

Re: Memo und typisierte Dateien
 
Ja, stimmt. Sobald ich das Memo in eine Variable vom Typ TStringList speichern will, gibt es eine saftige Fehlermeldung - logisch...
Dann werde ich um deinen Lösungsvorschlag nicht herumkommen, DeddyH. Wobei ich damit kein Problem habe.

himitsu 2. Dez 2009 18:20

Re: Memo und typisierte Dateien
 
als Alternative: du nimmst einfach keine typisierte Datei :stupid:

- entweder du definiserst dir eine Binärdatei mit dynamischen "Feldern"
- oder du nimmst eine INI
- oder XML
- oder .... nja, gibt noch tausende andere Möglichkeiten

DeddyH 3. Dez 2009 08:07

Re: Memo und typisierte Dateien
 
Zitat:

Zitat von Mysterio08
..., aus schulischen Gründen bin ich "gezwungen", eine typisierte Datei zu erstellen.


himitsu 3. Dez 2009 09:48

Re: Memo und typisierte Dateien
 
Zitat:

Zitat von DeddyH
Zitat:

Zitat von Mysterio08
..., aus schulischen Gründen bin ich "gezwungen", eine typisierte Datei zu erstellen.


ups :oops:

nja, wenn man es genau nimmt, dann könnte man eine INI oder XML auch als File of Char ansehn :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz