[BC3] [Delphi] onclick probleem

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Anoniem: 21212

Topicstarter
goedendag. Ik heb hier een probleempje op m''n werk. Ik ben in Delphi een programma aan het maken. Aangezien ik deze taal niet gewend ben (heb in het verleden wel een tijd met pascal gewerkt, dus qua syntax is het me wel vertrouwd), zal deze vraag nogal wat knullig overkomen, dus b nice :) Ik had al wat geprobeerd om in de search te zoeken, maar kreeg niet echt datgeen wat ik zocht, dus vandaar dat ik er een topic over aanmaak.

Ik wil dus een procedure uitvoeren op het moment dat men op een knop drukt. Voorheen deed ik het altijd met de object inspector en dan event OnClick. Maar aangezien ik het nu moet invoeren aan de hand van code, zit ik dus best wel vast. Ik heb een knop:

button1

hierbij zit de optie onclick (button.onclick) nu wil ik dus invoeren, dat hij op het moment dat er op de knop wordt gedrukt een bepaalde procedure uitvoert. Ik heb:
code:
1
2
3
with form1 do begin;
button1.onclick:=procedurenaam;
end;

Dit mag dus absoluut niet van de compiler. Waarschijnlijk zeer logisch, maar ik ben nog te newbie in Delphi, om het te zien. Graag zou ik dus de regel willen hebben die wel werkt. Kan zijn dat ik de totaal verkeerde dingen gebruik, maar iig graag even advies ofsoh...

bedankt.

Acties:
  • 0 Henk 'm!

  • IWriteCode
  • Registratie: Juli 2000
  • Laatst online: 30-04 11:59

IWriteCode

Less = more

Waarschijnlijk is het type van je procedure niet goed.

Een OnClick event is van het type TNotifyEvent. Een procedure die je daaraan wil vastknopen moet dezelfde parameters hebben.
code:
1
2
3
4
procedure MyProc(ASender: TObject);
begin
  blabla;
end;

Post anders ff de procedure die gelinked moet worden.

Less = more


Acties:
  • 0 Henk 'm!

Anoniem: 21212

Topicstarter
ik heb in form1 een TEdit staan die edit2 heet. hier vult men een wachtwoord in en vervolgens moet er op de OK knop (button1) worden gedrukt. Dan gaat hij in de procedure vaag(sender : TObject) kijken of het ingevoerde klopt...

de procedure is:
code:
1
2
3
4
5
procedure vaag(sender: Tobject);
begin;
if form1.edit2.Text='julia' then
 showmessage('juiste wachtwoord');
end;

de foutmelding is:
[Error] MAIN.PAS(184): Incompatible types: ''TNotifyEvent'' and ''procedure, untyped pointer or untyped parameter''


de aanroep is:
code:
1
button1.OnClick:=vaag(form1.edit2);

Ik neem dus aan dat de fout zit in "vaag(form1.edit2);" maar, wat moet ik dan opsturen om het juist te krijgen...

of is er een hele andere manier om een wachtwoordverificaite te realiseren? Ik ben niet bekend met alle objecten in Delphi, dus vandaar dat ik deze heb gebruikt...

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 18-07 02:20

dusty

Celebrate Life!

Op maandag 23 april 2001 13:16 schreef poseidon het volgende:
code:
1
2
procedure vaag(sender: Tobject);
button1.OnClick:=vaag(form1.edit2);
Hint 1 : form1.edit2 != Tobject

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Anoniem: 21212

Topicstarter
dusty: ja dat weet ik ("waarom doe je het dan?", omdat volgens Delphi je een parameter moet toevoegen aan die procedure, anders mag hij niet aan onclick worden gelinked), maar wat is dan wel een TObject die werkt?

hint 2 misschien?

Acties:
  • 0 Henk 'm!

Anoniem: 4864

wat dacht je hier van?

(in je onclick procedure)
code:
1
button2click(sender);

:)

Acties:
  • 0 Henk 'm!

Anoniem: 21212

Topicstarter
RazorBlade: ksnap je weinig.

Het lukt me wel op de oude manier (in de IDE (zo heet dat ding toch?) op de knop te klikken, zodat hij een nieuwe procedure aanmaakt voor de event "onclick", maar daar wil ik dus de syntax voor, zodat ik de procedure die aan de event is gelinked later kan wijzigen, zodat er een andere functie aan de knop kan worden gelinked. Ik wil dit niet via de object inspector doen, maar dus gewoon zelf coden. Dat is de probleemstelling...

Acties:
  • 0 Henk 'm!

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 00:04

Tomatoman

Fulltime prutser

Misschien een typfoutje, maar er staat:
with form1 do begin;
Achter begin zou geen dubbele punt moeten staan. Effe controleren in je source code, want door zo''n puntkomma staat er vaak iets anders dan je bedoelt.

Een goede grap mag vrienden kosten.


Acties:
  • 0 Henk 'm!

Anoniem: 21212

Topicstarter
Op maandag 23 april 2001 14:26 schreef tomatoman het volgende:
Misschien een typfoutje, maar er staat:
with form1 do begin;
Achter begin zou geen dubbele punt moeten staan. Effe controleren in je source code, want door zo''n puntkomma staat er vaak iets anders dan je bedoelt.
die ";" is het probleem niet (dat werkt verder goed, geeft geen vage operaties)...

Acties:
  • 0 Henk 'm!

  • MerijnB
  • Registratie: Oktober 2000
  • Laatst online: 22:20
paste es wat meer code in de buurt van die error (en declaraties)

A software developer is someone who looks both left and right when crossing a one-way street.


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 18-07 02:20

dusty

Celebrate Life!

Hint 2: dubbel click eens op "on click" ''menu'' zodat hij zelf een functie aanmaakt als je erop klikt.

Zoek de verschillen.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Anoniem: 21212

Topicstarter
Ok, Het probleem is dus dat ik een knop heb, die wanneer erop gedrukt wordt een procedure laat runnen.

gedeclareerd zijn:
code:
1
2
3
form1   : TForm;
button1 : TButton;
edit1   : TEdit;

verder hebben we 2 procedures:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure button1_ingedrukt(Sender : TObject);
begin;
 if form1.button1.text='julia' then begin;
    showmessage('goede naam');
 end;
end;

procedure proggie;
begin;
with form1 do begin;
button1.Visible:=true;
edit1.Visible:=true;

// * (zie hieronder voor uitleg)

end;

* Hier moet dus komen te staan iets van:

if (button1.pressed=TRUE) then button1_ingedrukt(...);

Hoe voer ik deze bovenstaande regel in zodat Deplhi het begrijpt? en wat moet er op de "..." komen te staan?

Dusty: Zie m''n eerdere reply... (hij laat dan niet zien wat hij qua code wijzigt)

Acties:
  • 0 Henk 'm!

  • marcelk
  • Registratie: December 2000
  • Niet online
Zoek eens in de Delphi help naar TActionList. Dit component voorzietwaarschijnlijk in de functionaliteit die jij wilt.

Groeten,
Marcel

Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 22:36

Knutselsmurf

LED's make things better

Je moet als property instellen:
button1.onclick:=procedure;
dus zonder parameters. Dit moet al gebeuren in de initialisatie, dus bijvoorbeeld in de formcreate.
Vervolgens kun je die procedure schrijven. Zorg er wel voor dat deze procedure een methode is van het formulier, waar ook de button op staat.

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 22:36

Knutselsmurf

LED's make things better

Dus iets in deze vorm:

procedure form1.button1clicked(sender:TObject; nog_een_parameter:integer);
begin
//wat er ook maar moet gebeuren.
end;

in de declaratie van Button1:
onclick:=button1clicked;

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

Anoniem: 21212

Topicstarter
Op maandag 23 april 2001 15:31 schreef Knutselsmurf het volgende:
Je moet als property instellen:
button1.onclick:=procedure;
dus zonder parameters. Dit moet al gebeuren in de initialisatie, dus bijvoorbeeld in de formcreate.
Vervolgens kun je die procedure schrijven. Zorg er wel voor dat deze procedure een methode is van het formulier, waar ook de button op staat.
juist, op dit antwoord zat ik te wachten. Dit snap ik allemaal, maar hoe kan ik die event later dan weer wijzigen naar een andere procedure? of moet ik dan weer een nieuwe knop plaatsen? Dit is dus m''n probleem, dat ik wilde oplossen door het met code te doen ipv te klikken in de object inspector. Of hoe kan je meerdere procedures aan een knop linken, en dan laten bepalen in je code welke hij moet hebben?? Is dat mogelijk? zoiets moet toch te doen zijn, anders zou je voor elke verschillende "onclick"-event een aparte knop moeten plaatsen in je form.

Dit snap ik nog niet helemaal van Delphi...

Acties:
  • 0 Henk 'm!

  • MerijnB
  • Registratie: Oktober 2000
  • Laatst online: 22:20
maar hoe kan ik die event later dan weer wijzigen naar een andere procedure?
je kan gewoon die Button1.OnClick veranderen wanneer je wilt in een andere procedure.

Merijn

A software developer is someone who looks both left and right when crossing a one-way street.


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 18-07 02:20

dusty

Celebrate Life!

Op maandag 23 april 2001 15:39 schreef poseidon het volgende:
Dit snap ik nog niet helemaal van Delphi...
Moet je ook niet doen.

Maak 2 knoppen zet ze op elkaar.

Druk je op de een zet je zijn knop op "invisible" en de andere knop op "Visible". En vice Versa.
Hierdoor is je code makkelijker te onderhouden.

:+

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 22:36

Knutselsmurf

LED's make things better

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  label1.Caption:='methode 1';
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
  label1.Caption:='methode 2';
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
   BUTTON1.OnClick:=button3click;
end;

end.

Bovenstaande werkt dus bij mij. Heb een formulier met 2 knoppen en een label. Let er wel op dat de Button3click, die met de hand gemaakt is, niet tussen de private of public declaraties komt te staan.

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • IWriteCode
  • Registratie: Juli 2000
  • Laatst online: 30-04 11:59

IWriteCode

Less = more

De fout is precies wat de foutmelding zegt:
[Error] MAIN.PAS(184): Incompatible types: ''TNotifyEvent'' and ''procedure, untyped pointer or untyped parameter''
Het moet een methode pointer zijn... dus het moet een procedure binnen een klasse zijn.

Succes!

Less = more


Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 22:36

Knutselsmurf

LED's make things better

Zoals in het stukje code hierboven is uitgewerkt.........

- This line is intentionally left blank -

Pagina: 1