Avatar billede dino-cjp Nybegynder
13. oktober 2000 - 13:05 Der er 20 kommentarer og
1 løsning

Event problem (nok ret simpelt?!?)

Jeg har det problem at jeg har lavet en masse knapper (vha. button[i]=tbutton.create) og derefter giver jeg dem properties ala:

button[i].name := \'a\'+inttostr(i);
...

det er fint nok hertil, men alle knapperne skal køre forskellige procedurer...:( jeg har skrevet det her, men der virker ikke:

button[i].onclick := bpress(i);

hvordan kan jeg ellers checke hvilken knap der er blevet trykket?!?
Avatar billede powell Nybegynder
13. oktober 2000 - 13:10 #1
Jeg jender ikke delphi men VB.

Og i VB gør jeg det sådan at jeg tjekker på navnet af knappen. Hvis en knap har det-og-det navn kører den følgende rutine (og evt. ændrer knappens navn, så næste gang den bliver trykket ned udfører den en anden funktion)
Avatar billede borrisholt Novice
13. oktober 2000 - 13:13 #2
En buttons OnClick event vil have en porcedure alla den her :

TForm1.ButtonClick(Sender : TObject);


fidusen er så at i din sender variabel har du den knap der har kaldt dit event ...

prøv fx det her :

procedure TForm1.Button1Click(Sender: TObject);
var
  Button : TButton;
begin
  Button := TButton.Create(Form1);
  with Button do
  begin
    Left := 10;
    Top := 10;
    OnClick := ButtonClick;
    Caption := \'HEST\';
  end;
InsertControl(Button);
end;

procedure TForm1.ButtonClick(Sender: TObject);
begin
  with (Sender as TButton) do
    ShowMessage(Caption);
end;


Jens B
Avatar billede pellelil Nybegynder
13. oktober 2000 - 13:13 #3
Din OnClick event har en \"Sender\" som er en \"pointer\" til den der sender meddelelsen og det vil i dette tilfælde sige \"den knap\" er blev trykket på.
Avatar billede pellelil Nybegynder
13. oktober 2000 - 13:14 #4
Borrisholt> Det er sgu da klart at dit svar kommer 6 sekunder hurtigere end mit når du \"bruger HEST\"  ;-)
Avatar billede delphi Nybegynder
13. oktober 2000 - 13:16 #5
Har jeg forstået det rigtigt, hvis jeg tror at det du vil, er at have en masse knapper på dit window som alle kalder EN metode, således at der mere eller mindre udføres den samme handling for alle knapper - Forskellen er måske bare hvilken variabel der tælles op i et array?

I så tilfælde vil di onClick metode have en parameter du kan bruge.  (Jeg mener at den heder Sender og er af typen TObject).

Du har flere muligheder:

Procedure ButtonClick(Sender :; TObject);
Begin
  If Sender = Button1 Then ....;
  If Sender = Button2 Then ....;
End;

Noget spazzet metode.

Andet forslag, og noget smartere.

Alle dine buttons har en property kaldet tag.  Sæt denne tag med en unik værdi for hver button, alá:

For i := 0 to MaxNo
  button[i].tag := i;

Skriv så i din button click metode (som alle din buttons onClick event peger på):

Procedure ButtonClick(Sender :; TObject);
Var
  ButNo : Integer;
Begin
  ButNo := (Sender As TButton).Tag;

  Tabel[ButNo] := Tabel[ButNo] + 1;
End;

Tabel[] er her en array hvor hvert element tælles en op for hvergang en button trykkes.


Bemærk at det her er AS operatoren der er spændende - slå den op i hjælpen med F1.

(Fra hovedet - dvs. ikke afprøvet)

Delphi
Avatar billede delphi Nybegynder
13. oktober 2000 - 13:18 #6
Man får ikke mange sekunder til at digte et svar her i firmaet...
Avatar billede dino-cjp Nybegynder
13. oktober 2000 - 13:18 #7
Jeg vidste havde godt regnet med at det var sender der var nøglen i det hele men jeg vidste ikke hvordan den virkede.....

Nu er \"caption\" tom på alle knapper, men \"sender\" indeholder vel også \"name\" og alle de andre properties ?!? :)
Avatar billede borrisholt Novice
13. oktober 2000 - 13:19 #8
Og den store forskel er ?
Avatar billede delphi Nybegynder
13. oktober 2000 - 13:19 #9
Borris>> du opretter en button i din button click.... du mener vel i din FormCreate, ik?  (og hvor egentligt lave knapperne under runtime? - bare fordi man kan, eller hva\'?)

Delphi
Avatar billede borrisholt Novice
13. oktober 2000 - 13:20 #10
pellelil  >> Hvordan kan man skrive et program uden at bruge ordet HEST ?

Jens B
Avatar billede delphi Nybegynder
13. oktober 2000 - 13:22 #11
Det er lidt dumt at søge på sender\'s name eller caption properties, alene af den grund at disse (ihvert fald captionen) kan ændres, hvis applikationen benyttes på forskellige sprog.  Desuden giver det en masse nestede IF sætninger.  Jeg foretrækker metoden med at give knappernes tag property en værdi og så teste på den.  Det er hurtigere og sikrere og så er det iøvrigt derfor Borland gav alle controls en tag property - men hver mand sin lyst.

Peter
Avatar billede dino-cjp Nybegynder
13. oktober 2000 - 13:22 #12
Hmmm... tak.. i er damn hurtige..... jeg er lidt newbie på eksperten.dk.... kan det passe at man kun kan acceptere svar en gang ??
Avatar billede delphi Nybegynder
13. oktober 2000 - 13:23 #13
Jeps
Avatar billede delphi Nybegynder
13. oktober 2000 - 13:23 #14
men du kan dele point\'ene på flere personer.
Avatar billede pellelil Nybegynder
13. oktober 2000 - 13:28 #15
borrisholt> Det er sgu da derfor min InterBase driller mig lidt. Der er ingen HEST\'e med.

dino-cip> sender er en pointer der peger på afsenderen og som hvis du gør som flg: \"if (sender AS TBUTTON).Caption = \'\' then bla.bla.bla.\" men jeg ville i stedet bruge pointeren direkte

<SNIP>
  case sender of
    button[1] : bla. bla. bla.; 
    button[2] : bla. bla. bla.; 
    button[3] : bla. bla. bla.; 
    button[4] : bla. bla. bla.; 
  end;
</SNIP>

Kan man lave en case på en pointer? Tjaee det kan man vel - jeg har dog ikke prøvet.
Avatar billede dino-cjp Nybegynder
13. oktober 2000 - 13:29 #16
delphi>> grunden til at de skal laves under run-time er at der skal laves 10*10 af dem... altså et et helt skema... og det skal kunne varieres :)
Avatar billede delphi Nybegynder
13. oktober 2000 - 13:32 #17
Borris>> HEST er et, efter min erfaring, noget overdrevet fænomen i forbindelse med Delphi programmering.  Jeg får faktisk en del bedre resultater, hvis jeg undelader mere eller mindre tilfældig brug af begrebet HEST i min kode - om ikke andet, så er min compiler mere tilbøjeligt til at æde koden uden kedelige fejl og advarsler. Har man tilbøjelighed til at placere mere eller mindre relevante samlinger af tegn og bogstaver i sin kode, så vil jeg anbefale at man benytter tegner \';\' (semikolon), idet compileren ikke ser ud til at have så meget imode dette tegn, evt i en serie som fx. \';;;;\', som den har imod HEST. 

Delphi
Avatar billede delphi Nybegynder
13. oktober 2000 - 13:34 #18
Jamen så er det da så meget mere naturligt at du benytter TAG, idet din kode så ikke er afhængig af antallet af buttons.  Laver du en struktur som:

<SNIP>
  case sender of
    button[1] : bla. bla. bla.; 
    button[2] : bla. bla. bla.; 
    button[3] : bla. bla. bla.; 
    ...
    button[100] : bla. bla. bla.; 
  end;
</SNIP>

Så fylder det dels 100+ linier og dels skal du lave koden om hvis du en dag skal have 101 buttons. Dette er ikke nødvendigt med tags.

Delphi
Avatar billede pellelil Nybegynder
13. oktober 2000 - 14:09 #19
Sålænge button er et array så er det vel hip-som-hap om man gør det ene eller det andet (tag eller pointeren) da man bare kan bruge arrayet.

HEST eller ikke-HEST; jeg mindes stadig den dag hvor kunden undrede sig over at der lige pludslig stor \"HUGO\" midt på skærmen og at en programmør blev rød i hovedet.
Avatar billede borrisholt Novice
13. oktober 2000 - 14:23 #20
Af at være et test ord er HUGO ikke så slemt ..
fi.... havde da været værer eller noget ligende ...

Jens B
Avatar billede delphi Nybegynder
13. oktober 2000 - 15:04 #21
Forøvrigt, på et noget mere personligt plan, kan jeg sige, at nu er jeg nok lidt væk de næste 14 dag.  Jeg har valgt mig et nyt firma at arbejde i.  Danfoss blev lidt for meget efter 14 år...

Delphi
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