Sonderzeicheneingabe in Edit-Feld mit Bildschirmtastatur

    Sonderzeicheneingabe in Edit-Feld mit Bildschirmtastatur

    Hallo zusammen!
    Für ein Vokabelprogramm habe ich ein Formular mit verschiedenen Edit-Feldern angelegt, um die Vokabeln, deren Bedeutungen und weitere Informationen eingeben zu können.
    Um auch die Sonderzeichen der verschiedenen Sprachen eingeben zu können, habe ich ein zweites Formular entwickelt, das auf verschiedenen Labels die Sonderzeichen anzeigt, die in der jeweils ausgewählten Fremdsprache vorkommen.
    Wenn ich nun in eines der Edit-Felder Text eingeben möchte, setze ich durch Anklicken oder durch Betätigen der Tab-Taste den Cursor und kann über die Tastatur Text eingeben. Wenn ich aber ein Sonderzeichen durch Anklicken des entsprechenden Labels auf dem zweiten Formular einfügen möchte, geht dem Edit-Feld der Fokus verloren.
    Hat jemand hier einen Tipp, wie ich erreichen kann, dass das aktuelle Edit-Feld den Fokus behält und an der Position des Eingabecursors das Sonderzeichen einfügt wird? Ist das überhaupt machbar oder habe ich die Grenze der objektorientierten Programmierung erreicht?
    Meine Idee war, dem OnClick-Ereignis der Sonderzeichenlabels mitzuteilen, welches Editfeld den Fokus hat und die Zuweisung gleich in der OnClick-Routine vorzunehmen. Ich habe aber keine Ahnung, wie ich die Parameter übergeben und anschließend zum Edit-Feld zurückkehren kann.
    Vielen Dank- für eure Anregungen,
    mfG Gelmo
    Hallo Gelmo,

    ich habe vor kurzem vor ziemlich dem gleichen Problem gestanden bei meinem Hauptstädtequiz.
    So wie Du es vermutest, habe ich es auch gelöst (allerdings habe ich alles auf einem einzigen Formular, aber das Prinzip ist das Gleiche).
    Ausschnitt aus meinem Quellcode (mit zugegebenermaßen hässlicher Listbox):

    Delphi-Code

    1. ​procedure TForm1.lb_SonderzeichenClick(Sender: TObject);
    2. begin
    3. if lb_Sonderzeichen.ItemIndex<0 then exit;
    4. e_bloukrelcem.Text:=e_bloukrelcem.Text+lb_Sonderzeichen.Items[lb_Sonderzeichen.ItemIndex];
    5. e_bloukrelcem.SetFocus;
    6. e_bloukrelcem.SelStart:=length(e_bloukrelcem.Text);//Cursor ans Ende des Editfeldes
    7. end;


    bloukrelcem soll hier Hauptstadt heißen.

    ZYL
    Hallo Zylagon,
    hallo zusammen,
    es hat etwas gedauert, aber ich habe mich zwischendurch dem unerträglichen Gebrüll der Vögel und mancher Fußballkommentatoren ausgesetzt. Vielen Dank für Deinen Tipp. Er hilft mir aber nicht wirklich weiter, denn Du weißt ja, in welches Editfeld das Sonderzeichen eingefügt werden soll, während ich vorhatte, die Sonderzeichentastatur mit mehreren Formularen mit unterschiedlich vielen Editfrldern einzusetzen (Vokabeleingabe, Vokabeltest).
    Ich versuche jetzt die Informationen über das aktive Editfeld durch einen in Unit1 definierten ParameterRecord an die OnClick-Routine der Sonderzeichentastatur zu übergeben.
    Das klappt aber noch nicht richtig, es geschehen seltsame Dinge und ich versuche durch Versuch und Irrtum der Lösung näher zu kommen. ich poste mal ein paar Zeilen meines Codes

    Delphi-Code

    1. Unit 1
    2. // …
    3. Type
    4. TEditParams = Record
    5. Sender : TObject;
    6. Text : String;
    7. CurPos : Integer;
    8. MarkLen : Integer;
    9. End;
    10. // …
    11. Unit 2 // Formular zur Vokabeleingabe
    12. // …
    13. var
    14. Edit2Params : Unit1.TEditParams;
    15. // …
    16. procedure TForm2.Edit1Exit(Sender: TObject);
    17. // OnExit-Ereignis für alle Editfelder des Formulars
    18. begin
    19. Edit2Params.Sender:= (Sender as TEdit);
    20. Edit2Params.Text:=(Sender as TEdit).Text;
    21. Edit2Params.CurPos:=(Sender as TEdit).SelStart;
    22. Edit2Params.MarkLen:=(Sender as TEdit).SelLength;
    23. end;
    24. // …
    25. Unit3 { Sonderzeichentastatur mit verschieden vielen und verschieden belegten Zeichen je nach Fremdsprache }
    26. // …
    27. Case AktForm of // Formular 1, 2 oder 3
    28. // …
    29. 2 : begin
    30. (Edit2Params.Sender as TEdit).Text:=SZZuweisung(Edit2Params, SoZeichen);
    31. (Edit2Params.Sender as TEdit).SelStart:=CrsPos;
    32. (Edit2Params.Sender as TEdit).Sellength:=0;
    33. (Edit2Params.Sender as TEdit).SetFocus;
    34. end;
    35. end;
    36. // …

    Probleme: Durch setfocus wird der im Editfeld schon enthaltene Text markiert und bei einer weiteren Eingabe gelöscht
    Beim Wechsel in ein anderes Editfeld wird das Sonderzeichen im vorherigen Editfeld eingefügt.
    Vermutlich ist auch die Verwendung von ‚Sender‘ pproblematisch, kennt vielleicht jemand eine MÖGLICHKEIT; DAS AKTIVE Editfeld zu übermitteln und zu diesem zurückzukehren?
    Nochmals vielen Dank, Gelmo
    Ich würde mir einfach merken, welches Edit zuletzt den Fokus hatte und ggf. eine Property dafür einrichten.

    Delphi-Code

    1. ​uses
    2. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    3. Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
    4. type
    5. TForm1 = class(TForm)
    6. Edit1: TEdit;
    7. Edit2: TEdit;
    8. Edit3: TEdit;
    9. Edit4: TEdit;
    10. Edit5: TEdit;
    11. Edit6: TEdit;
    12. Edit7: TEdit;
    13. Edit8: TEdit;
    14. Edit9: TEdit;
    15. Edit10: TEdit;
    16. Edit11: TEdit;
    17. Edit12: TEdit;
    18. Button1: TButton;
    19. procedure Edit1Exit(Sender: TObject);
    20. procedure Button1Click(Sender: TObject);
    21. private
    22. { Private-Deklarationen }
    23. FLastFocusedEdit: TEdit;
    24. public
    25. { Public-Deklarationen }
    26. property LastFocusedEdit: TEdit read FLastFocusedEdit;
    27. end;
    28. var
    29. Form1: TForm1;
    30. implementation
    31. {$R *.dfm}
    32. procedure TForm1.Button1Click(Sender: TObject);
    33. begin
    34. if Assigned(LastFocusedEdit) then
    35. LastFocusedEdit.Text := LastFocusedEdit.Text + ' Blubb';
    36. end;
    37. (* Ist allen Edits im OnExit zugewiesen *)
    38. procedure TForm1.Edit1Exit(Sender: TObject);
    39. begin
    40. if Sender is TEdit then
    41. FLastFocusedEdit := TEdit(Sender);
    42. end;
    10 Minuten Nachdenken ersparen oftmals 10 Stunden Fehlersuche.
    Habe eine ganze Weile mit dem Vorschlag probiert, im Prinzip klappt das. Aber es taucht folgendes Phänomen auf: Beim ersten onClick-Ereignis, in dem auch auf assigned geprüft wird, stimmt die Eingabe. Wechsle ich dann in ein anderes Edit-Feld und klicke erneut ein Sonderzeichen an, taucht die Eingabe im zuerst bearbeiteten Edit-Feld auf. Es scheint nicht sicher zu sein, dass FLastFocusedEdit rechtzeitig der richtige Wert zugewiesen wird. In der Onlinehilfe von Embarcadero fand ich bei ActiveControl folgenden Hinweis:
    Note: When focus shifts to another control, ActiveControl is updated before the OnExit event occurs.
    Werde die FLastFocusEdit-Property mal im OnEnter-Event der Edit-Felder platzieren.
    VielenDank, mfG Gelmo

    Delphi-Code

    1. (* Ist allen Edits im OnEnter zugewiesen *)
    2. procedure TForm1.Edit1Enter(Sender: TObject);
    3. begin
    4. if Sender is TEdit then
    5. FLastFocusedEdit := TEdit(Sender);
    6. end;

    Mit dieser Änderung klappt alles, die Einfügung erfolgt im richtigen Feld.
    Nochmals vielen Dank
    MfG Gelmo