Bildschirmtastatur für Touch Screen
-
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
-
In der Klasse
TForm2
impublic
:bool IsUpper;
Beim
OnCreate
-Ereignis vonTForm2
:IsUpper=false;
Im
OnClick
-Ereignis des Shift-Buttons:TButton* btn; for(int i=0;i<ComponentCount;i++) { if(Components[i]->ClassNameIs("TButton")) { btn=dynamic_cast<TButton*>(Components[i]); if(btn->Caption.Length()==1) { if(IsUpper) btn->Caption=btn->Caption.LowerCase(); else btn->Caption=btn->Caption.UpperCase(); } } } IsUpper=!IsUpper;
Das sollte reichen. Den Rest erledigt schon die andere Routine.
-
hab das grad mal eingebunden. Leider tut sich beim Click auf den ShiftButton gar nichts. Es gibt auch keine Fehlermeldung. Sehr komisch.
Noch eine andere Frage.
Kann ich den ShiftButton irgendwie "einrasten" lassen. So dass der Benutzer sieht, dass Shift gedrückt wurde?
-
ich korriegiere. Meine Buttons sind TLMDButtons
dann konnte das auch nicht gehen.
Allerdings musste ich die Variable rausnehmen, da es so nicht funktionierte.
Voreingestellt sind alle Captions groß geschrieben. Ich möchte, dass er am besten beim Öffnen des Dokuments alles klein schreibt und bei drücken der Shifttaste auf groß wechselt. Drückt man wieder, soll wieder alles auf Groß umschalten.
-
rudpower schrieb:
Kann ich den ShiftButton irgendwie "einrasten" lassen. So dass der Benutzer sieht, dass Shift gedrückt wurde?
Wie das mit TButton funktioniert, weiss ich leider nicht. Du koenntest alternativ auch TPanel verwenden, und manuell beim
OnMouseDown
-Ereignis die EigenschaftenBevelInner
undBevelOuter
jeweils zwischenbvRaised
undbvLowered
switchen. Natuerlich muessen dann beide Werte gesetzt sein. Standardmaessig stehtBevelInner
aufbvNone
.
-
irgendwie muss es ein Wechselschalter werden. Im Moment ist es so, dass beim drücken der Shifttaste zwar alles auf Kleinschreibung wechselt. Ich möchte aber, dass man mit dem Button hin und her wechseln kann.
-
Und wie realisiert man solche Schalter? Per Boolean:
bool bSwitch=false; // ... bSwitch=!bSwitch;
-
hat sich erledigt. es funktioniert. vielen dank