![]() |
DBGrid mit verschiebbaren Zeilen
Hallo,
ich brauche für eine Anwendung ein DBGrid, in dem ich die Datenzeilen vom User verschieben lassen kann. Da ich im Netz nix derartiges gefunden habe dachte ich ok -> selber machen. Sollte nicht so schwierig sein, da die dafür nötigen Sachen schon in TCustomGrid drinnen sind. Das Problem ist, daß ich das Verschieben erstmal erlauben müßte in TCustomGrid.Options, aber im TCustomDBGrid Options mit einer neuen Eigenschft überschrieben / verdeckt wird. Also hab ich versucht, die unter anderem Namen wieder sichtbar zu machen:
Delphi-Quellcode:
Aber bei dem Typecast bringt mir Delphi die Fehlermeldung "[Fehler] Dbgrid.pas(281): Undefinierter Bezeichner: 'Options'". Sollte die Kindklasse aber nicht Zugriff auf die protected-Eigenschften des vorfahren haben? Und an die Methode / Eigenschft ranzukommen, die in TCustomGrid verwendet wird, erscheint mir noch schwieriger, da die beide als private deklariert sind.
TEDBGrid = class(TCustomDBGrid)
protected procedure SetGridOptions(Options: TGridOptions); function GetGridOptions(): TGridOptions; ... published property GridOptions: TGridOptions read GetGridOptions write SetGridOptions; ... end; ... procedure TEDBGrid.SetGridOptions(Options: TGridOptions); begin TCustomGrid(Self).Options := Options; end; function TEDBGrid.GetGridOptions(): TGridOptions; begin Result := TCustomGrid(Self).Options; end; Hat jemand eine Idee? |
Re: DBGrid mit verschiebbaren Zeilen
Du hast die Options in Deiner eigenen Klasse nicht deklariert.
|
Re: DBGrid mit verschiebbaren Zeilen
Ja, weil TCustomDBGrid schon eine Eigenschaft Options hat, die ich nicht wieder verstecken möchte.
|
Re: DBGrid mit verschiebbaren Zeilen
Aber Du kannst doch kein Feld einer Klasse ansprechen, in der dieses gar nicht vorhanden ist. Du bräuchtest dann sowohl Options mit inherited und Deine neuen Gridoptions.
|
Re: DBGrid mit verschiebbaren Zeilen
Aber Options ist ja sowohl in TCustomGrid vorhanden als auch in TCustomDBGrid. Nur das das TCustomDBGrid.Options <> TCustomGrid.Options. Und die TCustomGrid.Options will ich jetzt unter dem Namen GridOptions verfügbar machen, damit ich auf beide Zugreifen kann.
|
Re: DBGrid mit verschiebbaren Zeilen
Nur ist TGridOptions nicht kompatibel zu TDbGridOptions, die Klasse von der Du erbst.
|
Re: DBGrid mit verschiebbaren Zeilen
Jup. Aber TCustomDBGrid ist ein direkter Nachfahr von TCustomGrid, in dem Options mit dem Typ TGridOptions deklariert ist. TCustomDBGrid führt dann Options erneut ein, mit dem Typ TDBGridOptions.
Die Vererbungslinie sieht ja so aus: TCustomGrid -> TCustomDBGrid -> TDBGrid -> TEDBGrid Und wieso kann ich als TEDBGrid als Nachfahr von TCustomGrid nicht auf TCustomGrid.Options zugreifen? Oder ist die Notation TCustomGrid(self).Options nicht die richtige dafür? Wenn ja, wie dann? |
Re: DBGrid mit verschiebbaren Zeilen
Moin,
ich gebe zu, ich habe nie mit Delphi 6 gearbeitet. Aber unter Delphi 7 ist das DBGrid standartmäßig so eingestellt, dass man die Spalten mit der Maus ziehen kann. Wurde das von Delphi 6 -> Delphi7 geändert ? MfG Thorsten |
Re: DBGrid mit verschiebbaren Zeilen
Nein, das wurde nicht geändert. Ich möchte aber auch nicht die Spalten sondern die Zeilen verschieben ;)
|
Re: DBGrid mit verschiebbaren Zeilen
Oh, wer lesen kann ist klar im Vorteil. Sorry
|
Re: DBGrid mit verschiebbaren Zeilen
Ich befürchte, das dein Versuch schon im Ansatz scheitert. :roll:
Das DB-Grid ist datensensitiv. Es stellt die Datensätze in der Reihenfolge dar, in der sie aus der DB abgerufen wuden. Die Sortierung kann man nur durch Indizies und/oder verändertem Datenabruf beeinflussen. Um die Position eines einzelnen Datensatzes individuell zu verändern, musst du den Daten selbst verändern. Eine Variante wäre z.B., das du ein Feld "TimeStamp" zu der entsprechenden Tabelle hinzufügst und nach diesem sortierst. Wenn jetzt ein Datensatz verschoben werden soll, dann setzt du dessen TimeStamp auf (TimeStamp des Datensatzes an der Zielposition) - 1 Millisekunde. Bei neuen Datensätzen setzt du TimeStamp := now, damit diese standardmäßig unten stehen ... |
Re: DBGrid mit verschiebbaren Zeilen
Ich hab schon ein Feld, nach dem ich sortieren kann, in dem einfach der Platz der Reihenfolge steht. Ich wills nur für den User so einfach wie möglich machen, die Reihenfolge der Datensätze zu ändern. Das scheint mir am intuitivsten über das Grid zu gehen. Das Grid soll dann, nach entsprechender Ausprogramierung, also auch die Reihenfolge - und damit das Feld, in dem diese steht - ändern.
|
Re: DBGrid mit verschiebbaren Zeilen
Habe da wenig Hoffnung, daß so was damit (zumindest mit vertretbarem Aufwand) geht. Denn :
Delphi-Quellcode:
Man beachte den ; :!:
TCustomDBGrid = class;
Also ist das Ding komplett leer (nicht mal Tricks wie Forward haben die angewendet). Es muß also wirklich ALLES selber angelegt werden. 8) Wers immer noch nicht nicht glaubt : Zitat:
Tip : verwende lieber gleich ein "normales" Stringgrid, dann geht so was definitiv und trotz der vielen Arbeit dazu im Endeffekt viel schneller. Die Zwischenstufe Custom ist immer mit sehr sehr viel Arbeit verbunden und richtet sich IMHO eher an kommerzielle Entwickler, die Komponenten verkaufen wollen. Angeblich soll .NET da Besserung bringen, aber ehrlich gesagt : glaubs nicht recht. |
Re: DBGrid mit verschiebbaren Zeilen
Hallo Hansa,
Delphi-Quellcode:
Die von dir zitierte Klassendeklaration ist wohl ein Artefakt. In den Quellen von D7 steht an der Stelle TCustomGrid und du zitierst ja auch den Kommentar dazu.
TCustomDBGrid = class;
Delphi-Quellcode:
Diese Notation einer Klassendeklaration entspricht dem forward bei Prozeduren und Funktionen. Die vollständige Deklaration folgt ja auch nach dem ausführlichen Kommentar und weiteren 20 Zeilen. Das sollte bei D8 nicht anders sein.
Also ist das Ding komplett leer (nicht mal Tricks wie Forward haben die angewendet)
Auch wenn ich deine ablehnende Haltung gegenüber dem DBGrid teile, so könnte ich mich doch nie für ein StringGrid im Kern meiner Datenbank-Anwendungen entscheiden. Ich verwende seit W95 und dem renovierten GUI Style Guide eine ListView im virtuellen Modus. Mit diesem Common Control erreiche ich bei minimalem Aufwand den größten Grad an Software-Ergonomie. Freundliche Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 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