Thema: Delphi Buttons in Stringgrid

Einzelnen Beitrag anzeigen

IMPEGA

Registriert seit: 19. Jan 2008
Ort: Brhv
83 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Buttons in Stringgrid

  Alt 25. Jul 2011, 18:44
Hi Leute
Ich habe ziemlich lange gegoogelt, leider nichts passendes gefunden.
Auch hier in Forum konnte ich keine Antwort auf meine Frage finden. Vielleicht packe ich es falsch an.

Nun zum Problem
Ich versuche eine Tabelle zu erstellen, soweit so gut, (Stringgrid)
Das letzte Row sollte aber als Button dargestellt werden und beim click sollte die Zeile gelöscht werden.
Hier ist mein TestProjekt

Es wird nur ein Stringgrid benötigt
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,Buttons, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure FormCreate(Sender: TObject);

    procedure MyClick(Sender: TObject);
    procedure MyClick2(Sender: TObject) ;

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Btn: array [1 .. 100] of TSpeedButton;
  I : Integer;

implementation

{$R *.dfm}

procedure StringgridDeleteRow(const Grid : TStringGrid; RowNumber : Integer);
var
  i : Integer;
begin
  for i := RowNumber to Grid.RowCount - 2 do
    Grid.Rows[i].Assign(Grid.Rows[i+ 1]);
  Grid.Rows[Grid.RowCount-1].Clear;
  Grid.RowCount := Grid.RowCount - 1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  for I := 1 to StringGrid1.RowCount -1 do
  begin
     Btn[I] := TSpeedButton.create(self);
     Btn[I].parent := Stringgrid1;
     Btn[I].Caption := 'Löschen ' + inttostr(i);

     //if i = 1 then
      Btn[I].OnClick := MyClick;
       //StringgridDeleteRow(StringGrid1, 2);
     //if i = 2 then
      // StringgridDeleteRow(StringGrid1, 3);
      // Btn[I].OnClick := MyClick2;

  end;

  Stringgrid1.ColWidths[0] := 30;
  Stringgrid1.ColWidths[1] := 100;
  Stringgrid1.ColWidths[2] := 150;
  Stringgrid1.ColWidths[3] := 250;
  Stringgrid1.ColWidths[4] := 100;

  StringGrid1.Cells[0,0] := 'Nr:';
  StringGrid1.Cells[1,0] := 'Serie';
  StringGrid1.Cells[2,0] := 'Folge';
  StringGrid1.Cells[3,0] := 'Adresse';
  StringGrid1.Cells[4,0] := 'Löschen';
end;

procedure TForm1.MyClick(Sender: TObject) ;
begin
  showmessage('Button');
end;

procedure TForm1.MyClick2(Sender: TObject) ;
begin
  showmessage('Button 2');
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 {Das gehört zum Button erstellen ***************************}
  with TStringGrid(Sender) do
   if (Acol >= Fixedcols) and (ARow >= Fixedrows) then
    begin
      if (ACol = 4) then
        begin
          Btn[ARow].BoundsRect := Rect;
          Btn[ARow].visible := true;
        end;
    end;
{************************************************************}
end;

end.

Ich habe versucht ein Parameter an die MyClick Procedur zu schicken. Das geht wohl nicht. Google hat's bestätigt.
Dann habe ich versucht global ein Integer zu deklarieren und an Btn[I] abzukoppeln. Das geht auch nicht.
Nur wenn ich für jeden Button ein OnClick Ereignis erstelle funktioniert es.
Das Problem ist aber ich wei0 nicht wie viel Zeilen es werden, bzw. die Zeilen werden ständig gelöscht und neu erstellt.
In meinem Testcode habe ich es eingefügt wie ich es meine.

Anreize wie man es lösen könnte wären gerne gesehen. Ich bin nur ein Anfänger also bitte habt Verständnis für mich.
Gerne schaue ich mir andere Methode, wie man es lösen könnte.
Wichtig ist nur.
Es werden Zeilen hinzugefügt und sollten per Button in der letzten Spalte wider gelöscht werden können.
Jede Hilfe ist gerne willkommen.
  Mit Zitat antworten Zitat