Delphi-PRAXiS
Seite 2 von 2     12   

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 Objecte / Datensatz(record) (https://www.delphipraxis.net/91476-objecte-datensatz-record.html)

shmia 7. Mai 2007 19:49

Re: Objecte / Datensatz(record)
 
Zitat:

Zitat von EarlyBird
Ich muss Datensätze in einer vertikalen Ansicht darstellen.
Ich nutze aus diversen Gründen kein Stringgrid unter anderem ist das scrollen durch die Datensätze zu langsam.
Ein schnelles scrollen durch die Datensätze ist äußerst wichtig.

Ich zeichne die Daten selbst in ein TBitmap und bin dabei so flexibel wie ich es benötige.
Das scrollen funktioniert dann auch wesendlich schneller.

Nun muss ich aber Änderungen in meinem "VerticalGridBild" machen können und das möglichst schnell.
Dazu speichere pro Datensatz ein Bitmap mit Koordinaten in einem Objekt.
ändern sich nun die Daten in der Tabelle kann ich dieses Bitmap einfach auf das "VerticalBild" kopieren.

Es geht also darum, die Daten, die du schon mal gezeichnet hat, in einen Cache zu packen, damit es beim 2. Mal schneller geht.
Das geht aber stark auf Kosten des Hauptspeichers!! 10000 Bitmaps brauchen halt doch einige MBs.
Besser wäre wohl EMF (Enhanced Meta File) zu benützen.
Ein (Windows) Meta File ist sozusagen ein Playback aller Zeichenbefehle, die auf einen Canvas angewendet wurden.
Es muss dabei nicht unbedingt in einer Datei gespeichert werden.

Ich würde mich an deiner Stelle auf bessere Filtermöglichkeiten konzentrieren anstatt das DBGrid neu zu erfinden!
Es ist doch viel sinnvoller die Datenmenge vor der Anzeige stark einzuschränken, als Tausende Datensätze anzuzeigen und das Scrollverhalten zu optimieren. Letztendlich müssen die Tausende Datensätze ja doch mindestens ein Mal eingelesen werden. Ändern sich die Daten im Hintergrund, wird der Cache wertlos und muss erneut aufgebaut werden.

Jelly 7. Mai 2007 19:51

Re: Objecte / Datensatz(record)
 
Davon abgesehen macht es überhaupt keinen Sinn, einem Benutzer zisch tausend Datensätze in egal welcher Form vor die Nase zu knallen. Bau ein kluge Suchfunktion/Filterfunktion ein. Deine Anwender werden es dir danken.

EarlyBird 7. Mai 2007 21:14

Re: Objecte / Datensatz(record)
 
Zitat:

Zitat von shmia
Es geht also darum, die Daten, die du schon mal gezeichnet hat, in einen Cache zu packen, damit es beim 2. Mal schneller geht.
Das geht aber stark auf Kosten des Hauptspeichers!! 10000 Bitmaps brauchen halt doch einige MBs.

Fast richtig, allerdings fülle ich direkt den cache und erstelle daraus das Bitmap.
Es werden immer höchstens 2000 Datensätze sein.
(von 10000 habe ich nie gesprochen)

Zitat:

Zitat von shmia
Besser wäre wohl EMF (Enhanced Meta File) zu benützen.
Ein (Windows) Meta File ist sozusagen ein Playback aller Zeichenbefehle, die auf einen Canvas angewendet wurden.
Es muss dabei nicht unbedingt in einer Datei gespeichert werden..

Das hört sich interessant an.
Hast Du eventuell einen Link zu mehr Infos dazu?


Zitat:

Zitat von shmia
Ich würde mich an deiner Stelle auf bessere Filtermöglichkeiten konzentrieren anstatt das DBGrid neu zu erfinden!
Es ist doch viel sinnvoller die Datenmenge vor der Anzeige stark einzuschränken, als Tausende Datensätze anzuzeigen und das Scrollverhalten zu optimieren. Letztendlich müssen die Tausende Datensätze ja doch mindestens ein Mal eingelesen werden. Ändern sich die Daten im Hintergrund, wird der Cache wertlos und muss erneut aufgebaut werden.

Das ist sicherlich richtig aber leider nicht in allen Fällen.
Die maximal 2tausend Datensätze die ich anzeigen möchte sind leider nicht mehr zu Filtern.
Gern würde ich auch auf das DBGrid zurückgreifen aber leider kann ich die Daten damit nicht vertical anzeigen.
Das StringGrid habe ich auch schon getestet aber Leider ist das zu langsam.
Beim scrollen von einem Datensatz werden allen Zellen neu gezeichnet das dauert halt.


Zitat:

Zitat von Jelly
Davon abgesehen macht es überhaupt keinen Sinn, einem Benutzer zisch tausend Datensätze in egal welcher Form vor die Nase zu knallen. Bau ein kluge Suchfunktion/Filterfunktion ein. Deine Anwender werden es dir danken.

Auch Du hast im Allgemeinen sicherlich recht aber halt nur im Allgemeinen.
Es gibt schon Anwendungen wo es durchaus Sinn macht dem User schnellst möglich 2tausend Datensätze zu präsentieren.

Vielen Dank für die Vielen Beiträge
Gruß EarlyBird

Jelly 7. Mai 2007 22:56

Re: Objecte / Datensatz(record)
 
Zitat:

Zitat von EarlyBird
Die maximal 2tausend Datensätze die ich anzeigen möchte sind leider nicht mehr zu Filtern.

:?: :?: :?:
Wenn du sie programmiertechnisch nicht filtern kannst, wie willst du dem Anwender zumuten, sich durch 2000 Datensaätze zu wühlen.

Würd mich mal interessieren was für eine Anwendung du da programmierst.

EarlyBird 8. Mai 2007 09:19

Re: Objecte / Datensatz(record)
 
"sind nicht mehr zu Filtern" ist vielleicht ein bisschen missverständlich.
Natürlich lassen sich Daten einer Tabelle Filtern, aber die max. 2tausend die ich geschrieben habe sind die, die schnell im Zugriff sein müssen.
(der normal Fall werden auch eher zwischen 400 und 800 sein aber man sollte ja vom Maximum ausgehen)

Die Daten werden farblich gekennzeichnet, nach verschiedenen Kriterien.
So das die Datensätze sehr wohl schnell "zu durchwühlen" sind.
(Ein roter Datensatz in 5 blauen fällt auch ohne lesen des Inhalts sehr schnell auf).
Das ganze dient nicht hauptsächlich der Daten Eingabe sonder eher der Datensortierung.
Die Sortierung geschieht aber "manuell" der User legt die Reihenfolge fest.
Und in einer vertikalen Darstellung kann ich auf 3 Bildschirmen schon eine ganze Menge Daten nebeneinander anzeigen und behalte durch die Farben immer noch eine gewisse Übersicht.

Ob das ganze jetzt die beste Lösung ist weiss ich auch noch nicht aber mit einem StringGrid geht das ganze halt zu langsam (das war mein erster Lösungsansatzt der auch erst ganz vielversprechend aussah).

Zitat:

Zitat von shmia
Besser wäre wohl EMF (Enhanced Meta File) zu benützen.
Ein (Windows) Meta File ist sozusagen ein Playback aller Zeichenbefehle, die auf einen Canvas angewendet wurden.
Es muss dabei nicht unbedingt in einer Datei gespeichert werden.

Gibt es dazu noch mehr Infos??



Außerdem drifte ich im Augenblick ganz vom eigentlichen Thema ab.
Mir ist immer noch nicht klar wie ich einen Record an ein Objekt binde und umgekehrt?

das muss doch irgendwie möglich sein.

Gruß EarlyBird

hoika 8. Mai 2007 09:59

Re: Objecte / Datensatz(record)
 
Hallo,

wie schon 100 mal ;) gesagt,
das einfachste ist der Primär-Schluessel des Records.
Der ist bei dir ja wohl ein Integer, also

