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 Alternative zu Array of TStrings (https://www.delphipraxis.net/53049-alternative-zu-array-tstrings.html)

smudo 9. Sep 2005 09:04


Alternative zu Array of TStrings
 
Hallo zusammen :hi: ,

ich benutze im Moment ein Array of TStrings, um Strings tabellenartig und nicht visuell zu speichern.
Was muss es können:
  • Zugriff auf einzelne Zellen
  • beliebig viele Zeilen und Spalten verwalten
  • Änderung der Zeilen- und Spaltenzahl auch wenn schon Daten drinstehen
  • Sortierung der Zeilen

Was könnt ihr mir am dafür empfehlen und wovon sollte ich die Finger lassen?

Ich hab übrigens gestern schon mal eine ähnliche Frage dazu gestellt, auf welche bis jetzt keiner antworten konnte.
Frage von gestern

Vielen Dank

René

shmia 9. Sep 2005 09:46

Re: Alternative zu Array of TStrings
 
Wenn es darum geht, Daten tabellenartig im RAM zu speichern käme ein Memory Dataset in Frage.
Mit TJvMemoryData bist du da schon auch dem richtigen Wege.
Ich kenne TJvMemoryData nicht, da es aber sicher von TDataset abgeleitet ist, können folgende Operationen durchgeführt werden.
Delphi-Quellcode:
var
  ds : TDataSet;
begin
  ds := JvMemoryData1;
  ds.Open;   // Datenmenge öffnen

  ds.Insert; // Datensatz einfügen
  ds['Feld1'] := 'test1';
  ds['Feld2'] := 4711;
  ds.Post;   // Daten abschicken

  ds.first; // an Anfang
  while not ds.eof do
  begin
     ShowMessage(ds.FieldByName('Feld1').AsString);
     ds.next;
  end;
  ds.First;
  ds.Delete; // Datensatz löschen

RavenIV 9. Sep 2005 09:50

Re: Alternative zu Array of TStrings
 
ich würde dir eine TStringList ans Herz legen.
Diese Listen übernehmen die Verwaltung der Strings für dich und du hast viele Funktionen wie z.B.
- Strings hinzufügen
- strings entfernen
- sortieren
- in der liste verschieben
- Elemente der liste vertauschen
- Liste in File speichern und aus File lesen
- in Stream schieben
- Einträge suchen
- Einträge zählen
- usw.

Arrays und dyn.Arrays solltest du nur verwenden, wenn wenige Einträge im Array sind.

gruessle

smudo 9. Sep 2005 10:02

Re: Alternative zu Array of TStrings
 
Danke Andreas,

gibt es denn außer First, Next usw. auch die Möglichkeit, direkt auf einen bestimmten Datensatz zu springen?

René

shmia 9. Sep 2005 10:15

Re: Alternative zu Array of TStrings
 
Zitat:

Zitat von smudo
gibt es denn außer First, Next usw. auch die Möglichkeit, direkt auf einen bestimmten Datensatz zu springen?

Natürlich:
Delphi-Quellcode:
ds.Locate('Feld1', suchwert, []);
Du kannst übrigens ein TDatasource mit einem TDBGrid verbinden.
DataSource.Dataset := JvMemoryData1 und sogleich hast du einen vollwertigen Editor.

smudo 9. Sep 2005 10:39

Re: Alternative zu Array of TStrings
 
Also ist ein Keyfield (z.B. Field 0 für Index) unbedingt notwendig?
Eine direkte Adressierung (Record z, Field s) muss ich demzufolge selbst verwalten?

Trotzdem - hat mir schon ne Menge weitergeholfen, Danke!

smudo 9. Sep 2005 11:49

Re: Alternative zu Array of TStrings
 
Noch ein Problemchen :oops:

shmia hat die Insert-Routine im Quelltext beschrieben. Das funktioniert.
Komischerweise funktioniert Edit nicht. Alles was ich dabei ändere:
statt ds.Insert verwende ich ds.Edit
Lese ich diese Zelle aus, ist sie leer :freak:

shmia 9. Sep 2005 12:18

Re: Alternative zu Array of TStrings
 
Zitat:

Zitat von smudo
Also ist ein Keyfield (z.B. Field 0 für Index) unbedingt notwendig?
Eine direkte Adressierung (Record z, Field s) muss ich demzufolge selbst verwalten?

Nein, Locate funktioniert auf jedem Feld. Man darf sogar 2 oder mehr Felder und Suchwerte angeben.
Bei Memory-Datasets ist Locate sehr schnell.
Zitat:

Zitat von smudo
shmia hat die Insert-Routine im Quelltext beschrieben. Das funktioniert.
Komischerweise funktioniert Edit nicht. Alles was ich dabei ändere:
statt ds.Insert verwende ich ds.Edit
Lese ich diese Zelle aus, ist sie leer :freak:

Am Anfang ist die Tabelle leer; sie muss erst mit .Insert oder .Append (ist das Gleiche) gefüllt werden.
Mit dataset.IsEmpty kann abgefragt werden, ob die Tabelle leer ist.

smudo 9. Sep 2005 12:36

Re: Alternative zu Array of TStrings
 
Zitat:

Zitat von shmia
Am Anfang ist die Tabelle leer; sie muss erst mit .Insert oder .Append (ist das Gleiche) gefüllt werden.
Mit dataset.IsEmpty kann abgefragt werden, ob die Tabelle leer ist.

Ist schon klar. Ich fülle die Tabelle auch zuerst mindestens bis zur Zelle, welche editiert werden soll.
D.h. - wenn die Zelle außerhalb des Bereiches liegt, füge ich zuerst die fehlenden Spalten ein
Delphi-Quellcode:
ds.FieldDefs.Add(...automatischer Header...,ftString);
und anschließend die fehlenden Zeilen mit
Delphi-Quellcode:
ds.Append;
ds['id']:=ds.RecordCount;
ds.Post;
Soweit funktionierts auch. Im Anschluss möchte ich die entsprechende Zelle editieren:
Delphi-Quellcode:
ds.Locate('id',z,[]);
ds.Edit;
ds[...Header...]:=text;
ds.Post;
Oder muss ich beim Insert in jede Zelle etwas reinschreiben? :gruebel:

smudo 9. Sep 2005 12:55

Re: Alternative zu Array of TStrings
 
Habs gefunden :bouncing4:

statt ftString verwende ich jetzt ftVariant und schon gehts.
Kann mir das mal jemand erklären? :wall:
ftInteger macht übrigens auch kein Problem.

Danke fürs Helfen


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:20 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