AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Lange Strings im Record

Ein Thema von oldmann · begonnen am 22. Mär 2009 · letzter Beitrag vom 23. Mär 2009
Antwort Antwort
Seite 3 von 3     123   
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#21

Re: Lange Strings im Record

  Alt 22. Mär 2009, 16:59
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
oldmann

Registriert seit: 10. Okt 2008
Ort: Weyhe
138 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#22

Re: Lange Strings im Record

  Alt 22. Mär 2009, 18:26
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
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#23

Re: Lange Strings im Record

  Alt 22. Mär 2009, 18:54
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).
  Mit Zitat antworten Zitat
oldmann

Registriert seit: 10. Okt 2008
Ort: Weyhe
138 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#24

Re: Lange Strings im Record

  Alt 22. Mär 2009, 20:38
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
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#25

Re: Lange Strings im Record

  Alt 22. Mär 2009, 20:49
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.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#26

Re: Lange Strings im Record

  Alt 22. Mär 2009, 21:06
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));
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
oldmann

Registriert seit: 10. Okt 2008
Ort: Weyhe
138 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#27

Re: Lange Strings im Record

  Alt 23. Mär 2009, 12:26
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:
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#28

Re: Lange Strings im Record

  Alt 23. Mär 2009, 12:38
Das vorgestellt T bei Records, Klassen und Enums ist eine Konvention, um diese Typen leichter zu erkennen.
Man kann einen Barbier definieren als einen, der alle diejenigen rasiert, und nur diejenigen, die sich nicht selbst rasieren.
Rasiert sich der Barbier?
  Mit Zitat antworten Zitat
oldmann

Registriert seit: 10. Okt 2008
Ort: Weyhe
138 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#29

Re: Lange Strings im Record

  Alt 23. Mär 2009, 12:48
Hallo Cyf,

danke für Deine Antwort.

Gruss Oldmann
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:27 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