Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Lange Strings im Record (https://www.delphipraxis.net/131283-lange-strings-im-record.html)

alzaimar 22. Mär 2009 16:59

Re: Lange Strings im Record
 
Bei langen Strings kannst Du die Daten nicht in einer typisierten Datei speichern. Das Wesen der typisierten Datei ist ja, das sie aus Datensätzen konstanter Größe besteht. Das wäre hier mit den dynamischen und (fast) beliebig langen Strings nicht mehr gegeben.

Wenn Du deine langen Strings auf ein 'Array [0..X] Of Char' beschränkst, wird es funktionieren (oder ein Array [..x] Of String[255]), sonst musst du dir etwas anderes ausdenken.

Vielleicht solltest Du dich mit Datenbanken oder alternativen Datenformaten beschäftigen. Hier würde eine klitzekleine Datenbank reichen, für die nur rudimentäre Kenntnisse erforderlich sind. Falls Du ein Office-Paket dein Eigen nennst, kannst du es mit Access versuchen. Das ist im Einzelplatzbetrieb ausreichend robust. Vorteil: Nix runterladen, nix installieren, wenig lernen.

Noch einfacher wäre das TClientDataset, das es erlaubt, eine Tabelle in einer Textdatei zu speichern/laden. Ich bin mir jedoch nicht sicher, ob Du das in deinem Delphi6Prof hast.

Eine weitere Möglichkeit wäre eine TkbMemTable, das ist ein Dataset, das komplett im Speicher liegt, sich aber auch in eine Datei speichern bzw. aus ihr laden lässt. Eine TkbMemTable-Komponente findest Du hier. Die Standard-Version ist wohl kostenlos.

Einige sehr interessante Möglichkeiten habe ich bei www.Torry.net gefunden. Ihnen Allen ist gemein, das sie Dir die Problematik des Abspeicherns abnehmen.

Wenn Du unbedingt bei deinem Record-Konzept und typisierten Dateien bleiben willst, solltest Du das Lesen und Schreiben eines Datensatzes als Record-Methode implementieren und dort festlegen, wie Du mit langen Strings umgehst. Eine Möglichkeit wäre doch, die langen Texte in einer zweiten Datei zu speichern und im Record nur die Verweise (Index oder ID) des Strings.

Ich würde die TDataset-Variante ins Auge fassen, sofern die Komponente BLOBS (Memo-Felddatentyp) unterstützt.

oldmann 22. Mär 2009 18:26

Re: Lange Strings im Record
 
Hallo alzaimar,

danke für Deine ausführliche Antwort.
Du hast viele Möglichkeiten aufgezählt die aber alle irgendwo einen Haken haben.
Datenbank kann ich überhaupt nicht und ich glaube das ich das auf meine alten Tage wohl auch nicht mehr lerne.
Komponenten z. B. von Torry sind auch problematisch da ich kein Englisch kann.
Da Du ja auch sagst das z.B. ein 'Array[1..1024] of AnsiChar' in einer typisierten Datei gehen würde brauchte ich nur noch jemanden der mir das möglichst an einem Beispiel erklären kann.
Also:
Wie speichere ich ein solches Array in meiner typisierten Datei?
Wie lesen ich das Array wieder aus der Datei aus und zeige es in einem Memo an?

Das wird doch wohl jemand von Euch wissen.
Ich hoffe es jedenfalls.

Mit freundlichen Grüssen,
E.Werner

Satty67 22. Mär 2009 18:54

Re: Lange Strings im Record
 
Du speicherst doch schon die ganze Zeit Deine Record's oder hab' ich das falsch verstanden.

Hier Dein eigenes Beispiel für READ:
Delphi-Quellcode:
assignfile(hrdat,lpf+'Datei.dat');
     reset(hrdat);
     while not eof (hrdat) do
     begin
       read(hrdat,daten);        
       StringGrid1.cells[0,reihe]:=daten.gegenstand;
       StringGrid1.cells[1,reihe]:=daten.raum;
       ….usw.
     end;
     closefile(hrdat);
Du tauscht nur ein Element in Deinem Record aus, so wie schon beschrieben:
Delphi-Quellcode:
// alte Version
type
   Dateien=record
   Gegenstand,Raum,bemerk:string[25];
   preis:double;
   Anzahl:Integer;
   gekauft_am:string[10];
   identnr,bild:String[15];
   bemerkung:String[255];
end;
// neue Version
type
   Dateien=record
   Gegenstand,Raum,bemerk:string[25];
   preis:double;
   Anzahl:Integer;
   gekauft_am:string[10];
   identnr,bild:String[15];
   bemerkung: array[1..1024] of AnsiChar;
end;
Jetzt nicht aufhören zu lesen, hier folgt noch eine wichtige Informationen ;)

