Moin ...,
bei einem StringGrid bedeutet das ein nicht unerheblicher Aufwand. Wie Hansa schon schrieb, musst du dich dabei um alles selber kümmern. CheckBox erstellen, ausrichten, freigeben usw.!
Versuche lieber von TListView abzuleiten.
Wenn du es trotz alledem versuchen möchtest, hier eine kleine
unvollständige Vorlage wie ich es mal gemacht hatte. Für eine Komponente musst du das natürlich anpassen!
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
with StringGrid1 do begin
Cells[0,0]:= 'CheckBox';
for i:= 1 to ColCount do Cells[i,0]:= 'Element '+ IntToStr(i);
for i:= 1 to RowCount do Cells[1,i]:= IntToStr(i);
end;
AddCheckBox(0,1);
AddCheckBox(1,2);
end;
procedure TForm1.MyCheckBoxClick(Sender: TObject);
begin
ShowMessage('Click!');
end;
procedure TForm1.AddCheckBox(iCol, iRow: Integer);
var NewCheckBox: TCheckBox;
begin
with StringGrid1 do begin
if Objects[iCol,iRow] = nil then begin // wenn noch kein Objekt der Zelle zugew. wurde, dann ->
NewCheckBox:= TCheckBox.Create(Application); // Objekt TCheckBox erstellen
NewCheckBox.Parent:= Parent; // Eigenschaften zuweisen
NewCheckBox.Color:= Color;
// NewCheckBox.Caption:= 'MyCB';
NewCheckBox.OnClick:= MyCheckBoxClick; // Ereignis zuweisen
Objects[iCol,iRow]:= NewCheckBox; // CheckBox sagen zu welcher Zelle sie gehört
Invalidate; // Neuzeichnen erzwingen
end;
end;
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var NewCheckBox: TCheckBox;
begin
if not (gdFixed in State) then begin // FixedCell ?
NewCheckBox:= (StringGrid1.Objects[ACol, ARow] as TCheckBox);
if NewCheckBox <> nil then begin // wenn unsere CheckBox existiert
NewCheckBox.Left:= Rect.Left +2; // plazieren wir sie innerhalb der Zelle
NewCheckBox.Top:= Rect.Top +2;
NewCheckBox.Width:= (Rect.Right - Rect.Left);
NewCheckBox.Height:= (Rect.Bottom - Rect.Top);
end;
end;
end;
LG Mario