Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Taschenrechner über Tastatur bedienen (https://www.delphipraxis.net/84048-taschenrechner-ueber-tastatur-bedienen.html)

Stefan92 13. Jan 2007 13:55

Re: Taschenrechner über Tastatur bedienen
 
Nee, das will ich nicht machen.
Es soll ja so eine Art Easteregg (vom Programmierer versteckte Funktion) sein. Also sollen nur eingeweihte diese Funktion finden. Deshalb würde ich das gerne mit Tastenkombinationen lösen.

Gruß

Stefan

marabu 13. Jan 2007 14:06

Re: Taschenrechner über Tastatur bedienen
 
Hallo Stefan,

EasterEggs kannst du über die KeyPreview der Form realisieren. Dazu deklarierst du eine private Form-Variable EasterEgg als String, fügst jedes eingegebene Zeichen hinzu und löschst alles, sobald eine falsche Taste gedrückt wurde. Sobald ein von dir erwarteter Text in der Varaible steht kannst du die zugehörige Aktion starten.

Freundliche Grüße

Stefan92 14. Jan 2007 10:47

Re: Taschenrechner über Tastatur bedienen
 
Erstmal danke für deine Antwort, aber ich hab Probleme mit der Umsetzung.
Hier mein bisheriger Quellcode:
Code:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
var kombi:string;
begin
  kombi:='';
  if key='1' then button1.click;
  if key='2' then button2.click;
  if key='3' then button3.click;
  if key='4' then button4.click;
  if key='5' then button5.click;
  if key='6' then button6.click;
  if key='7' then button7.click;
  if key='8' then button8.click;
  if key='9' then button9.click;
  if key='0' then button10.click;
  if (key=',') or (key='.') then button11.click;
  if key='n' then button12.click;
  if key=chr(13) then button13.click;
  if key='-' then button14.click;
  if key='+' then button15.click;
  if key='*' then button16.click;
  if key='/' then button17.click;
  if key=chr(8) then button19.click;
  if key='h' then kombi:='h';
  if (kombi='h') and (key='e') then kombi:='he';  <==== an der Stelle hapert es wohl :wall:
  if kombi='he' then showmessage('huhu') else kombi:='';
end;
Hoffe ihr findet meinen Fehler und danke schonmal im Voraus.

Gruß

Stefan

Hawkeye219 14. Jan 2007 11:07

Re: Taschenrechner über Tastatur bedienen
 
Hallo Stefan,

schau dir mal diese Seite an.

Die IF-Anweisungen könntest du übrigens durch eine Delphi-Referenz durchsuchenCASE-Anweisung ersetzen. Eine mögliche Alternative ist die Verwendung der Komponente Delphi-Referenz durchsuchenTAction. Eine Action kann mit mehreren Auslösern (z.B. TButton, TMenuItem) verbunden werden und gestattet auch die Definition eines Shortcuts.

Gruß Hawkeye

Stefan92 14. Jan 2007 13:11

Re: Taschenrechner über Tastatur bedienen
 
Hallo Hawkeye219,

vielen Dank für die Seite, ist alles super erklärt.
Aber wie mach ich das denn mit einer Case-Anweisung, das geht doch nur mit ordinalen Typen, oder?

Gruß

Stefan

Hawkeye219 14. Jan 2007 13:27

Re: Taschenrechner über Tastatur bedienen
 
Zitat:

Zitat von Stefan92
Aber wie mach ich das denn mit einer Case-Anweisung, das geht doch nur mit ordinalen Typen, oder?

char _ist_ ein ordinaler Typ.

Delphi-Quellcode:
case key of
  '1': button1.click;
  '2': button2.click;
  '3': button3.click;
  ...
  ',', '.': button11.click;
  ...
else
  // sonstige Tasten
end;
Der Vorteil der CASE-Lösung besteht darin, daß nur ein Zweig durchlaufen wird - bei deinem Code werden immer alle IF-Anweisungen abgearbeitet. Ein CASE kann die ebenfalls mögliche (aber unübersichtliche) Schachtelung von "IF..THEN..ELSE IF"-Strukturen ersetzen.

Gruß Hawkeye

inherited 14. Jan 2007 15:00

Re: Taschenrechner über Tastatur bedienen
 
genauso könntenst du es machen, dann in den else-teil so etwas wie
Delphi-Quellcode:
  easterstring:=easterstring+key;
  if Copy('GEHEIMERTEXT', 1, Length(easterstring))<>easterstring then
    easterstring:='';
Ohne Garantie ;)