Dein Record ist jetzt größer, also passen die Daten aus der alten Datei nicht mehr! Wenn es noch keine wichtigen Daten gab, einfach eine neue Datei anlegen. Gibt es in der alten Datei schon wichtige Daten, muss die "konvertiert" werden.

Mit dem alten Record wie gewohnt einlesen... die Daten dem neuen Record zuweisen und in einer neuen Datei mit anderem Namen speichern (das mit allen Records machen).

oldmann 22. Mär 2009 20:38

Re: Lange Strings im Record
 
Hallo Satty67,

danke für Deine Antwort.
So wie Du es geschrieben hast hatte ich meinen Record schon geändert.
Da noch keine Daten vorhanden waren, war das auch kein Problem.
Wie schon weiter vorn schrieb, taucht das Problem beim zuweisen der von Anwender eingegebenen Daten auf.
Wenn der Anwender seinen Text in die Memo schreibt und ich diesen Text zum speichern der Variable 'Datei.bemerkung:=Memo1.Text' zuweise dann kommt eine Fehlermeldung 'Inkompatible Typen Array und TCaption'.
Das heisst, dass ich nicht so einfach dem Array 'Datei.bemerkung den Text aus Memo1 zuweisen kann.
Deshalb meine Fragen an die Experten, die ich übrigends schon drei mal hier gestellt habe, aber keiner beantwortet sie:
Wie weise ich dem Array 'Datei.bemerkung den Text aus Memo1 zu?
Wie speichere ich ein solches Array in meiner typisierten Datei?
Wie lesen ich das Array wieder aus der Datei aus und zeige es in einem Memo an?


Es wird doch sicher Experten geben die mir hier weiterhelfen können.
Oder sollte ich mich hier irren.
Ich wäre Euch für ein paar Beispiele, die auch ich verstehen kann, dankbar.

Gruss Oldmann

Satty67 22. Mär 2009 20:49

Re: Lange Strings im Record
 
Ich lese halt immer wieder: Wie speichere ich ein solches Array in meiner typisierten Datei?

Die Frage: Wie weise ich dem Array 'Datei.bemerkung den Text aus Memo1 zu? lese ich jetzt zum ersten mal... da hab' ich wohl nicht aufgepasst.

alzaimar 22. Mär 2009 21:06

Re: Lange Strings im Record
 
Delphi-Quellcode:
Type
  TDaten = Record
    Irgendwas : integer;
    LangerString : array [0..1023] Of Char; // oder länger
  End;


Var
  Datei : File Of TDaten;
  sHilfsString : String;

...
// Laden
  Read (Datei, Daten);
// Schreiben
  Write (Datei, Daten);

// in Memo reinpacken
  Memo1.Lines.Add (Daten.LangerString);

// aus Memo lesen
  StrLCopy (@Daten.LangerString, PChar (Memo1.Lines.Text), SizeOf (Daten.LangerString));

oldmann 23. Mär 2009 12:26

Re: Lange Strings im Record
 
Hallo alzaimar,

danke für Deine Antwort.
Ich bin begeistert, es klappt.
Eine Frage habe ich noch. was bedeutet das T bei TDaten = Record?
Ist vielleicht ne dumme Frage, aber ich weiss es nicht.
Ich möchte mich bei Dir und natürlich auch bei allen anderen die sich die Mühe gemacht haben auf meine laienhaften Fragen zu antworten, ganz herzlich bedanken.

Mit freundlichen Grüssen,
Oldmann :hi:

Cyf 23. Mär 2009 12:38

Re: Lange Strings im Record
 
Das vorgestellt T bei Records, Klassen und Enums ist eine Konvention, um diese Typen leichter zu erkennen.

oldmann 23. Mär 2009 12:48

Re: Lange Strings im Record
 
Hallo Cyf,

danke für Deine Antwort.

Gruss Oldmann


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:34 Uhr.
Seite 3 von 3     123   

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