Bildschirmtastatur für Touch Screen
-
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
-
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
.