Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
Delphi 8 Architect
|
Re: DBGrid und Checkbox
27. Dez 2003, 12: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...
|