Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Taste auf Button legen (onkeypress??)


1012178 - Mi 23.10.02 07:26
Titel: Taste auf Button legen (onkeypress??)
Hallo. Habe da ein Problem:
Och möchte gerne in Pascal (Delphi) eine Taste auf einen Buttpon legen. Also wenn ich z.B. auf die "1" drücke soll irgend ein Button ausgelöst werden. Soll irgendwie mit onkeydown oder KeyPress funktionieren, ich weiß aber nicht wie...

Wäre fein, wenn mir einer ein Stück Quellcode geben könnte, da ich absolut nicht weiß, wie ich das umsetzen soll. :)

Danke!


Tino - Mi 23.10.02 08:43

Morgen,

du könntest es wie folgt machen: Du setzt als erstes die Eigenschaft KeyPreview der Form auf True. Dann benutzt Du das OnKeyPress Event mit folgenden Code:

Quelltext
1:
2:
3:
4:
5:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  If Key = '1' Then
    Button1.Click;
end;


Gruß
TINO


1012178 - Mi 23.10.02 09:45

Sieht ja ganz gut aus. Schonmal Danke!! :D
Nur habe ich folgendes Problem:
Wie kann ich der Variablen Key durch Tastendruck einen Wert zuweisen? Wenn ich jetzt auf die 1 drücke, passiert nämlich genau gar nichts :-/
Habe schon versucht da diese Virtuellen Tastencodes reinzusetzen und die dazugehörigen Nummern aber irgnedwie klappt das nicht...
Oder habe ich da nen Fehler gemacht?


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:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Eins: TButton;
    Zwei: TButton;
    Drei: TButton;
    Vier: TButton;
    Fuenf: TButton;
    Sechs: TButton;
    Sieben: TButton;
    Acht: TButton;
    Neun: TButton;
    Null: TButton;
    Clear: TButton;
    addition: TButton;
    Subtraktion: TButton;
    Multiplikation: TButton;
    Division: TButton;
    istgleich: TButton;
    Anzeige: TEdit;
    Undo: TButton;
    Ende: TButton;
    Vorzeichenwechsel: TButton;
    Dezimaltrennzeichen: TButton;
    Label1: TLabel;
    procedure EinsClick(Sender: TObject);
    procedure ZweiClick(Sender: TObject);
    procedure DreiClick(Sender: TObject);
    procedure VierClick(Sender: TObject);
    procedure FuenfClick(Sender: TObject);
    procedure SechsClick(Sender: TObject);
    procedure SiebenClick(Sender: TObject);
    procedure AchtClick(Sender: TObject);
    procedure NeunClick(Sender: TObject);
    procedure NullClick(Sender: TObject);
    procedure ClearClick(Sender: TObject);
    procedure additionClick(Sender: TObject);
    procedure SubtraktionClick(Sender: TObject);
    procedure MultiplikationClick(Sender: TObject);
    procedure DivisionClick(Sender: TObject);
    procedure istgleichClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure EndeClick(Sender: TObject);
    procedure UndoClick(Sender: TObject);
    procedure DezimaltrennzeichenClick(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  auszufuehrende_operation: 0..4;
  Zahl_1:real;
  Zahl_2:real;
  Anzeigeninhalt:string;
  

implementation

{$R *.dfm}


{**Zahlenbuttons Anfang**}

procedure TForm1.NullClick(Sender: TObject);
  begin
    if (Anzeige.text='0')
    then {keine Aktion}
    else Anzeige.text:=Anzeige.Text+'0';
  end;

procedure TForm1.EinsClick(Sender: TObject);
  begin
    if (Anzeige.text='0')
    then Anzeige.text:='1'
    else Anzeige.text:=Anzeige.Text+'1';
  end;

procedure TForm1.ZweiClick(Sender: TObject);
  begin
    if (Anzeige.text='0')
    then Anzeige.text:='2'
    else Anzeige.text:=Anzeige.Text+'2';
  end;

procedure TForm1.DreiClick(Sender: TObject);
  begin
    if (Anzeige.text='0')
    then Anzeige.text:='3'
    else Anzeige.text:=Anzeige.Text+'3';
  end;

procedure TForm1.VierClick(Sender: TObject);
  begin
    if (Anzeige.text='0')
    then Anzeige.text:='4'
    else Anzeige.text:=Anzeige.Text+'4';
  end;

procedure TForm1.FuenfClick(Sender: TObject);
  begin
    if (Anzeige.text='0')
    then Anzeige.text:='5'
    else Anzeige.text:=Anzeige.Text+'5';
  end;

procedure TForm1.SechsClick(Sender: TObject);
  begin
    if (Anzeige.text='0')
    then Anzeige.text:='6'
    else Anzeige.text:=Anzeige.Text+'6';
  end;

procedure TForm1.SiebenClick(Sender: TObject);
  begin
    if (Anzeige.text='0')
    then Anzeige.text:='7'
    else Anzeige.text:=Anzeige.Text+'7';
  end;

procedure TForm1.AchtClick(Sender: TObject);
  begin
    if (Anzeige.text='0')
    then Anzeige.text:='8'
    else Anzeige.text:=Anzeige.Text+'8';
  end;

procedure TForm1.NeunClick(Sender: TObject);
  begin
    if (Anzeige.text='0')
    then Anzeige.text:='9'
    else Anzeige.text:=Anzeige.Text+'9';
  end;

{**Zahlenbuttons Ende**}

{**Rechenoperationen Anfang**}

procedure addieren (var x,y:real; var z:string);
  begin
    case auszufuehrende_operation of
      0:begin
          x:=strtofloat(z);
          z:='0';
          auszufuehrende_operation:=1;
        end;

      1:begin
          y:=strtofloat(z);
          x:=x+y;
          z:='0';
          auszufuehrende_operation:=1;
        end;

      2:begin
          y:=strtofloat(z);
          x:=x-y;
          z:='0';
          auszufuehrende_operation:=1;
        end;

      3:begin
          y:=strtofloat(z);
          x:=x*y;
          z:='0';
          auszufuehrende_operation:=1;
        end;

      4:begin
          y:=strtofloat(z);
          x:=x / y;
          z:='0';
          auszufuehrende_operation:=1;
        end;
    end;
  end;

procedure subtrahieren (var x,y:real; var z:string);
  begin
    case auszufuehrende_operation of

      0:begin
          x:=strtofloat(z);
          z:='0';
          auszufuehrende_operation:=2;
        end;

      1:begin
          y:=strtofloat(z);
          x:=x+y;
          z:='0';
          auszufuehrende_operation:=2;
        end;

      2:begin
          y:=strtofloat(z);
          x:=x-y;
          z:='0';
          auszufuehrende_operation:=2;
        end;

      3:begin
          y:=strtofloat(z);
          x:=x*y;
          z:='0';
          auszufuehrende_operation:=2;
        end;

      4:begin
          y:=strtofloat(z);
          x:=x / y;
          z:='0';
          auszufuehrende_operation:=2;
        end;
    end;
  end;

procedure multiplitzieren (var x,y:real; var z:string);
  begin
    case auszufuehrende_operation of

      0:begin
          x:=strtofloat(z);
          z:='0';
          auszufuehrende_operation:=3;
        end;

      1:begin
          y:=strtofloat(z);
          x:=x+y;
          z:='0';
          auszufuehrende_operation:=3;
        end;

      2:begin
          y:=strtofloat(z);
          x:=x-y;
          z:='0';
          auszufuehrende_operation:=3;
        end;

      3:begin
          y:=strtofloat(z);
          x:=x*y;
          z:='0';
          auszufuehrende_operation:=3;
        end;

      4:begin
          y:=strtofloat(z);
          x:=x / y;
          z:='0';
          auszufuehrende_operation:=3;
        end;
    end;
  end;

procedure dividieren (var x,y:real; var z:string);
  begin
    case auszufuehrende_operation of

      0:begin
          x:=strtofloat(z);
          z:='0';
          auszufuehrende_operation:=4;
       end;

      1:begin
          y:=strtofloat(z);
          x:=x+y;
          z:='0';
          auszufuehrende_operation:=4;
        end;

      2:begin
          y:=strtofloat(z);
          x:=x-y;
          z:='0';
          auszufuehrende_operation:=4;
        end;

      3:begin
          y:=strtofloat(z);
          x:=x*y;
          z:='0';
          auszufuehrende_operation:=4;
        end;

      4:begin
          y:=strtofloat(z);
          x:=x / y;
          z:='0';
          auszufuehrende_operation:=4;
        end;
    end;
  end;

procedure berechnen (var x,y:real; var z:string);
  begin
    case auszufuehrende_operation of

      0:begin
          x:=strtofloat(z);
          z:=floattostr(x);
          auszufuehrende_operation:=0;
        end;

      1:begin
          y:=strtofloat(z);
          x:=x+y;
          z:=floattostr(x);
          auszufuehrende_operation:=0;
        end;

      2:begin
          y:=strtofloat(z);
          x:=x-y;
          z:=floattostr(x);
          auszufuehrende_operation:=0;
        end;

      3:begin
          y:=strtofloat(z);
          x:=x*y;
          z:=floattostr(x);
          auszufuehrende_operation:=0;
        end;

      4:begin
          y:=strtofloat(z);
          x:=x / y;
          z:=floattostr(x);
          auszufuehrende_operation:=0;
        end;
    end;
  end;

procedure TForm1.AdditionClick(Sender: TObject);
  begin
    Anzeigeninhalt:=Anzeige.text;
    addieren(Zahl_1,Zahl_2,Anzeigeninhalt);
    Anzeige.text:=Anzeigeninhalt;
  end;

procedure TForm1.SubtraktionClick(Sender: TObject);
  begin
    Anzeigeninhalt:=Anzeige.text;
    subtrahieren(Zahl_1,Zahl_2,Anzeigeninhalt);
    Anzeige.text:=Anzeigeninhalt;
  end;

procedure TForm1.MultiplikationClick(Sender: TObject);
  begin
    Anzeigeninhalt:=Anzeige.text;
    multiplitzieren(Zahl_1,Zahl_2,Anzeigeninhalt);
    Anzeige.text:=Anzeigeninhalt;
  end;

procedure TForm1.DivisionClick(Sender: TObject);
  begin
    Anzeigeninhalt:=Anzeige.text;
    dividieren(Zahl_1,Zahl_2,Anzeigeninhalt);
    Anzeige.text:=Anzeigeninhalt;
  end;

procedure TForm1.istgleichClick(Sender: TObject);
  begin
    Anzeigeninhalt:=Anzeige.text;
    berechnen(Zahl_1,Zahl_2,Anzeigeninhalt);
    Anzeige.text:=Anzeigeninhalt;
  end;

{**Rechenoperationen Ende**}


{**Allgemeines Anfang**}

{Clear}
procedure TForm1.ClearClick(Sender: TObject);
  begin
    Anzeige.text:='0';
    auszufuehrende_operation:=0;
    Zahl_1:=0;
    Zahl_2:=0;
    Anzeigeninhalt:=' ';
  end;

{Fenstereigenschaften}
procedure TForm1.FormCreate(Sender: TObject);
  begin
    ShowWindow(Application.Handle, SW_HIDE);
    Form1.Height:=300;
    Form1.Width:=290;
  end;

{Schließen}
procedure TForm1.EndeClick(Sender: TObject);
  begin
    close;
  end;

{Rückgängig (Zahl aus Fenster löschen)}
procedure TForm1.UndoClick(Sender: TObject);
  begin
    Anzeige.text:='0';
  end;

{Komma}
procedure TForm1.DezimaltrennzeichenClick(Sender: TObject);
  begin
    Anzeige.text:=Anzeige.Text+'.';
  end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin 
  If Key = '1' Then
  eins.click;
end;

end.


wwerner - Mi 23.10.02 10:26

Tip: Schau die die Antwort von Tino noch mal an und untersuche dann deinen Quellcode, was du geschrieben hast. Siehst du den Unterschied?


1012178 - Mi 23.10.02 13:17

Wenn du auf die "1"(die ich nochmal flott reineditiert habe) anspielst, die ich vergessen habe, nach ein paar Versuchen, daran lag's irgendwie nicht. Auch wenn ich die 1 einfüge passiert nichts....


wwerner - Mi 23.10.02 14:22

Frage1: Wie hast du das FormKeyPress eingebaut?
Frage2: Hast du mal den Debugger benutzt?


1012178 - Mi 23.10.02 15:49

Irgendwie stehe ich auf dem Schlauch. :oops:

Und Debugger, was ist das, bzw. wie benutzt man den? Sowas wird uns in der Schule nicht beigebracht, weil unsere Lehrer selbst keine Ahnung haben... :?


Delete - Mi 23.10.02 16:01

Debugger:
F7: Einzelschritte, Delphi hält bei jeder Anweisung an
F4: Delphi hält in der Zeile bei der Ausführung an, in der der Cursor steht, weiter mit Einzelschritten oder F9 zum weiteren Ausführen des Codes
Strg+F8: Prozedur, Funktion überspringen

Und wenn der Debugger anhält, kannst du den Inhalt von Variablen überprüfen, in dem du den Cursor über die Variable hältst.


Hast du Form1.KeyPreview auf TRUE gestellt?


1012178 - Mi 23.10.02 16:18

Danke! Ja, im Objektinspector steht KeyPreview auf true.

Wenn ich jetzt mit dem Debugger einzelne Schritte mache erreiche ich trotzdem nie die Keypress prozedur. erhalte aber auch vom Programm keine Fehlermeldung, dass irgendetwas nicht stimmt. Also das Programm läuft, aber wenn ich auf die Tasten drücke muckst sich nix :(


wieczo - Mi 23.10.02 17:17

Hallo,
jetzt mal einen Tip mit dem Holzhammer:
Wo ist bei dir ein TButton?
Heißt der TButton bei dir Button1 wie in Tinos Code?
Und jetzt noch mal überlegen.

Viel Spaß Thomas :D


1012178 - Mi 23.10.02 17:30

Bin ich eigentlich ganz bescheuert oder warum verstehe ich euch nicht?

@wieczo: Nein. Mein Button heißt nicht "Button1" sondern "eins". Also stimmt es doch wenn ich statt "Button1" einfach "eins" einsetze!?

Quelltext
1:
2:
3:
4:
5:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); 
begin 
  If Key = '1' Then 
  eins.click; 
end;


wieczo - Mi 23.10.02 17:42

Tadaaa, you've got it man!!! :D


Christian S. - Mi 23.10.02 17:51

1012178 hat folgendes geschrieben:

Bin ich eigentlich ganz bescheuert oder warum verstehe ich euch nicht?

Ich kapiere es auch nicht.

@wieczo: aber das ist doch das, was er die ganze Zeit dort stehen hat! Oder habe ich da was übersehen oder habe ich mein Hirn in der Bahn liegen lassen?

MfG,
Peter


1012178 - Mi 23.10.02 17:52

@ wieczo: Ja nu! Wenn du aber mal in meinem 1. Quelltextpost geguckt hast, dann steht das so da drin und trotzdem gehts net. :?:

Edit: Hätte ich ein wenig gewartet, dann hätte ich mit Peter L. ja nur anschließen brauchen... :roll:


Christian S. - Mi 23.10.02 17:55

Eigentlich würde ich das nicht fragen, aber ich sehe keine andere Fehlerquelle mehr: hast Du vielleicht vergessen, dem OnKeyPress-Ereignis die betreffende Prozedur zuzuweisen?


1012178 - Mi 23.10.02 18:03

Durchaus möglich. Weißt du wie das geht? Habe von Pascal nämlich irgendwie nicht so richtig den Durchblick.
Einfach mal sagen was ich wo hin schreiben muss. Habe nämlich so langsam keine Lust mehr...


Christian S. - Mi 23.10.02 18:06

Hi!

Im Object Inspector von Delphi kannst Du ja die Eigenschaften der Form anzeigen. Aber auch die Ereignisse (andere "Lasche"). Dort gibt es das Ereignis "OnKeyPress". In der Drop-Down-Liste wählst Du dann die Prozedur aus, die für dieses Ereignis zuständig sein soll, in diesem Fall also die Prozedur, die Tino gepostet und Du abgewandelt hast!

MfG,
Peter


1012178 - Mi 23.10.02 18:16

SAUBER! Wusste nich, dass man das dort auch noch festlegen muss. Vielen Danke an alle! Mein Problem ist gelöst :D :D :D :D


1012178 - Mi 23.10.02 18:23

Aber die Enter-Taste kann ich nicht so einfach da integrieren, oder gibbet da ne Spezialnummer für?


Christian S. - Mi 23.10.02 18:31

Doch, das geht dann so:


Quelltext
1:
2:
3:
4:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if key = #13 then ShowMessage('Hallo');
end;


MfG,
Peter


1012178 - Mi 23.10.02 18:42

Muss ich dann auch nochmal irgendwo was einstellen, habe mal die Taste S genommen, also #53, da passiert, wer hätte es gedacht, nichts. Wenn ich auf enter drücke, dann kommt immer ne 1, weil wohl der button"eins" so gestrichelt eingerahmt ist.


aogwaba - Mi 23.10.02 19:36

Hi!

so kannst du testen ob 's' gedrückt wurde:

Quelltext
1:
if (key='s') or (key='S') then...                    

cu
waba


1012178 - Mi 23.10.02 19:40

Das "S" habe ich nur zu testzwecken benutzt. ich brauche noch die Enter, backspace und entf taste, aber mit der nummer das geht net. :(


aogwaba - Mi 23.10.02 19:44

was geht nicht?


Christian S. - Mi 23.10.02 20:04

Hi!

Ich glaube, ich weiß, wo Dein Problem liegt: wenn z.B. Button1 ausgewählt ist und die Enter-Taste gedrückt wird, so wird dies nicht als OnKeyPress der Form gewertet (selbst wenn KeyPreview = true ist!), sondern als Betätigen dieses Buttons.

Wie man das beheben kann, weiß ich auch nicht.

MfG,
Peter


aogwaba - Mi 23.10.02 20:44

Hi Peter Lustig!

Aber ist das nicht normal, wenn der Button den Focus hat, und 'Enter' gedrückt wird, wird ja die richtige Procedure ausgeführt.
Oder hab ich was übersehen?

cu
waba


Christian S. - Mi 23.10.02 21:22

Ich glaube, er meint das so:

Button1 ist ausgewählt. Wenn Enter gedrückt wird, soll aber Button2.Click ausgeführt werden.

Das klappt dann nicht. Selbst wenn Button2.Default=True und Form1.KeyPreView=true gilt.

MfG,
Peter


wieczo - Do 24.10.02 18:49

Erst mal entschuldigung :oops: .
a) Du kannst die Form1 mit Form1.setFocus anvisieren
b) Schau mal ob die Property Default vom EinsButton true ist, wenn ja wird er jedes mal betätigt, wenn du enter drückst


Christian S. - Do 24.10.02 21:58

wieczo hat folgendes geschrieben:
Schau mal ob die Property Default vom EinsButton true ist, wenn ja wird er jedes mal betätigt, wenn du enter drückst

Wie ich schon in meinem vorigen Posting geschrieben habe, klappt das nicht. Wenn Button1 den Fokus hat, Button2.Default=true ist, wird Button1 ausgeführt, wenn Enter gedrückt wird. Habe es gerade noch einmal bei mir ausprobiert.

Die Hilfe schreibt dazu folgendes:
Delphi-Hilfe hat folgendes geschrieben:
...any button that has focus becomes the Default button temporarily...


MfG,
Peter


Klabautermann - Fr 01.11.02 14:21

Hallo,

nur um die möglichkeiten noch einmal zu erweitern.
Es ist problemlos möglich das mit einer ActionList zu verwirklichen. Einfach eine Action ankegen und als Shortcut die 1 angeben.
Genaueres hier [http://www.auq.de/viewtopic.php?t=1662].

Gruß
Klabautermann