Button w StringGrid

0

Witam
Potrzebuję umieścić Buttony i CheckBoxy w wybranych komórkach komponentu String Gridm jednak nie mam pomysłu w jaki sposób to rozwiązać.

0

Takie kryteria wyszukiwania w googlach skutkują odpowiedzią typu: jak po kliknięciu buttona zrobić coś w stringgrid ;) Jedyne co udało mi się wyszukać to jak zrobić checkboxa za pomocą Canvasa.
Chodziło mi raczej o to czy da się jakimś "normalnym" sposobem umieścić komponent TButton w komórce tabeli?

0

Bo może trzeba kliknąć w pierwszy lepszy link????????? Nie ma co gratulacje...
http://4programmers.net/Forum/viewtopic.php?id=125236

0

Znalezione w necie (nie moje) :-)

W komponencie DBGrid, który przychodzi razem z Delphi nie ma bezpośredniej obsługi pól logicznych, gdzie wartość byłaby pokazywana jako prawda bądź fałsz. Do takich wartości przydałby się taki sposób pokazywania jak w komponencie CheckBox. Oto jak można to zrealizować.

Założenia:

    // Tablica obsługiwana jest przez komponent klasy TTable o nazwie Table1
    // Pole jest typu logicznego i obsługiwane przez komponent TField (dokładniej TBooleanField) o nazwie Table1PoleCheckBox
    // komponent DBGrid nazywa się TDBGrid1 

Jak teraz osiągnąć CheckBox w DBGrid1 dla pola PoleCheckBox z Table1:

    // Dla kolumny, która ma być CheckBox-em określamy czcionkę na WingDings i wycentrowanie tekstu np.

      DbGrid1.Columns[1].Alignment:=taCenter;
      DbGrid1.Columns[1].Font.Name:='Wingdings';

    //  Oczywiście prościej jest to zrobić w ObjectInspector.
    // W zdarzeniu pola OnGetText piszemy cos takiego:

      procedure TDataModule1.Table1GetText(Sender: TField;
      var Text: String; DisplayText: Boolean);
      begin
       if Sender.AsBoolean then Text:=#254
       else Text:=#168;
      end;

    // W zdarzeniach DBGrid OnDblClik i KeyPress powinny pojawić się następujące linijki, o ile checmy aby Grid pozwalał na edycje:

      if DBGrid1.SelectedField.Name='Table1PoleCheckBox' then begin
       if DBGrid1.SelectedField.DataSet.State=dsBrowse then
        DBGrid1.SelectedField.DataSet.Edit;
       DBGrid1.SelectedField.AsBoolean:=not DBGrid1.SelectedField.AsBoolean;
       Key:=#0; //Tylko dla obsługi OnKeyPress
      end;
0

Zmodziłem coś takiego:

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  var kolumna, wiersz: integer;
      myrect: TRect;
begin
   StringGrid1.MouseToCell(X, Y, kolumna, wiersz);
   Form1.Caption:=IntToStr(kolumna)+', '+IntToStr(wiersz);
   Button2.Parent:=StringGrid1;
   myrect:=StringGrid1.CellRect(4, wiersz);
   Button2.Left:=myrect.left;
   Button2.Top:=myrect.top;
   Button2.Width:=myrect.Right-myrect.Left;
   Button2.Height:=myrect.Bottom-myrect.Top;
end;

Wszystko jest fajnie, póki stringgrida nie trzeba przewijać przy większej ilości wierszy. Jeżeli przewinę, to niestety w komórkach robią się śmieci - albo przycisk całkiem znika, albo się nagle "rozmnaża"... Coś przeoczyłem?

0

Dałem Ci działające rozwiazanie. Jedyne co to przetłumaczyć z C++ na delphi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1