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.
Announcement
Collapse
No announcement yet.
DBGrid nur zur Ausgabe nutzen
Collapse
X
-
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
-
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>
Comment
-
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
-
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>
Comment
Comment