Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - OnClick=meineProcedure + noch ne var übergeben?


saite - Mi 20.10.04 04:17
Titel: OnClick=meineProcedure + noch ne var übergeben?
Hallo!

Ich habe mich jetzt zu tode gesucht und auch viel gefunden, aber nirgendwo stand was, was mein Problem betrifft:

ich habe ein TEdit , das ein onClick event besitzt und zur Laufzeit erstellt wird.
in der selben Procedure wo dieses Edit erstellt wird, wird auch mit einer lokalen variablen 'btn_weiter' ein Button erstellt.

..ich schaff es einfach nicht, dass beim Clicken auf das TEdit der Button.Enabled = false gesetzt wird...

Ich habs auf sehr viele arten probiert mit z.b.

(FindComponent('btn_weiter') as TButton).Enabled:=false; in der neuen Procedure usw..

aber nix läuft..

gibt es nicht eine möglichkeit, einfach den Button zusätzlich zum Sender mit an die Procedure zu übergeben?
z.b.
procedure TForm1.txt_change(Sender: TObject; meinButton: TButton);
und dann
OnClick:=txt_change(self,btn_weiter);
(funktioniert nicht.. hab ich schon ausprobiert...)

hier mein Ausgangscode:

Delphi-Quelltext
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:
procedure TForm1.txt_change(Sender: TObject);
begin
  if Length((Sender as TEdit).Text)>0
    then btn_weiter.Enabled:=true  //btn_weiter muss noch irgendwie übergeben werden
    else btn_weiter.Enabled:=false  //btn_weiter muss noch irgendwie übergeben werden
end;

procedure TForm1.btn_lektion_abfragenClick(Sender: TObject);
var
  en: TEdit;
  btn_weiter: TButton;
begin
  btn_weiter := TButton.Create(Form_abfrage);
  with btn_weiter do
    begin
      Parent:=Form_abfrage;
      Caption:='weiter';
      Width:=100;
      Height:=25;
      Left:=Form_abfrage.Width-btn_abfrage_beenden.Width-20;
      Top:=Form_abfrage.Height-btn_abfrage_beenden.Height-150;
      Enabled:=false;
      OnClick:=h
    end;
  en := TEdit.Create(Form_abfrage);
  with en do
    begin
      Parent:=Form_abfrage;
      Width:=200;
      MaxLength:=50;
      Height:=10;
      Left:=100;
      Top:=100;
      Font.Name:='Verdana';
      setFocus;
      OnChange:=txt_change
    end
end;


...im Endeffekt soll es nur darauf hinauslaufen, dass man nur auf weiter clicken kann, wenn was in dem TEdit steht...

bin für jede Hilfe dankbar!!!

grz
saite


smiegel - Mi 20.10.04 08:51

Hallo,

so wird das nichts. Es macht keinen Sinn das OnChange des TEdit zu nehmen. Dieses Ereigniss wird bei jeder Änderung im Editfeld abgefeuert. Was Dir eher nützen wird sind die Ereigniss OnEnter und OnExit. Diese Ereignisse werden ausgelöst, wenn ein Control den Fokus erhält bzw. verliert.


jasocul - Mi 20.10.04 08:58

@smiegel:
Kann problematisch werden. Der Button soll ja disabled werden, wenn im Edit nichts drinsteht.
- OnEnter kann eventuell gar nicht ausgelöst werden. D.h.: Der Status des Button wird nicht gesetzt und nach Standard Enabled.
- OnExit: Wenn man mit der Maus arbeitet, kann der Button vielleicht ausgelöst werden, bevor das Ereignis abgearbeitet wird.

Ich hätte das auch im OnChange gemacht. Bei Tastatureingaben ist es auch nicht zeitkritisch und wenn man geschickt programmiert, wird der Status des Button auch nicht bei jedem Tastendruck gesetzt. Außerdem wird OnChange auch ausgelöst, wenn das Edit vom Programm mit Daten gefüttert wird.


Phantom1 - Mi 20.10.04 08:59

Es gibt mehrere möglichkeiten, hier ist zb eine:


Delphi-Quelltext
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:
procedure TForm1.txt_change(Sender: TObject);  
begin  
  TButton(TEdit(Sender).Tag).Enabled:=Length(TEdit(Sender).Text)>0
end;  
 
procedure TForm1.btn_lektion_abfragenClick(Sender: TObject);  
var  
  en: TEdit;  
  btn_weiter: TButton;  
begin  
  btn_weiter := TButton.Create(Form_abfrage);  
  with btn_weiter do  
    begin  
      Parent:=Form_abfrage;  
      Caption:='weiter';  
      Width:=100;  
      Height:=25;  
      Left:=Form_abfrage.Width-btn_abfrage_beenden.Width-20;  
      Top:=Form_abfrage.Height-btn_abfrage_beenden.Height-150;  
      Enabled:=false;  
      OnClick:=h  
    end;  
  en := TEdit.Create(Form_abfrage);  
  with en do  
    begin  
      Parent:=Form_abfrage;  
      Width:=200;  
      MaxLength:=50;  
      Height:=10;  
      Left:=100;  
      Top:=100;  
      Font.Name:='Verdana';  
      setFocus;  
      OnChange:=txt_change;
      Tag:=Integer(btn_weiter);  // Der TButton wird im Tag gespeichert
    end  
end;


saite - Mi 20.10.04 13:30

danke!
das mit dem tag funktioniert!
wär ich nie drauf gekommen...

danke!

saite