Avatar billede geek Nybegynder
17. november 2002 - 01:35 Der er 4 kommentarer og
3 løsninger

OnClick event på runtime kanpper

Jeg har lavet en stak knapper runtime, og vil gerne have at når man klikker på en af dem skifter den farve, hvordan gør man det ??

min kode indtil nu:

procedure TForm1.Button1Click(Sender: TObject);
var
  Button: TButton;
  x,y : integer;
begin
  for y := 0 to 2 do
  begin
    for x := 0 to 2 do
    begin
      Button := TButton.Create(self);
      Button.Name := 'Pan' + inttostr(x) + 'x' + inttostr(y);
      Button.Parent := form1;
      Button.Width := 40;
      Button.Height := 40;
      Button.Top := y*40;
      Button.Left := x*40;
    end;
  end;
end;
Avatar billede geek Nybegynder
17. november 2002 - 04:27 #1
har lige smidt lidt flere point i.
Kunne nemlig også god tænke mig at vide hvordan jeg sletter en af de knapper jeg har lavet ?
F.eks. hvordan jeg sletter knappen Pan1x1 ??
Avatar billede a_schack Nybegynder
17. november 2002 - 10:45 #2
Uha, det bliver en lang en...:
Først skal du lave en procedure
procedure TForm1.ButtonClick(Sender: TObject);
begin
//kode, der skal udføres når du klikke på knappen
end;
Vær opmærksom på, at proceduren kan hedde hvad du har lyst til, men den skal have én parameter, nemlig Sender: TObject

Derefter skal du sætte din procedure til at være event-handler for OnClick event'en:
Button.OnClick:=ButtonClick;

Hvis du vil fjerne den fra din form skal du sætte knappens parent til nil.
Det vil nok være en god ide at lave en free på den efterfølgende.
Avatar billede morten_s Nybegynder
17. november 2002 - 10:59 #3
Her har du lidt kode, som kan indsætte nye knapper og slette knappen som du har valgt i din spinedit:

1 start en ny applikation
2 put to TBuuton på, Button1.Caption:= ny knap, Button2.Caption := Slet knap
3 put en Spin edit på din form
4 indsæt nedenstående kode

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, ColorGrd;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    SpinEdit1: TSpinEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure BtnClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  KnapNr: Integer = 1;
  XPos: Integer = 100;
  YPos: Integer = 100;
implementation

{$R *.dfm}

procedure TForm1.BtnClick(Sender: TObject);
var
  btn: TButton;
begin
  if sender is TButton then
  begin
    btn := (Sender as TButton);
    ShowMessage('Jeg er:'+ btn.Caption);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TButton.Create(Form1) do
  begin
    Parent:= Form1;
    Caption:= 'Knap nr: '+IntToStr(KnapNr);
    Left:= XPos;
    Top:= YPos;
    Tag:= KnapNr;
    OnClick:= BtnClick;
  end;
    Inc(KnapNr);
    XPos := XPos + 20;
    YPos := YPos + 20;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  btn: TButton;
  i: Integer;
begin
  i:= 0;
  while i < ComponentCount  do
  begin
    if (Components[i] is TButton) then
    begin
      btn:= (Components[i] as TButton);
      if btn.Tag = SpinEdit1.Value then
        btn.Free;
    end;
    inc(i);
  end;
end;

end.
Avatar billede morten_s Nybegynder
17. november 2002 - 11:01 #4
Hvis du ligger din mailadr så sender jeg dig koden
Avatar billede morten_s Nybegynder
17. november 2002 - 11:07 #5
Hvis du vil have den til at skifte farve skal du bruge en bitbtn istedet, brug ovenstående eksempel men placer også et ColorGrid på din form, dine knapper vil nu få ColorGridets Forground color når du klikker på dem

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    SpinEdit1: TSpinEdit;
    ColorGrid1: TColorGrid;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure BtnClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  KnapNr: Integer = 1;
  XPos: Integer = 100;
  YPos: Integer = 100;
implementation

{$R *.dfm}

procedure TForm1.BtnClick(Sender: TObject);
var
  btn: TBitBtn;
begin
  if sender is TBitBtn then
  begin
    btn := (Sender as TBitBtn);
    btn.Font.Color:= ColorGrid1.ForegroundColor;
    ShowMessage('Jeg er:'+ btn.Caption);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TBitBtn.Create(Form1) do
  begin
    Parent:= Form1;
    Caption:= 'Knap nr: '+IntToStr(KnapNr);
    Left:= XPos;
    Top:= YPos;
    Tag:= KnapNr;
    OnClick:= BtnClick;
  end;
    Inc(KnapNr);
    XPos := XPos + 20;
    YPos := YPos + 20;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  btn: TBitBtn;
  i: Integer;
begin
  i:= 0;
  while i < ComponentCount  do
  begin
    if (Components[i] is TBitBtn) then
    begin
      btn:= (Components[i] as TBitBtn);
      if btn.Tag = SpinEdit1.Value then
        btn.Free;
    end;
    inc(i);
  end;
end;

end.
Avatar billede hermandsen Juniormester
17. november 2002 - 12:36 #6
Var det ikke en ide at oprette er array af TButton?

public
  Knapper: array [0..2, 0..2] of TButton;
  procedure KnapKlik(Sender: TObject); //OnClick-event
  procedure FjernKnap(Sender: TObject); //Når knappen skal fjernes

//OnClick-event
procedure TForm1.KnapKlik(Sender: TObject);
begin
  (Sender as TButton).Color := RGB(Random(256), Random(256), Random(256));
end;

//OnDblClick-event (dobbeltklik, fjerner knappen)
procedure TForm1.FjernKnap(Sender: TObject);
begin
  (Sender as TButton).Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  B: TButton;
  x,y : integer;
begin
  for y := 0 to 2 do
    for x := 0 to 2 do
    begin
      B := TButton.Create(self);
      B.Name := 'Pan' + inttostr(x) + 'x' + inttostr(y);
      B.Parent := form1;
      B.Width := 40;
      B.Height := 40;
      B.Top := y*40;
      B.Left := x*40;
      B.OnClick := KnapKlik;
      B.OnDblClick := FjernKnap;
      Knapper[x, y] := B;
    end;
end;

procedure TForm1.FormClose(Sender: TObject);
var
  x,y : integer;
begin
  for y := 0 to 2 do
    for x := 0 to 2 do
      Knapper[x, y].Free;
end;

//hermandsen
Avatar billede geek Nybegynder
18. november 2002 - 03:15 #7
Tusind tak for svarende...
Brugte Morten_s's kode, syntes det passede bedst ind, da min kodestump var blevet ændret en smule da svarende kom :)

Har givet alle en smule point, man bliver jo ikke dummere af at lære lidt mere :)

Geek
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester