AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Tabellenzeilen in virtueller ListView darstellen???

Tabellenzeilen in virtueller ListView darstellen???

Ein Thema von Marco Steinebach · begonnen am 22. Feb 2021 · letzter Beitrag vom 1. Mär 2021
Antwort Antwort
Marco Steinebach

Registriert seit: 4. Aug 2006
481 Beiträge
 
Delphi 5 Enterprise
 
#1

Tabellenzeilen in virtueller ListView darstellen???

  Alt 22. Feb 2021, 20:19
Datenbank: Firebird • Version: 3.x • Zugriff über: ADO
Hallo zusammen,
Ich habe mich, mittels ADO, zu einer FireBird-DB verbunden.
Nun, träumt mir, dass ich die via Select-Anweisung ausgelesenen Datensätze, irgendwie, in einer ListView darstellen kann.
Soweit, so klar, einfach mit next bis zu EOF durchlaufen, und gut is.
Aber geht das auch mit einer Virtuellen Liste?
Und wenn ja, , wie?
Zumindest kann ich ja rausfinden, wieviele Elemente meine Query ausgespuckt hat...

Ach ja: DBGrid geht bei mir nicht, weil der Inhalt von meinem Screen-Reader nicht vernünftig angezeigt wird, und ich zum Editieren sowieso ein eigenes Dialogfeld mit lauter schönen, einzelnen, Eingabefeldern nehmen möchte.

Herzlich grüßt
Marco
Marco Steinebach
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
657 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Tabellenzeilen in virtueller ListView darstellen???

  Alt 22. Feb 2021, 21:05
Hallo Marco

bin jetzt nicht am PC, aber als Ansatz
wenn Virtuelle Liste, muss die Query offen bleiben.
Du brauchst auch etwas eindeutiges um vom Index der Listview auf die Query zugreifen zu können, ak Findley oder so
Dann kannst Du im Event GetData die Query positionieren um an die Daten zu kommen.

Gruss Fritz.

PS: Welchen Screenreader benutzt Du?
Fritz Westermann
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
481 Beiträge
 
Delphi 5 Enterprise
 
#3

AW: Tabellenzeilen in virtueller ListView darstellen???

  Alt 22. Feb 2021, 21:19
Huhu Fritz,
Als Screenreader benutze ich JAWS, hab hier aber auch NVDA drauf.

Offenbleiben kann die Query ja, aber mit was positioniere ich?

Herzlich grüßt
Marco
Marco Steinebach
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
657 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Tabellenzeilen in virtueller ListView darstellen???

  Alt 22. Feb 2021, 21:25
Hi Marco,
Wie gesagt bin nicht am Rechner aber entweder locate(xxxx) oder findkey sollte helfen

Wegen dem Screenreader habe ich gefragt da ich für einen Bekannten etwas suche. (Nicht Werner)
aber die Szene ist etwas undurchsichtig für mich.

PS: Wenn Du interessiert bist könnten wir auch über PM oder so mal diskutieren.
Gruss Fritz
Fritz Westermann
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
481 Beiträge
 
Delphi 5 Enterprise
 
#5

AW: Tabellenzeilen in virtueller ListView darstellen???

  Alt 22. Feb 2021, 22:41
Huhu Fritz,
Immer gerne:
marco.steinebach@blindreiten.de

Herzlich grüßt
Marco
Marco Steinebach

Geändert von Marco Steinebach (23. Feb 2021 um 18:16 Uhr)
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
481 Beiträge
 
Delphi 5 Enterprise
 
#6

AW: Tabellenzeilen in virtueller ListView darstellen???

  Alt 26. Feb 2021, 23:49
Hallo zusammen,
Ich bin ein Stück weiter, hab 'ne Menge über Datasets und co gelesen, wenn ich die ListView einfach durchlaufe und fülle, ist alles schön.
Aber ich kriege nicht raus, wie ich im onData der ListView sagen soll:
dataset.gehe zu Datensatz nr item.index.
Mit locate könnte es gehen, aber ich habe in meiner Datenbank nix, was einfach von 0 bis zur Datensatzanzahl mitläuft. Klar gibt es einen eindeutigen Identifier, aber der kann, werden Datensätze gelöscht, natürlich auch lücken haben.
Also bräuchte ich entweder was, tja, s.o., oder ich kann meinem SQL-Statement irgendwas hinzufügen, dass einfach eine, immer um 1 erhöhte Nummer, in das Dataset einfügt.

Ich bitte nochmal um Hilfe und grüße herzlich
Marco
Marco Steinebach
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.948 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: Tabellenzeilen in virtueller ListView darstellen???

  Alt 27. Feb 2021, 06:03
