Problem mit TEdit->BiDiMode



  • Morchn Gemeinde,

    habe eine Form mit 4 Buttons und einem Edit. 2 Buttons mit deutschem Text, 2 mit arabischem. Beim Klick auf einen Button wird der Text des Buttons im Edit angezeigt. Funktioniert auch wunderbar, wenn ich innerhalb einer Sprache bleibe. Also beim Klick auf einen Button mit deutschem Text wird der Text sofort angezeigt. Wenn ich danach wieder auf einen deutschen Text klicke, wird sofort angezeigt. Klicke ich danach auf einen Button mit arabisch, wird zwar der Cursor im Edit nach rechts gesetzt( Edit->BiDiMode = bdRightToLeft; ), aber kein Text. Der wird erst beim erneuten Klick auf den Button angezeigt.
    Liegt an:

    Edit->BiDiMode = bdRightToLeft;
    

    denn wenn ich die Zeile auskommentiere wird immer der entsprechende Text im Edit angezeigt. Und zwar unabhäng davon, ob deutsch oder arabisch.
    Was passiert beim setzen von BiDiMode im Edit? Da die Hilfe dazu mehr als dürftig ist, hab ich auch schon gegooglet. Nur gefunden hab ich leider nix 😞

    Ich schätze mal, dass da irgendwas im/vom Edit 'resettet' wird. Nur was???

    Any Ideas?

    fragend grüssle 🙂



  • Hi,

    ich denke mal, es wird eine WS_EX_RTLREADING Message gesendet.



  • Ok, danke erstmal, aber da hab ich mich wohl missverständlich ausgedrückt.
    Frage ist natürlich: wie umgehe ich was auch immer bei BiDiMode = JeNachDem im Hintergrund passiert?
    Also: wie BiDiMode ändern und gleichzeitig den Text setzen???

    grüssle 🙂



  • Hallo,

    Was machst Du zuerst? Bdimode oder Text ändern?



  • rudiM schrieb:

    Hallo,

    Was machst Du zuerst? Bdimode oder Text ändern?

    wie oben geschrieben. Nach klick auf Button den Text holen, dann abhängig vom Button( ID, selbst vergeben ), BiDi setzen, dann Text rein.
    Hab grad mal erst Text rein, dann BiDi setzen getestet, gleiches Ergebnis 😞

    Aber die Suche läuft ...

    grüssle 🙂



  • Beim Klick auf den Button setze das KeyBoardLayout (ActivateKeyboardLayout), dann den BiDiMode, sonst wird dieser ignoriert.



  • kpeter schrieb:

    Beim Klick auf den Button setze das KeyBoardLayout (ActivateKeyboardLayout), dann den BiDiMode, sonst wird dieser ignoriert.

    mach ich:

    LoadKeyboardLayout( "00000401", KLF_ACTIVATE );     // arabisch
    Edit->BiDiMode = bdRightToLeft;
    Edit->Font->Charset = ARABIC_CHARSET;
    

    KeyBoard umschalten funktioniert auch. Liegt an BiDiMode setzen.
    Aber ActivateKeyboardLayout schau ich mir mal an. Vllt bringts ja was. Dachte bis jetzt, dass

    LoadKeyboardLayout( "00000401", KLF_ACTIVATE );
    

    ausreicht 😕

    grüssle 🙂



  • Hi,

    zur Hilfe noch ein paar Zeilen (mit Abfrage des Layouts):

    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
    	SetMyLayout(2);  // hier arabisch , 0 ist deutsch
    	Edit1->BiDiMode  = Edit1->BiDiMode << bdRightToLeft;
    	Edit1->Text = Button4->Caption;
    	Edit1->SetFocus();
    }
    //---------------------------------------------------------------------------
    
    unsigned int __fastcall TForm1::SetMyLayout(UINT layout)
    {
       UINT nNumLayouts = GetKeyboardLayoutList( 0, NULL );
       HKL* pmem   = (HKL*)HeapAlloc( GetProcessHeap(),
             HEAP_ZERO_MEMORY, sizeof( HKL ) * nNumLayouts );
    
       GetKeyboardLayoutList( nNumLayouts, pmem );
       ActivateKeyboardLayout( *(pmem+(layout)), 0);
       HeapFree( GetProcessHeap(), 0, pmem );
       return nNumLayouts;
    }
    

    edit: Code korrigiert

    mfg
    kpeter


Anmelden zum Antworten