TDBGrid und Spaltenbreite

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

TDBGrid und Spaltenbreite

Beitrag von MmVisual »

Hallo,

In meiner Query Definition habe ich in der Feld-Definition die Eigenschaften Visible und Width gesetzt. Jedes mal beim öffnen der Query wird das auch so gemacht.

Nun ändere ich die Spaltenbreite zur Laufzeit und lasse die Query neu öffen, dann ist die Spaltenbreite wieder futsch.

Also habe ich im OnColumnSized Event Event diesen Code eingebaut:

Code: Alles auswählen

procedure TfrmMain.grdColumnSized(Sender: TObject);
Var i: Integer;
  col: TColumn;
begin
  If Sender Is TDBGrid Then
  Begin
    For i := 0 To TDBGrid(Sender).Columns.Count - 1 Do
    Begin
      col := TDBGrid(Sender).Columns.Items[i];
      If col.Visible Then
        col.Field.DisplayWidth := col.Width;
    end;
  end;
end;
Nur ist nun das Problem dass DisplayWidth die durchschnittliche Anzahl der Zeichen und Width die Pixel sind. Also es tut so einfach nicht.

Wie kann ich die Pixel in die durchschnittliche Anzahl der Zeichen umrechnen?

Vielen Dank im Voraus.

Gruß Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: TDBGrid und Spaltenbreite

Beitrag von MmVisual »

Ok, den ColumnSized habe ich hin bekommen. Es wird einfach die Größe von 'MX' DIV 2 genommen.

Aber ich habe noch ein weiteres Problem. Im Event OnColumnMoved wird aufgerufen sobald man die Spalte verschiebt. Nun will ich auch die Index-Position in der Query Feldeigenschaft merken. Aber das klappt irgendwie nicht. Wenn ich den Index mir mit merke bei dem Event ColumnSized, dann klappt es.

Kann mir vielleicht hierbei jemand helfen?
Vielen Dank.

Anbei der Code:

Code: Alles auswählen

procedure TfrmMain.grdColumnSized(Sender: TObject);
Var i, iw, iwt, iwc: Integer;
  col: TColumn;
begin
  If Sender Is TDBGrid Then
  Begin
    TDBGrid(Sender).DataSource.DataSet.Resync([rmCenter]);
    For i := 0 To TDBGrid(Sender).Columns.Count - 1 Do
    Begin
      col := TDBGrid(Sender).Columns.Items[i];
      If col.Visible Then
      Begin
        iwc := TDBGrid(Sender).Canvas.TextWidth('MX') Div 2;
        iw := col.Width Div iwc;
        iwt := Length(col.Field.DisplayLabel);
        If iw > iwt Then
          col.Field.DisplayWidth := iw
        Else col.Field.DisplayWidth := iwt;
        col.Field.Index := col.Index;
      end;
    end;
  end;
end;
 
procedure TfrmMain.grdColumnMoved(Sender: TObject; FromIndex, ToIndex: Integer);
Var i: Integer;
  col: TColumn;
  fi: TField;
begin
  If Sender Is TDBGrid Then
  Begin
    Application.ProcessMessages;
    For i := 0 To TDBGrid(Sender).Columns.Count - 1 Do
    Begin
      col := TDBGrid(Sender).Columns.Items[i];
      If col.Visible Then
      Begin
        fi := TDBGrid(Sender).DataSource.DataSet.FindField(col.FieldName);
        If Assigned(fi) Then
          fi.Index := col.Index;
        // col.Field.Index := col.Index; // geht auch nicht.
      end;
    end;
  end;
end;
Gruß Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten