![]() |
Delphi-Version: 2006
Checkbox in StringGrid -> Klicken klappt nicht
Hallo zusammen,
ich habe einem StringGrid eine Checkbox verpasst. Das habe ich so getan:
Delphi-Quellcode:
Die Checkbox erscheint auch an der entsprechenden Stelle, nur wenn ich Sie anklicke bleibt der Haken in der Chekcbox nicht bestehen. Er flackert nur kurz auf. Was mache ich falsch ?
procedure TForm1.FormCreate(Sender: TObject);
begin CHB_OK.Parent := StringGrid1; CHB_OK.Visible := FALSE; end; procedure TForm1.StringGrid1SelectCell( Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); var R: TRect; org: TPoint; begin if (ACol = 5) AND (ARow >= StringGrid1.FixedRows) then begin StringGrid1.Perform(WM_CANCELMODE, 0, 0); R := StringGrid1.CellRect(ACol, ARow); org := self.ScreenToClient(self.ClientToScreen(R.TopLeft)); With CHB_OK do begin SetBounds(org.X+17, org.Y+5, 13, 13); Visible := True; SetFocus; end; end; end; procedure TForm1.CHB_OKExit(Sender: TObject); begin With Sender as TCheckBox do begin Visible := FALSE; with StringGrid1 do begin If Checked = TRUE then Cells[col, row] := 'n.OK' else Cells[col, row] := ''; end; end; end; procedure TForm1.CMDialogKey(var msg: TCMDialogKey); begin if ActiveControl = CHB_OK then begin if msg.CharCode = VK_TAB then begin // setzt den Fokus zurück auf das StringGrid StringGrid1.SetFocus; StringGrid1.Perform(WM_KEYDOWN, msg.CharCode, msg.KeyData); msg.Result := 1; exit; end; end; end; Gruss Holger |
AW: Checkbox in StringGrid -> Klicken klappt nicht
Hallo,
versuch mal in Deinem FormCreate folgendes:
Delphi-Quellcode:
Dann sollte die Checkbox das Häkchen auch anzeigen.
procedure TForm1.FormCreate(Sender: TObject);
begin CHB_OK.Visible := FALSE; CHB_OK.CreateParentedControl (StringGrid1.Handle); end; Du musst nur noch für Dein SetBounds die linke obere Ecke des Stringgrids berücksichtigen (falls nicht (0, 0)). Gruß |
AW: Checkbox in StringGrid -> Klicken klappt nicht
Das da ist mir zu viel / zu kompliziert. Das geht doch auch mit "simulierter" Checkbox. Hier wird die Checkbox optisch wie gewünscht angezeigt. Das Klicken darauf bezieht sich dann zwar real auf die Zelle, aber was solls.
Delphi-Quellcode:
Probiers mal aus. 8-)
procedure Tfrm.sgDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); const IsChecked : array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED); var DrawState: Integer; begin inherited; if ACol in CheckBoxCols then begin if StrToInt (sg.Cells [ACol,ARow]) in [0,1,2] then begin InflateRect(Rect,-1,-1); DrawState := ISChecked[StrToInt (sg.Cells [ACol,ARow]) = 1]; // ^ die 0/1, die aus dem DB-Original in sg steht, beeinflusst, ob die // CheckBox gecheckt ist ! D.h. sie wird im OnDrawCell je nach Wert gezeichnet ! sg.Canvas.FillRect(Rect);// hinter Cells lieg. 0/1/2 = nicht anz. DrawFrameControl(sg.Canvas.Handle,Rect,DFC_BUTTON,DrawState); end end end; procedure Tfrm.sgClick(Sender: TObject); begin inherited; if sg.Col in CheckBoxCols then begin if sg.Cells [sg.Col,sg.Row] = '0' then sg.Cells [sg.Col,sg.Row] := '1' else if sg.Cells [sg.Col,sg.Row] = '1' then sg.Cells [sg.Col,sg.Row] := '0'; end; end; |
AW: Checkbox in StringGrid -> Klicken klappt nicht
Eine Erklärung für das Verhalten habe ich noch nicht gefunden, vielleicht hilft Dir auch ein Workaround.
Delphi-Quellcode:
procedure TForm1.CheckBox1KeyPress(Sender: TObject; var Key: Char);
begin if key=#32 then checkbox1.Checked := not checkbox1.Checked; end; procedure TForm1.CheckBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin checkbox1.Checked := not checkbox1.Checked; end; |
AW: Checkbox in StringGrid -> Klicken klappt nicht
Liste der Anhänge anzeigen (Anzahl: 1)
Soll das was nützen ? Meine paar Zeilen machen jedenfalls so etwas wie im Anhang.
|
AW: Checkbox in StringGrid -> Klicken klappt nicht
@Hansa ich habe selbst jahrelang Grids mit selbst gemalten Checkboxen verwendet.
Mich hat in diesem Fall eher die Problematik mit dem "Inplace-Editor" interessiert, unabhängig davon ob ich es so verwenden würde. (Mich interessiert immer noch warum das beschriebene Verhalten auftritt) Das Verhalten Deines Beispiels bei Tastaturbedienung ist noch nicht ausgereift ;-) |
AW: Checkbox in StringGrid -> Klicken klappt nicht
Hallo,
der Vom TE eingeschlagene Weg
Delphi-Quellcode:
CHB_OK.Parent := StringGrid1;
kann nicht funktionieren. Annahme: Es ist eine Zelle selektiert, so dass die Checkbox im Grid angezeigt wird. Was passiert, wenn man mit der Maus auf die Checkbox klickt? Die WM_LBUTTONDOWN Message wird in TButtonControl.WndProc eigentlich nur über TWinControl.WndProc an TControl.WndProc weitergereicht, um dann über TObject.Dispatch in TControl.WMLButtonDown zu landen. Soweit passt eigentlich noch alles. Wenn jetzt die Kinder mit den Eltern sprechen: Die von der Checkbox abgesetzte WM_COMMAND Message landet jetzt aber (bei Mama und Papa) in der TCustomGrid.WMCommand und dort wird eben nur der InplaceEditor (falls existent), nicht aber die Checkbox behandelt. Die WM_COMMAND Message würde von der Checkbox über TCustomCheckBox.CNCommand verarbeitet werden; kommt dort nur nicht mehr an. Wer also das Standardverhalten einer Checkbox erhalten möchte, suche sich bessere Eltern. Kompletter Unsinn ist übrigens mein Vorschlag (also ganz schnell vergessen)
Delphi-Quellcode:
CHB_OK.CreateParentedControl (StringGrid1.Handle);
Außer eine Instanz einer TWinControl anzulegen tut es nix. Lieber TE sollte Du diesen Vorschlag übernommen haben (wenn es funktioniert, dann nur weil die CHB_OK.Parent Zuweisung fehlt und die Checkbox auf einem Form, einem Panel o. ä. liegt), es tut mir leid zu schnell aus der Hüfte geschossen zu haben. :oops: @Bummi: Zitat:
Gruß |
AW: Checkbox in StringGrid -> Klicken klappt nicht
@Volker Z.
Danke :thumb: WMCommand war die Ecke die mir fehlte, jetzt könnt man das ganz doch noch runder bekommen ... ohne den ganzen ein/ausblende und Ereignisbehandlungscode drumherum ...
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids; type TStringGrid = Class(Grids.TStringGrid) procedure WMCommand(var Message: TWMCommand); message WM_COMMAND; private FCheckBox: TCheckBox; procedure SetCheckBox(const Value: TCheckBox); published property CheckBox: TCheckBox read FCheckBox Write SetCheckBox; End; TForm1 = class(TForm) StringGrid1: TStringGrid; CheckBox1: TCheckBox; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin StringGrid1.CheckBox := CheckBox1; end; { TStringGrid } procedure TStringGrid.SetCheckBox(const Value: TCheckBox); begin FCheckBox := Value; FCheckBox.Parent := Self; end; procedure TStringGrid.WMCommand(var Message: TWMCommand); begin if Assigned(FCheckBox) then if Message.NotifyCode = 0 then FCheckBox.Checked := not FCheckBox.Checked; inherited; end; end. |
AW: Checkbox in StringGrid -> Klicken klappt nicht
Hallo,
@Bummi: Sieht schön schlank aus! macha' s ganz rund und spendieren wir dem TE noch die SelectCell (so als Wiedergutmachung)
Delphi-Quellcode:
und
type
TStringGrid = class(Grids.TStringGrid) procedure WMCommand (var Message: TWMCommand); message WM_COMMAND; private FCheckBox: TCheckBox; procedure SetCheckBox (const Value: TCheckBox); protected function SelectCell (ACol, ARow: Longint): Boolean; override; published property CheckBox: TCheckBox read FCheckBox write SetCheckBox; end;
Delphi-Quellcode:
Rest wie gehabt.
function TStringGrid.SelectCell (ACol: Integer; ARow: Integer) : Boolean;
var r : TRect; p : TPoint; begin if (ACol = 5) AND (ARow >= FixedRows) then begin Perform (WM_CANCELMODE, 0, 0); r := CellRect(ACol, ARow); p := ScreenToClient (ClientToScreen (r.TopLeft)); with FCheckBox do begin BringToFront; SetBounds(p.X + 17, p.Y + 5, 13, 13); Visible := True; SetFocus end end; Result := inherited SelectCell (ACol, ARow) end; Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz