Przypisanie zdarzeniu OnClick tej samej procedury z przekazaniem parametrów.

0

Problem prawdopodobnie jest banalny jednak nie mogę sobie z nim poradzić.

Mianowicie definicje oraz fragment kodu wygląda następująco:

  type
    ButtonHandles = packed record
      AButtonHandle:array[1..MaxButtonNumber] of TButton;
      ButtonsTotal:byte;
    end;
    RTabButtonArray = packed record
       ATabHandle: array[1..MaxTabNumber] of TTabSheet;
       AButtonHandles: array[1..MaxTabNumber] of ButtonHandles;
       TabsTotal:byte;
    end;
var
    TabButtonArray:RTabButtonArray;

procedure TMainWindow.CreateNewButton(Sender: TObject;var TabNumber:integer);
var ButtonNumber:byte;
begin
  if Sender is TTabSheet then
     begin
       inc(TabButtonArray.AButtonHandles[TabNumber].ButtonsTotal);
       ButtonNumber:=TabButtonArray.AButtonHandles[TabNumber].ButtonsTotal;
       TabButtonArray.AButtonHandles[TabNumber].AButtonHandle[ButtonNumber]:=
                  TButton.Create(TabButtonArray.ATabHandle[TabNumber]);
       with TabButtonArray.AButtonHandles[TabNumber].AButtonHandle[ButtonNumber] do
       begin
         Parent:=TabButtonArray.ATabHandle[TabNumber];
         Left:=20;
         Top:=20;
         Width:=120;
         Visible:=true;
         Name:='ButtonT'+IntToStr(TabNumber)+'N1';
         Caption:='Dodaj kolejny';         OnClick:=MainWindow.CreateNewButton(TabButtonArray.AButtonHandles[TabNumber].AButtonHandle[1],TabNumber);
       end;
     end
  else
     if Sender is TButton then
     begin
     end;

end;

Podczas kompilacji pojawia się błąd: E2010 Incompatible types: 'TNotifyEvent' and 'procedure, untyped pointer or untyped parameter'. Dotyczy on przypisania zdarzeniu OnClick procedury. Wydaje mi się, że problem dotyczy przekazywanego parametru TabNumber i można to obejść poprzez użycie zmiennej globalnej, jednak w jaki sposób można przekazać ją jako parametr procedury?

0
       inc(TabButtonArray.AButtonHandles[TabNumber].ButtonsTotal);
       ButtonNumber:=TabButtonArray.AButtonHandles[TabNumber].ButtonsTotal;
       TabButtonArray.AButtonHandles[TabNumber].AButtonHandle[ButtonNumber]:=
                  TButton.Create(TabButtonArray.ATabHandle[TabNumber]);
       with TabButtonArray.AButtonHandles[TabNumber].AButtonHandle[ButtonNumber] do

Zbyt dużo DRY na metr kwadratowy!

2.Gdzie występuje ten błąd?
3.Może nie używasz operatora @?

0
OnClick:=MainWindow.CreateNewButton(TabButtonArray.AButtonHandles[TabNumber].AButtonHandle[1],TabNumber);

Że co to jest? Powinno być coś w tylu OnClick:= MojaProceduraOnClick; lub OnClick:= @MojaProceduraOnClick;
Poza tym trudno cokolwiek odczytać z tego kodu :/

0

Моże powiedz co próbujesz osiągnąć?

Czemu nie zrobisz po ludzku:

procedure TForm1.ButtonClick(Sender: TObject);
var Btn:TButton;
var Tab:TTabSheet;
begin
  Btn:=TButton(Sender);
  Tab:=TTabSheet(Btn.Parent);
  Btn:=TButton.Create(Self);
  Btn.Left:=8;
  Btn.Top:=8+32*Tab.ControlCount;
  Btn.Caption:='Dodaj kolejny';
  Btn.Name:='Btn'+IntToStr(Integer(Btn));
  Btn.Parent:=Tab;
  Btn.OnClick:=ButtonClick;
end;
0

Wybaczcie, że zabałaganiłem forum, zafiksowałem się nad tym i w ogóle zapomniałem, że całe działanie funkcji programu miało inaczej wyglądać.
Odrobina odpoczynku działa cuda.

Zdarzeniu OnClick tworzonego przycisku przypisałem drugą funkcję rozpoznającą, który z buttonów został naciśnięty - tak miało to początkowo wyglądać.

Temat do usunięcia.

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