Stefan92 14. Jan 2007 17:15

Re: Taschenrechner über Tastatur bedienen
 
@Hawkeye219: Ups, stand wohl etwas auf dem Schlauch... :mrgreen: :wall:
@inherited: Auch ne gute Lösung, aber
1. funktioniert es bei mir leider nicht und
2. ist die jetztige Lösung viel schöner :P , nichts für ungut... :)

Gruß

Stefan

inherited 14. Jan 2007 19:21

Re: Taschenrechner über Tastatur bedienen
 
:gruebel:
Mein beitrag bezog sich doch auf hawkeye, ich habe nur den von ihm ausgelassenem else-teil beschrieben

Stefan92 15. Jan 2007 07:04

Re: Taschenrechner über Tastatur bedienen
 
Hallo inherited,

mir war schon klar, dass du den else-Teil meintest aber irgendwie funktioniert deine Lösung trotzdem nicht.
Mit der anderen Lösung meinte ich, die mir von Hawkeye219 empfohlene Seite, auf der ein Tutorial zum Programmieren eines Eastereggs war. Aber es wäre trotzdem cool, deine Lösung umzusetzen, schon allein der Einfachheit halber.
Egal, hier auf jeden Fall mein Quelltext:
Code:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
var easterstring:string;
begin
  easterstring:='';
  case key of
    '1' : button1.click;
    '2' : button2.click;
    '3' : button3.click;
    '4' : button4.click;
    '5' : button5.click;
    '6' : button6.click;
    '7' : button7.click;
    '8' : button8.click;
    '9' : button9.click;
    '0' : button10.click;
    ',' : button11.click;
    '.' : button11.click;
    'n' : button12.click;
    chr(13) : button13.click;
    '-' : button14.click;
    '+' : button15.click;
    '*' : button16.click;
    '/' : button17.click;
    chr(8) : button19.click;
    'p' : button20.click;
    'w' : button21.click;
    'q' : button22.click;
    'r' : button23.click;
  else
  begin
    easterstring:=easterstring+key;
    if Copy('test', 1, Length(easterstring))<>easterstring then easterstring:=''
    else showmessage('hey');
  end;
  end;
end;
Wahrscheinlich hab ich den Copy-Befehl missverstanden, denn jetzt kommt die Botschaft schon allein, wenn ich nur t drücke.
Danke schonmal im Voraus für die Lösung des Problems... :mrgreen:

Gruß

Stefan

Tormentor32 15. Jan 2007 07:16

Re: Taschenrechner über Tastatur bedienen
 
Mal zur erläuterung was deine Methode macht:

Du setzt easterstring auf ''
dann ergänzt du die gedrückte Taste zu deinem String, z.B: 'T'
dann vergleichst du Das erste Zeichen des Strings (es ist ja nur ein Zeichen drin) mit dem String selber, und das ergibt natürlich immer true, also wird die message ausgegeben

Stefan92 15. Jan 2007 18:42

Re: Taschenrechner über Tastatur bedienen
 
Hm... dann weiss ich nicht, wie ichs richtig machen soll. Ich meine, wenn ichs mit ner If-Abfrage löse, klappts auch nicht:
Code:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
var easterstring:string;
begin
  easterstring:='';
  case key of
    '1' : button1.click;
    '2' : button2.click;
    '3' : button3.click;
    '4' : button4.click;
    '5' : button5.click;
    '6' : button6.click;
    '7' : button7.click;
    '8' : button8.click;
    '9' : button9.click;
    '0' : button10.click;
    ',' : button11.click;
    '.' : button11.click;
    'n' : button12.click;
    chr(13) : button13.click;
    '-' : button14.click;
    '+' : button15.click;
    '*' : button16.click;
    '/' : button17.click;
    chr(8) : button19.click;
    'p' : button20.click;
    'w' : button21.click;
    'q' : button22.click;
    'r' : button23.click;
  else
  begin
    easterstring:=easterstring+key;
    if Copy('test', 1, Length(easterstring))<>easterstring then easterstring:='';
    if easterstring='test' then showmessage('hui');
  end;
  end;
end;
Ich kriegs einfach nicht hin. :wall:

Gruß

Stefan

Hawkeye219 15. Jan 2007 19:08

Re: Taschenrechner über Tastatur bedienen
 
Hallo Stefan,

die Variable easterstring mußt du im private Teil des Formulars unterbringen, damit ihr Inhalt mehrere Aufrufe der FormKeyPress-Routine überlebt. Der Löschbefehl zu Beginn der Routine schadet auch nur, oder?

Probiere es einmal so:

Delphi-Quellcode:
type
  TForm1 = class (TForm)
  ...
  private
    easterstring : string;
  end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
const
  MAGICTEXT = 'test';
begin
  case key of
    '1' : button1.click;
    ...
    'r' : button23.click;
  else
    easterstring := easterstring + key;
    if (easterstring <> Copy(MAGICTEXT, 1, Length(easterstring)) then
      easterstring := ''
    else
      if (easterstring = MAGICTEXT) then
        begin
          showmessage('hui');
          easterstring := '';
        end;
  end;
end;
Wenn der MAGICTEXT auch Zeichen enthalten soll, die für die Bedienung der Buttons benötigt werden, dann solltest du die Überprüfung aus dem ELSE-Zweig herausnehmen und hinter die CASE-Anweisung verschieben.

Gruß Hawkeye

Stefan92 16. Jan 2007 18:57

Re: Taschenrechner über Tastatur bedienen
 
Ups, nicht zu fassen wie blöd ich manchmal bin :oops: . Jetzt kann ich es aber nicht mehr auf den armen Schlauch schieben... :mrgreen:
Naja, ich danke dir auf jeden Fall für die Hilfe.

Gruß

Stefan

Edit: Aber nur mal so aus reiner Neugier, wie würde es denn funktionieren, wenn man auf Tasten reagieren will, die gleichzeitig gedrückt werden? Ich meine, dass z.B. wenn man t,e,s und t gleichzeitig drückt, wird eine Messagebox aufgerufen. Oder ist das zu komplex?

Stefan92 19. Jan 2007 14:34

Re: Taschenrechner über Tastatur bedienen
 
Da ich immer noch auf Antwort warte, nehme ich mal an, dass ihr diesen Thread vergessen habt.
Hier die noch offene Frage:
Zitat:

Edit: Aber nur mal so aus reiner Neugier, wie würde es denn funktionieren, wenn man auf Tasten reagieren will, die gleichzeitig gedrückt werden? Ich meine, dass z.B. wenn man t,e,s und t gleichzeitig drückt, wird eine Messagebox aufgerufen. Oder ist das zu komplex?
Ich verwende daher absichtlich nicht die Editfunktion, um den Thread in die aktuelle Themenliste zu bringen.
Bitte um Verständnis und baldige Antwort.

Gruß

Stefan

inherited 19. Jan 2007 15:41

Re: Taschenrechner über Tastatur bedienen
 
Das solltest du dann am Besten mit einem Timer machen und Hier im Forum suchenGetAsyncKeyState benutzen

Stefan92 19. Jan 2007 21:08

Re: Taschenrechner über Tastatur bedienen
 
Ok, vielen Dank, ich werd mich dann mal schlau machen.

Gruß

Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:57 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz