Avatar billede -sippo- Nybegynder
20. september 2002 - 01:48 Der er 11 kommentarer og
2 løsninger

2 i en: popup og button spørgsmål

jeg har lige to problemmer i mit program..
1. jeg har fire buttons ved navn bt0, bt1, osv.
  er der en måde så man kan vælge vilken en man
  vælger med en integer.
  fks:
  i:= 1 ;
  bt[i].caption := 'bla bla'.
2.
de fire knapper skal os have en popup menu. og jeg vile gerne at de deler den samme, men med forskelige funktioner. (kan selfølgelig godt lave en til hver af dem, men vil gerne lære noget nyt idag =)

håber i kan hjælpe... der er 30 point ti vert spørgsmål.. ahh lad os sige 40..
Avatar billede doc404 Novice
20. september 2002 - 10:09 #1
Du kan lave an array of TButton og så i din FormCreate initializeren den

var
  Btns : array[0..3] of TButton;

procedure xxx.FormCreate...
begin
  Btns[0] := Btn0;
  Btns[1] := Btn1;
  ..
end;

Så kan du referer til dine buttons med Btns[x] i resten af dit program.

2: Det bliver noget rod tror jeg.. Du skal afgøre fra hvilken knap din menu blev aktiveret - og det kan man ikke umiddelbart.. Du kunne selvfølge lege med menuens position e.l. Men det bliver ikke rigtig kønt
Avatar billede borrisholt Novice
20. september 2002 - 10:35 #2
var det ikke nemmere at brude der array der allerede ER indbygger i din TForm :-)

du skal bruge den property der hedder Components.

Noget alla det her (Frit fra leveren) :

var
  i : Integer;
  aButton : TButton; //Og N E J den skal I K K E oprettes med create :-)
begin
  for i := 0 to ComponentsCount -1 do
  begin
    if not (Component[i] is TButton) then
      Continue;
    aButton :=  TButton(Component[i]);
    if aButton.Name = 'bt0' then //H U S K der er forskel på store og små bogstaver
      aButton.Caption := 'Hest0';
    etc ...
  end;
end;

2)
  Igen frit fra leveren :
  Såvidt jeg husker, og den slags er svært for en mand der lige er runder 30, og har haft 14 dages sommerferie, har en popupmenu et onPopup event af typen TNotifyEvent. Så derfor kan du bruge Sender variablen som du får udlevert af samme grund :-)

Altså

procedure TForm1.PopupMenu1Popup(Sender : TObject); //Eller noget ligende
var
  aButton : TButton;
begin
  if not (Sender is TButton) then
    Exit; // Hvis vi ikke bliver kaldt fra en knap så skrid :-)
  aButton := TButton(Sender);
  if  aButton.Name = 'bt0' then // do what ever, og helst noget med en hest
  etc
end;

Jens B
Avatar billede doc404 Novice
20. september 2002 - 10:41 #3
jens b> din sender i PopUp er da din popup menu... stadig tømmermænd ;-)
Avatar billede borrisholt Novice
20. september 2002 - 11:08 #4
doc404>> Skal du nu også til at forvire mig med kensgerninger ? Og hvad har sådan en lattelig detalje som virkligheden med det hele at gøre ?

Så må man håndtere det på hver enkelt knap på onmousedown. initialiser din popup menu der, for så at kalde :

Popupmenu1.popup(x,y).

Husk din kanm skal I K K E have popupmenuen assignedet til sig :-)

Jens B
Avatar billede doc404 Novice
20. september 2002 - 11:24 #5
jens b> beklager...Men det MÅ være gået op for dig.. Efter de 30 vælter alle mulige grimme kendsgerninger ned over en...
Avatar billede -sippo- Nybegynder
20. september 2002 - 13:28 #6
nå ja.. doc404 du har sikret dig 30 points. for den første løsning.
og jens... den ku jeg helt finde ud af..

jeg mener at have fundet løsningen på det andet problem ved at give knapperne en onmousemove funktion det giver besked om vilken knap man er over. smart ik :) men men men der kan stadig scores point for den, da jeg gerne vil kunne laved knappernes onmousemove i formcreate, jeg ved nemlig ik hvordan man gør sådan noget..

fks
i:= 0
repeat
btns[i].onmousemove ????
until 1 = 3 ;
Avatar billede doc404 Novice
20. september 2002 - 14:35 #7
Tilføje følgende i din forms deklaration
  ...
  protected
    procedure MouseMoveHandler(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  ...

Lav denne procedure

procedure TForm1.MouseMoveHandler(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  // do what ever
end;

Og i FormCreate
  btns[i].onmousemove := MouseMoveHandler;
Avatar billede -sippo- Nybegynder
20. september 2002 - 14:59 #8
jammen det giver da bare den samme funktion til alle knapperne.
de skal have en ver.
prøver lige igen
btns[0].onmousemove do i:= 0
btns[1].onmousemove do i:= 1
osv.
håber det ik bare er fordi jeg ik forstår hvad du skriver.jeg ik sååå fee til delphi endnu
Avatar billede borrisholt Novice
20. september 2002 - 15:32 #9
var
  i : Integer;
  aButton : TButton; //Og N E J den skal I K K E oprettes med create :-)
begin
  for i := 0 to ComponentsCount -1 do
  begin
    if not (Component[i] is TButton) then
      Continue;
    aButton :=  TButton(Component[i]);
    if aButton.Name = 'bt0' then
      aButton.onmousemove := MouseMoveHandler;
    etc ...
  end;
end;
Avatar billede -sippo- Nybegynder
20. september 2002 - 16:02 #10
sådan nu har jeg fået det til at virke.. og tusind tak til jer begge to for at have tolmodighed til at hjælpe.. 40 til ver af jer..
og hvis det skulle interasere nogle ligger jeg lige den ferdige kode ud i en komentar om lidt..
Avatar billede -sippo- Nybegynder
20. september 2002 - 16:02 #11
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    btn0: TButton;
    PopupMenu1: TPopupMenu;
    do1: TMenuItem;
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure do1Click(Sender: TObject);

  protected
    procedure MouseMoveHandler(Sender: TObject; Shift: TShiftState; X, Y: Integer);

  private
    Btns : array[0..3] of TButton;
    btn:integer;
    i:integer;
  public
    { Public declarations }


  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.MouseMoveHandler(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  i:integer;
  aButton : TButton;
begin
  aButton := TButton(Sender);
  i:= 0 ;
  repeat
    if  aButton.Name = 'btn' +inttostr(i) then btn:= i  ;
    i:= i +1 ;
  until i = 4 ;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  i:= 0 ;
  Btns[0] := Btn0;
  Btns[1] := Btn1;
  btns[2] := btn2;
  btns[3] := btn3;
  repeat
    btns[i].onmousemove := MouseMoveHandler;
    i:= i +1 ;
  until i = 4
end;

procedure TForm1.do1Click(Sender: TObject);
begin
  edit1.Text := 'bt' +inttostr(btn) ;
end;

end.
Avatar billede borrisholt Novice
21. september 2002 - 18:59 #12
sippo>> Jammen det var da så lidt :-) Der er folk som dig der gør jeg stadig er på eksperten. Du stillere relevante spm, og gidder at arbejde med det selv !!!

Jens B
Avatar billede -sippo- Nybegynder
21. september 2002 - 19:46 #13
ahh nu rødmer jeg jo...
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