Ich bin mir nicht sicher, ob ich das Problem richtig verstehe. Zu virtuellen Listviews kann ich auch nichts sagen.
Die Gegenfrage: Was bringt es Dir, zu Dataset Nr x zu gehen?
Du willst doch sicher zu einem Datensatz, der eine bestimmte Information hält, statt zu einer nichtssagenden Nummer zu springen?

Auf Datenbankseite gibt es Werkzeuge, um solche Nummern wie Du sie möchtest zu erzeugen. Unter Firebird war es mal "generator", allgemein "sequence". Im Grunde eine parameterlose Funktion, die bei Abfrage immer einen neuen Wert ausspuckt, normalerweise jeweils 1 höher als die letzte Ausgabe.
Diese Funktion wird meist eingesetzt, um eindeutige ID zu erzeugen, die in der Tabelle als Primärschlüssel genutzt werden.
Sie kann auch einfach in einem Select Statement genutzt werden, also ohne die Ausgabe in eine Tabellenspalte zu speichern.

Man muss dabei berücksichtigen, dass eine solche Sequence zwar schön brav aufsteigende Zahlen liefert, in der Datenbankwelt spielt die Reihenfolge jedoch keine Rolle. Die Reihenfolge von Datensatzausgaben wird durch eine Sortieranweisung erzeugt (order by), ohne diese Anweisung ist sie zufällig.

Fortlaufende Nummern in Delphi gemäß Deiner Formulierung würde ich in einem Array verorten, den Arrayindex. (Der nichts mit einem Datenbankindex zu tun hat). Vielleicht gibt es eine solche Eigenschaft und daraus ableitende Funktionen auch im virtuellen Listview.
Gruß, Jo
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.752 Beiträge
 
Delphi 7 Professional
 
#8

AW: Tabellenzeilen in virtueller ListView darstellen???

  Alt 27. Feb 2021, 16:45
Du hast doch 'nen eindeutigen Identifier, der kommt mit ins Select und geht auch mit in die ListView.
Delphi-Quellcode:
if ADOQuery.Locate('Name Der Identifier Spalte Im Select',Identifier_Aus_Dem_ListView,[]) then begin
  // Mach was mit dem Satz.
end else begin
  // Den Satz gibt es nicht mehr oder er wurde (aus welchem Grund auch immer) nicht gefunden.
end;
Damit positionierst Du die ADOQuery auf dem Satz, der dem eindeutigen Identifier entspricht.
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
481 Beiträge
 
Delphi 5 Enterprise
 
#9

AW: Tabellenzeilen in virtueller ListView darstellen???

  Alt 1. Mär 2021, 19:48
Hallo zusammen,
Was den "eindeutigen Identifier" angeht, hab ich den, natürlich, aber da sind, werden Datensätze gelöscht, Löcher drin, sprich:
1, 2, 5, 6, 7 (5 Elemente)
und die List hätte im onData gern für das Item 3 einen Datensatz, für den es aber keinen Identifier mehr gibt.

Falls nochmal jemand drüber fällt, hier die Lösung:
Zunächst brauchen wir mal die wirkliche Menge der Einträge, die in der Listview angezeigt werden sollen:
Code:
query.sql.text := 'select count(*) as anzahl from adressen';
query.open;
listview1.items.count := query.fieldByName('anzahl');
query.close;
Dann brauchen wir, bevor es losgeht, die Spaltenbreiten für die einzelnen Spalten der Listview, hier nur mal als Beispiel:
Code:
query.sql.text := 'select suchbegriff, char_length(suchbegriff) as laenge from adressen order by laenge desc';
query.open;
listview1.columns[0].width := listview1.canvas.textWidth(abfrage.fieldByName('Suchbegriff').asString);
query.close;
query.sql.text := 'select Nachname, char_length(nachname) as laenge from adressen order by laenge desc';
...
Ist zwar ein bisschen mühsam, aber mir will nicht einfallen, wie man die Abfragen für jede Spalte kombinieren könnte.
Und zum guten Schluss brauchen wir das onData für die Listview:
Code:
// irgendwo beim Erstellen der Listview:
query.sql.text := 'select row_number() over (order by Nachname) as x, nachname, vorname from adressen;';
query.open;
// im eigentlichen onData:
query.locate('x', item.index, []);
item.caption := query.fieldByName('Suchbegriff');
Herzlich grüßt
Marco
Marco Steinebach
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
1.296 Beiträge
 
Delphi 2007 Professional
 
#10

AW: Tabellenzeilen in virtueller ListView darstellen???

  Alt 1. Mär 2021, 20:32
Die einfachste Lösung, lies alle Daten (inclusive ID) in Objekte und häng diese in eine Objektliste.
Wenn die Query nicht zu langsam ist, dürften 10000 oder mehr Zeilen auch kein Problem sein.

Übriegens eignet sich "TDrawgrid" auch gut für Anzeigen und Bearbeiten von Datenobjekten.
OnGetText, OnSetText implementieren und RowCount setzen.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 00:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf