![]() |
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 ![]() Einige sehr interessante Möglichkeiten habe ich bei ![]() 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. |
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 |
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:
Du tauscht nur ein Element in Deinem Record aus, so wie schon beschrieben:
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);
Delphi-Quellcode:
Jetzt nicht aufhören zu lesen, hier folgt noch eine wichtige Informationen ;)
// 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; 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). |
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 |
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. |
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)); |
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: |
Re: Lange Strings im Record
Das vorgestellt T bei Records, Klassen und Enums ist eine Konvention, um diese Typen leichter zu erkennen.
|
Re: Lange Strings im Record
Hallo Cyf,
danke für Deine Antwort. Gruss Oldmann |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz