Bildschirmtastatur für Touch Screen



  • Lösungen dafür gibt es wahrscheinlich mehrere, ich würde allen Buttons der Tastatur ein OnClick-Ereignis zuweisen - allen das gleiche - in dem dann nur der Text im Edit entsprechend angepasst wird

    void __fastcall TForm3::Button1Click(TObject *Sender)
    {
    TButton *btn = dynamic_cast<TButton*>(Sender); 
    if (btn) 
      Form3->LMDEdit1->Text = Form3->LMDEdit1->Text + btn->Caption;
    }
    


  • also für ein Button funktioniert das.
    Wie kann ich allen Buttons ein Klickererignis zuweisen?
    Leider weiss ich auch nicht wie das mit den Buttons eigentlich funktioniert. Also ich kenn auch den Typ TObjekt und den Zusammenhang mit den Butons nicht.



  • rudpower schrieb:

    Wie kann ich allen Buttons ein Klickererignis zuweisen?

    indem du zur Entwurfszeit auf dem Formular alle Buttons (ausser dem der schon das Ereignis hat) auswählst und dann im Objektinspektor beim OnClick-Ereignis das auswählst, was du für den einzelnen angefertigt hast
    oder du klickst jeden Button einzeln an und wählst im Objektinspektor die Methode bei OnClick aus

    rudpower schrieb:

    Also ich kenn auch den Typ TObjekt und den Zusammenhang mit den Butons nicht.

    dann solltest du dich erstmal mit den Grundlagen der VCL auseinander setzen...



  • ok, das funktioniert schon mal.
    Wie kann ich bei einer Delete-Taste das letzte Zeichen jeweils löschen?



  • beim OnClick des Button den Text des Edits um ein Zeichen kürzen, hierbei könnte die AnsiString-Methode Delete hilfreich sein, außerdem sind die Methoden SelStart und SelLength von TEdit hilfreich um zu sehen wo der Cursor im Edit steht und ob mehr als ein zeichen markiert ist



  • Ein Problem gibts noch.
    Wenn ich abschliessend auf OK klicke möchte ich, dass er das Tastaturfeld nicht nur schliesst sondern auch den eingegebenen Text in das Editfeld schreibt von wo draufgeklickt wurde.



  • und wo genau ist das Problem? was hast du denn schon versucht?



  • naja, ich habe ja mehrere Editfelder. Da öffne ich durch klick ja immer das gleiche Tastaturfeld. Wenn ich im Tastaturfeld mit meiner Eingabe fertig bin, soll er das ja immer in ein anderes Editfeld schreiben, nämlich da wo ich draufgeklickt hatte.



  • genau wie bei den Buttons auch kannst du hier für alle Edits die gleiche Click-Methode verwenden, nur dass du diesmal den Sender auf TEdit castest
    und beim Schließen der Tastatur entsprechend den Wert aus dem modalen Dialog an das Edit übergibst



  • hab in der ActionList ein Methode OpenKeyboard. Habe allen Editfeldern flg Klickereignis zugewiesen und dort das Form mit der Tastatur öffnen lassen:

    void __fastcall TForm1::OpenKeyboardExecute(TObject *Sender)
    {
       Form3->ShowModal();
    }
    

    wie das mit dem cast geht weiss ich leider nicht



  • Linnea schrieb:

    beim OnClick des Button den Text des Edits um ein Zeichen kürzen, hierbei könnte die AnsiString-Methode Delete hilfreich sein, außerdem sind die Methoden SelStart und SelLength von TEdit hilfreich um zu sehen wo der Cursor im Edit steht und ob mehr als ein zeichen markiert ist

    das funktioniert jetzt. Danke für den Tip. Hier der Code:

    void __fastcall TForm3::E_DeleteClick(TObject *Sender)
    {
       E_Text->Text = E_Text->Text.Delete(E_Text->Text.Length(),1);
    }
    


  • rudpower schrieb:

    wie das mit dem cast geht weiss ich leider nicht

    nein? aber du hast es doch schon bei den Buttons angewendet:

    TButton *btn = dynamic_cast<TButton*>(Sender);
    

    außerdem fehlt noch die Abfrage ob/wie das modale Formular geschlossen wurde, hierzu gibts ein Beispiel in der BCB-Hilfe und bestimmt auch hier im Forum, siehe ShowModal

    und dann noch die Zuweisung des Inhalts des Edits des modalen Formulars zum Edit was bearbeitet werden soll

    komm, zeig mal ein wenig Eigeninitiative, Abstraktionsvermögen und nutze die Hilfe und die Suchfunktion 🙄



  • nein? aber du hast es doch schon bei den Buttons angewendet:

    das stimmt, leider nur nicht verstanden. Hab mal ins Buch geschaut aber die Erklärung dazu ist sehr schwer verständlich. Zumindest für mich. Sender ist so wie ich denke ein Objekt der Klasse TObject. Aber hier ist es ja ein Zeiger, enthält also eine Addresse. Werd mal versuchen, das zu verstehen



  • Sender ist das Objekt welches das Ereignis auslöst, und das wird im allgemeinen über einen Zeiger angesprochen. TObjekt ist die Basisklasse aller Objekte der VCL. Um auf die speziellen Eigenschaften der Objekte zuzugreifen muß man das Objekt also solches ansprechen (casten), d.h. wenn der Sender ein TEdit ist mußt du den Zeiger einem Edit zuweisen, damit du auf die Eigenschaften eines Edit zugreifen kannst. Wenn du das Edit aber einem StringGrid zuweist geht das nicht und führt zu Fehlern. Deshalb hatte ich auch "if (btn)" vor die Zuweisung geschrieben um eventuelle fehlerhafte Zuweisungen abzufangen.



  • rudpower schrieb:

    da ich mein Pogramm über einen Touch Screen laufen lassen möchte, möchte ich eine Tastatur programmieren.

    Falls es von Interesse ist: in C++Builder 2010 gibt es bereits Touch-Unterstützung und auch eine entsprechende Tastaturkomponente in der VCL.



  • gut zu wissen. Leider arbeite ich mit dem Builder 5.0



  • Das könnte man ja ändern 😉 Und es dürfte sich sogar lohnen - schließlich ersparst du dir die Zeit, das Rad neu zu erfinden.



  • also soweit komm ich:

    void __fastcall TForm1::Edit1Click(TObject *Sender)
    {
    	TEdit* ed = dynamic_cast<TEdit*>(Sender);
    	if (ed)
    	{
    		Form2->ShowModal(); //Form2 ist das Tastaturfenster
                    ed->Text = 
    	}
    }
    

    dadurch öffnet sich schon mal bei jedem Klick auf eines der Editfelder das Tastaturfenster.
    Nun muss ich ja irgendwie den Text in das Editfeld zurückschreiben. Da komm ich nicht weiter.

    Was ich auch umsetzen wollte ist, dass alle Captions der Tastaturbuttons beim Klick auf einen SHift-Button auf Kleinschreibung umschalten.



  • so habs nochmal probiert. Also so funktionierts schon mal. Ob das so ok ist weiss ich nicht. Hab den Close-Button rausgenommen, da eig ein OK-Button ausreicht. Nun fehlt noch die Umsetzung der Shift-Taste.

    hier mein Code:
    Form1:

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Edit1Click(TObject *Sender)
    {
    	TEdit* ed = dynamic_cast<TEdit*>(Sender);
    	if (ed)
    	{
    		Form2->E_Text->Text = ed->Text;
    		Form2->ShowModal();
    		ed->Text = Form2->E_Text->Text;
    	}
    }
    

    Form2 (Tastatur):

    #pragma link "LMDCustomEdit"
    #pragma link "LMDCustomPanel"
    #pragma link "LMDEdit"
    #pragma resource "*.dfm"
    TForm2 *Form2;
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::LMDButton1Click(TObject *Sender)
    {
    	TButton *btn = dynamic_cast<TButton*>(Sender);
    	if (btn)
    	{
    		Form2->E_Text->Text = Form2->E_Text->Text + btn->Caption;
    	}
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::LMDButton50Click(TObject *Sender)
    {
    	E_Text->Text = E_Text->Text.Delete(E_Text->Text.Length(),1);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::LMDButton31Click(TObject *Sender)
    {
    	Close();
    }
    


  • rudpower schrieb:

    Was ich auch umsetzen wollte ist, dass alle Captions der Tastaturbuttons beim Klick auf einen SHift-Button auf Kleinschreibung umschalten.

    hier mal eine Variante wie man durch alle Items eines Formulars durchgeht, das mußt du dann natürlich für deine Buttons anpassen

    [Edit]außerdem sind hier die AnsiString-Methoden LowerCase und UpperCase hilfreich


Anmelden zum Antworten