Delphi-Quellcode:
type
  TMyClass = class
    iDBId: Integer;
  end;

Heiko

EarlyBird 8. Mai 2007 13:48

Re: Objecte / Datensatz(record)
 
Sorry wenn ich immer wieder Frage :wall:
Aber irgend wie macht es einfach nicht klick.

Zitat:

Zitat von hoika
wie schon 100 mal ;) gesagt,
das einfachste ist der Primär-Schluessel des Records.
Der ist bei dir ja wohl ein Integer, also

Delphi-Quellcode:
type
  TMyClass = class
    iDBId: Integer;
  end;

nun noch ein 101stes mal :oops:
Wie kann ich dann direkt das Objekt verwenden??
Delphi-Quellcode:
for i := 0 to objects.count - 1 do
  begin
    if MyClass.iDBId = 101 then
      ....
      .....
    break;
  end;
Das kann doch nicht die beste Lösung sein!?!?
Dann brauche ich ja immer noch eine schleife :gruebel:

hoika 8. Mai 2007 14:11

Re: Objecte / Datensatz(record)
 
Hallo,

sortiere diese Liste nach der iDBId
und buntze BinSearch zum Suchen.
Ab D6 (?) gibt es auch TBucketList (Hash-Liste),
die sowas ähnliches macht.

Du könntest auch eine eigene Klasse von TBitmap ableiten
und dort das iDBId eintragen.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:48 Uhr.
Seite 2 von 2     12   

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 by Thomas Breitkreuz