Jak wstawić przycisk do StringGrida?

0

Witam, proszę mi podpowiedzieć jak mogę wstawić np: w ostatnią komórkę StringGrida przycisk. Potrzebuję go żeby użytkownik mógł utworzyć nowy wiersz tabelki.

Dziękuję za pomoc :)

Przepraszam ale nie dopisałem, że chodzi mi o ostatnią komórkę w wierszu, a nie tabeli. Jak użytkownik wypełni wszystkie pola w wierszu, to w ostatnim będzie przycisk. Po kliknięciu pojawia się nowy wiersz.

0

http://stackoverflow.com/questions/9046861/stringgrid-with-buttons - leniuch...

Przy czym @Patryk27 ma sporo racji i dodanie nowego wiersza czy kolumny powinieneś zrealizować w inny sposób.

0

To ja dodam od razu pytanie może i powiązane. Jak zrobić aby StringGrid był zawsze 'przewiniety' na ostatni wiersz?

1

@karpov - a dokładniej? Jeżeli chodzi Ci o pokazanie ostatniego wiersza lub ostatniej kolumny to są do tego właściwości TopRow i VisibleRowCount oraz LeftCol i VisibleColCount (może ScrollBy też się nada); Sprawdź w swoim VCL jakie metody i właściwości są dostępne.

1

@karpov

StringGrid1.TopRow:= StringGrid1.RowCount-StringGrid1.VisibleRowCount-1; 
0
furious programming napisał(a):

http://stackoverflow.com/questions/9046861/stringgrid-with-buttons - leniuch...

Przy czym @Patryk27 ma sporo racji i dodanie nowego wiersza czy kolumny powinieneś zrealizować w inny sposób.

Dzięki za podpowiedź, ale mam prośbę do Ciebie. Użyłem tego kodu z linku i wstawia mi Buttona do StringGrida z tym że nie zachowuje się tak jak bym chciał. Już sobie ustawiłem że ma być w 10 kolumnie siatki, ale nie wiem co zmienić w tym kodzie żeby po kliknięciu na przycisk dodawał się tylko jeden wiersz i żeby przycisk z tego starego wiersza powyżej nowo utworzonego przenosił się do komórki 10 tego nowego wiersza. Czy mógłbyś zerknąć na ten kod i mi pomóc ?

unit Unit1;

interface

uses
  Windows, Classes, Controls, Forms, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    Grid: TStringGrid;
    procedure GridTopLeftChanged(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FPrevTopRow: Integer;
    procedure CreateGridButtons(ACol: Integer);
    procedure GridButtonClick(Sender: TObject);
    procedure RearrangeGridButtons;
    function GetInsertRowCount(ARow: Integer): Integer;
    function GridButtonToRow(AButton: TButton): Integer;
    procedure MoveGridButtons(ButtonIndex, ARowCount: Integer);
  end;

implementation

{$R *.dfm}

type
  TStringGridAccess = class(TStringGrid);

procedure TForm1.FormCreate(Sender: TObject);
begin
  FPrevTopRow := Grid.TopRow;
  CreateGridButtons(2);
end;

procedure TForm1.CreateGridButtons(ACol: Integer);
var
  R: TRect;
  I: Integer;
  Button: TButton;
begin
  R := Grid.CellRect(ACol, Grid.FixedRows);
  Inc(R.Right, Grid.GridLineWidth);
  Inc(R.Bottom, Grid.GridLineWidth);
  for I := Grid.FixedRows to Grid.RowCount - 1 do
  begin
    Button := TButton.Create(Grid);
    Button.BoundsRect := R;
    Button.Caption := '+';
    Button.Tag := I;
    Button.ControlStyle := [csClickEvents];
    Button.OnClick := GridButtonClick;
    Button.Parent := Grid;
    Grid.Objects[0, I] := Button;
    OffsetRect(R, 0, Grid.DefaultRowHeight + Grid.GridLineWidth);
  end;
end;

procedure TForm1.GridButtonClick(Sender: TObject);
var
  Button: TButton absolute Sender;
  N: Integer;
  I: Integer;
begin
  N := GetInsertRowCount(Button.Tag);
  if Button.Caption = '+' then
  begin
    Button.Caption := '-';
    Grid.RowCount := Grid.RowCount + N;
    for I := 1 to N do
      TStringGridAccess(Grid).MoveRow(Grid.RowCount - 1,
        GridButtonToRow(Button) + 1);
    MoveGridButtons(Button.Tag, N);
  end
  else
  begin
    Button.Caption := '+';
    for I := 1 to N do
      TStringGridAccess(Grid).MoveRow(GridButtonToRow(Button) + 1,
        Grid.RowCount - 1);
    Grid.RowCount := Grid.RowCount - N;
    MoveGridButtons(Button.Tag, -N);
  end;
end;

procedure TForm1.GridTopLeftChanged(Sender: TObject);
begin
  RearrangeGridButtons;
  FPrevTopRow := Grid.TopRow;
end;

procedure TForm1.RearrangeGridButtons;
var
  I: Integer;
  Shift: Integer;
begin
  Shift := (Grid.TopRow - FPrevTopRow) *
    (Grid.DefaultRowHeight + Grid.GridLineWidth);
  for I := 0 to Grid.ControlCount - 1 do
  begin
    Grid.Controls[I].Top := Grid.Controls[I].Top - Shift;
    Grid.Controls[I].Visible := Grid.Controls[I].Top > 0;
  end;
end;

function TForm1.GetInsertRowCount(ARow: Integer): Integer;
begin
  //This function should return the number of rows which is to be inserted
  //below ARow. Note that ARow refers to the original row index, that is:
  //without account for already inserted rows. For now, assume three rows:
  Result := 3;
end;

function TForm1.GridButtonToRow(AButton: TButton): Integer;
begin
  for Result := 0 to Grid.RowCount - 1 do
    if Grid.Objects[0, Result] = AButton then
      Exit;
  Result := -1;
end;

procedure TForm1.MoveGridButtons(ButtonIndex, ARowCount: Integer);
var
  I: Integer;
begin
  for I := 0 to Grid.ControlCount - 1 do
    if Grid.Controls[I].Tag > ButtonIndex then
      Grid.Controls[I].Top := Grid.Controls[I].Top +
        ARowCount * (Grid.DefaultRowHeight + Grid.GridLineWidth);
end;

end.

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