Announcement

Collapse
No announcement yet.

DBGrid nur zur Ausgabe nutzen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DBGrid nur zur Ausgabe nutzen

    Hallo, ich kümmere mich gerade um eine anständige Ausgabe meines Hobby-Programmes und würde gern ein DBGrid so anpassen, daß die vorher aus einer SQL-Abfrage angezeigten Datensätz genau in das DBGrid passen. Es handelt sich um maximal 25 Datensätze(Spalten), es können aber auch weniger sein. Außerdem möchte ich auf den am rechten Rand immer vorhandenen Scrollbalken verzichten. Geht sowas überhaupt. Kann man mir dazu Tipps geben. Vielen für eure Mühe Danke ph.

  • #2
    Peter,

    Du schreibst, dass Du max 25 Datensätze (Spalten) anzeigen möchtest.

    Das ist ein kleiner Widerspruch: Datensätze werden üblicherweise pro Zeile (horizontal) ausgegeben, die Spalten (vertikal) repräsentieren dann die Felder eines Datensatzes...

    Hast Du also maximal 25 Datensätze oder maximal 25 Felder pro Datensatz anzuzeigen? Geht es also um die Anpassung der Höhe oder der Breite des DBGrids

    Comment


    • #3
      Hallo, ich meine 25 Zeile

      Comment


      • #4
        Hallo,

        die Scrollbars werden im TDBGrid immer dann angezeigt, wenn es etwas zu scrollen gibt. Passen alle Datensätze in den sichtbaren TDBGrid-Bereich, so verzichtet das Grid auf die Darstellung der vertikalen Scrollbar. Und wenn der Datensatz in seiner Länge nicht in den sichtbaren Bereich des Grids passt, wird der horizontale Scrollbalken angezeigt. Den horizontalen Scrollbalken kann man allerdings mit einem Hack auch dann abschalten, wenn die Daten länger sind als das TDBGrid:
        <pre>
        uses
        StdCtrls;

        type
        THackDBGrid = class(TDBGrid)
        end;

        procedure TForm1.FormCreate(Sender: TObject);
        begin
        with THackDBGrid(DBGrid1) do
        ScrollBars := ssNone;
        end;
        </pre>
        Man könnte dann versuchen, die Breite der einzelnen Spalten automatisch auf den längsten anzuzeigenden Wert anzupassen. Das könnte so aussehen:<br>
        - Ereignisbehandlungsmethode für <b>OnCreate</b> des Formulars: TField-Instanzen der Datenmenge auf 4-Zeichen-Spaltenbreite setzen.<br>
        - Ereignisbehandlungsmethode für <b>OnDrawColumnCell</b> des TDBGrid prüft Anzeigebreite des aktuellen Feldwertes <br>
        - Wenn die Spalte "zu klein" ist, wird eine private Botschaft verschickt, die diese TDBGrid-Spalte vergrössert.
        <pre>
        unit DBGridAutoSizeFrm;

        interface

        uses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, Grids, DBGrids, DB, DBTables, StdCtrls;

        const
        PM_COLUMNWIDTH = WM_APP + 1;

        type
        TForm1 = class(TForm)
        Table1: TTable;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
        DataCol: Integer; Column: TColumn; State: TGridDrawState);
        procedure FormCreate(Sender: TObject);
        private
        { Private-Deklarationen }
        procedure PMCOLUMNWIDTH(var Msg: TMessage); message PM_COLUMNWIDTH;
        public
        { Public-Deklarationen }
        end;

        var
        Form1: TForm1;

        implementation

        {$R *.dfm}

        { TForm1 }

        procedure TForm1.FormCreate(Sender: TObject);
        var
        i : Integer;
        begin
        with Table1 do
        for i := 0 to Pred(Fields.Count) do
        Fields[i].DisplayWidth := 4;
        end;

        procedure TForm1.PMCOLUMNWIDTH(var Msg: TMessage);
        begin
        with TColumn(Pointer(Msg.LParam)) do
        Width := Msg.WParam;
        end;

        procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
        DataCol: Integer; Column: TColumn; State: TGridDrawState);
        begin
        with TDBGrid(Sender).Canvas.TextExtent(Column.Field.Dis playText) do
        if (cx + 6 > Column.Width) then
        Postmessage(Handle, PM_COLUMNWIDTH, cx + 10, LongInt(Column));
        end;

        end.
        </pre&gt

        Comment


        • #5
          Hallo, ersteinmal vielen Dank für die immer großartige Hilfe. Sie ist für mich sehr nützlich. Ich arbeite mit Delphi 5 und Paradox 7. In meiner Datenbank stehen im geöffneten Zustand, ohne irgendwelche Einschränkungen, mehr als 25 Datensätze. Diese werden durch eine SQL-Abfrage selectiert. Aus dieser Abfrage heraus ist es nur möglich, das nicht mehr als 25 Zeilen maximal ausgegeben werden. Diese passen ohne Probleme in ein DBGrid. Jedoch wird der rechte Scrollbalken immer angezeigt. Ich habe jetzt ein Panel auf den Scrollbalken gelegt, nun sieht man diesen nicht mehr. Ist aber nicht die feine Art. Muß ich mit dem rechten Scrollbalken leben ? Liegt das an meiner SQL-Abfrage ?. Aber auch wenn die Tabelle nur 4 Datensätze enthält wird der Scrollbalken angezeigt. Vielen Dank für Hinweise. Gruss ph

          Comment


          • #6
            Hallo,

            in diesem Fall muss man nur etwas tiefer in die Trickkiste greifen, oder genauer gesagt, das Win32-API um Mithilfe bemühen. Das folgende Beispiel sollte <b>beide</b> Scrollbars aus dem TDBGrid entfernen. Über die Win32-API-Funktion <b>SetScrollInfo</b> überschreibe ich dazu die Startwerte, die Borland für TDBGrid in der Unit <i>DBGrids</i> gesetzt hat:
            <pre>
            uses
            StdCtrls;

            type
            THackDBGrid = class(TDBGrid)
            end;

            procedure TForm1.FormCreate(Sender: TObject);
            var
            aSI : TScrollInfo;
            begin
            with THackDBGrid(DBGrid1) do
            ScrollBars := ssNone;
            with aSI do begin
            cbSize := SizeOf(aSI);
            fMask := SIF_ALL;
            nMin := 1;
            nPage := 1;
            nMax := 1;
            end;
            // Rechte Scrollbar im TDBGrid abschalten
            SetScrollInfo(DBGrid1.Handle, SB_VERT, aSI, True);
            end;
            </pre&gt

            Comment

            Working...
            X