Thema: Delphi DBGrid und Checkbox

Einzelnen Beitrag anzeigen

Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#2

Re: DBGrid und Checkbox

  Alt 27. Dez 2003, 11:19
1. Variante: Felder, die nicht direkt vom User geändert werden sollen
Code:
hier bietet sich zum Darstellen der unterschiedlichen Zustände die Nutzung von Wingdings als Font für die betreffende Spalte an, da dieser auf nehezu jedem Windowssystem verfügbar ist. Dazu muß man dem entsprechenden Feld im Objektispektor als DisplayValues die entsprechenden 2 Zeichen durch Semikolon getrennt angeben (z.B.: ü;U für Aktuell/Veraltet) und im DBGrid für die entsprechende Spalte den Font auf Wingdings setzen.
2. Variante: Checkboxen für vom User zu beeinflussende Werte
Code:
  dazu ist es hilfreich, das normale DB-Grid um das Ereignes "OnSelectCell" zu erweitern (äquivalent zu TStringGrid) und somit die Möglichkeit zu schaffen, auf das Wechseln in die entsprechende Spalte zu reagieren (indem man z.B. die Checkbox anzeigt:
Code:
Code:
  TLsDbGrid = class(TDBGrid)
  private
    FOnDrawCell: TDrawCellEvent;
    FOnSelectCell: TSelectCellEvent;
  protected
    function SelectCell(ACol, ARow: Longint): Boolean; override;
  public
    function CellRect(ACol, ARow: Longint): TRect;
  published
    property OnSelectCell: TSelectCellEvent read FOnSelectCell write FOnSelectCell;
  end;
implementation

function TLsDbGrid.CellRect(ACol, ARow: Integer): TRect;
begin
  Result := inherited CellRect(ACol, ARow);
end;

function TLsDbGrid.SelectCell(ACol, ARow: Integer): Boolean;
begin
  Result := True;
  if Assigned(FOnSelectCell) then FOnSelectCell(Self, ACol, ARow, Result);
end;
Verwendung:
Code:
procedure TForm1.LsDbGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
var R: TRect;
begin
  DbCheckBox1.Visible := False;
  case ACol of
    1: begin
         R := LsDbGrid1.CellRect(ACol, ARow);    
         R.Left  := R.Left  + LsDbGrid1.Left;
         R.Right := R.Right + LsDbGrid1.Left;
         R.Top   := R.Top   + LsDbGrid1.Top;
         R.Bottom := R.Bottom + LsDbGrid1.Top;
         DbCheckBox1.Left := R.Left-1;           // Position der Checkbox anpassen
         DbCheckBox1.Top  := R.Top-1;
         DbCheckBox1.Width := R.Right-R.Left+2
         DbCheckBox1.Visible := True;             // Checkbox anzeigen
         CanSelect := False;                      // selection der Zelle des DBGrid verhindern
         DbCheckBox1.SetFocus;
       end;
  end; // case
end;
soweit mein Vorschlag
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat