Cursorposition ermitteln bei Tastendruck?



  • Hallo, ich bin's mal wieder...

    Ich möchte die aktuelle Cursorposition in einem meiner RichEdits ermitteln.
    Ich weiß, dass ich es per CaretPos machen kann. Soweit funktioniert das auch, allerdings benötige ich immer eine Ereignisbehandlungsroutine.
    Ich habe mir jetzt mal einen Klick auf die Statusbar genommen und lasse dann dort die Position als Zeile und Zeichen aufgelöst anzeigen.

    void __fastcall TFormMain::StatusBar1Click(TObject *Sender)
    {
      int x, y;
    
      if (PageControl1->PageCount > 0)
      {
      x = dynamic_cast<TRichEdit*>(PageControl1->ActivePage->Components[6])->CaretPos.x;
      y = dynamic_cast<TRichEdit*>(PageControl1->ActivePage->Components[6])->CaretPos.y;
    
      StatusBar1->Panels->Items[1]->Text= "Zeichen: " + IntToStr(x);
      StatusBar1->Panels->Items[0]->Text= "Zeile: " + IntToStr(y+1);
      }
    }
    

    (Ich habe das dynamic cast für den Beitrag gelassen, damit gleich ersichtlich ist, dass es sich um eine zur Laufzeit erzeugte Komponente handelt.)

    Natürlich hätte ich es gern so, dass immer wenn der Anwender in dem zur Laufzeit erzeugenten und gerade aktiven RichEdit eine Taste drückt (etwas eingibt) die aktuelle Cursorposition in der Statusbar angezeigt wird.
    Also prinzipiell die selbe Funktion wie in der BCB Stauszeile des Codeeditors.
    Ich habe schon mit OnKeyPress/Down usw. der Form rumexperiemntiert, aber das spielt sich gar nichts ab.
    Da das RichEdit zur Laufzeit erzeugt wurde weiß ich auch leider nicht wie ich eine Ereignisbehandlungsroutine dafür schreiben soll.
    Normal würde es ja mit

    void __fastcall TFormMain::RichEdit1Change(TObject *Sender)
    

    gehen...

    MfG Martin



  • macsmac schrieb:

    Da das RichEdit zur Laufzeit erzeugt wurde weiß ich auch leider nicht wie ich eine Ereignisbehandlungsroutine dafür schreiben soll.

    Schmeiss mal n Auge auf unseren FAQ Index (Festgepinnter Thread in diesem Forum... da wird dir geholfen bei diesem Problem. Alternativ lässt sich

    macsmac schrieb:

    Ich habe schon mit OnKeyPress/Down usw. der Form rumexperiemntiert, aber das spielt sich gar nichts ab.

    mit KeyPreview=true beim Form lösen...



  • Ich weiß gar nicht wie man zu solchem Code kommt. Der Vorteil von dynamic cast ist doch, dass man einen NULL-Pointer zurückbekommt, wenn nicht gecastet werden kann. Ich sehe nirgendwo eine solche Überprüfung. In der Art und Weise, wie Du es einsetzt, kannst Du gleich einen normalen cast nehmen...

    void __fastcall TFormMain::StatusBar1Click(TObject *Sender)
    {
      int x, y;
    
      if (PageControl1->PageCount > 0)
      {
      TRichEdit* preTemp = dynamic_cast<TRichEdit*>(PageControl1->ActivePage->Components[6]);
      if (preTemp)
      {
    	  x = preTemp->CaretPos.x;
    	  y = preTemp->CaretPos.y;
      }
    
      StatusBar1->Panels->Items[1]->Text= "Zeichen: " + IntToStr(x);
      StatusBar1->Panels->Items[0]->Text= "Zeile: " + IntToStr(y+1);
      }
    }
    

    Die (ausführliche) Antwort auf die ursprüngliche Frage findest Du übrigens in den FAQ...



  • junix schrieb:

    macsmac schrieb:

    Da das RichEdit zur Laufzeit erzeugt wurde weiß ich auch leider nicht wie ich eine Ereignisbehandlungsroutine dafür schreiben soll.

    Schmeiss mal n Auge auf unseren FAQ Index (Festgepinnter Thread in diesem Forum... da wird dir geholfen bei diesem Problem. Alternativ lässt sich

    macsmac schrieb:

    Ich habe schon mit OnKeyPress/Down usw. der Form rumexperiemntiert, aber das spielt sich gar nichts ab.

    mit KeyPreview=true beim Form lösen...

    Danke das mit dem KeyPreview war die beste Lösung. In der FAQ hatte ich schon den Beitrag gelsen, aber das passte irgendwie garnicht. Mag aber an meinen Ableitungen liegen. Mein RichEdit liegt auf einem Tabsheet was zu einem PageControl gehört. Wobei die Tabsheets auch zur Laufzeit erzeugt werden...

    MfG Martin



  • Kein Wort zu den casts? Gut, dann mach weiter so, aber wunder Dich nicht, wenn Dein Programm mit seltsamen Access-Violations crashed...



  • macsmac schrieb:

    In der FAQ hatte ich schon den Beitrag gelsen, aber das passte irgendwie garnicht.

    Welchen? und was passte nicht?

    macsmac schrieb:

    Danke das mit dem KeyPreview war die beste Lösung.

    Nein, die bequemste und unsauberste dies gibt.

    @Joe: Da haben wir doch noch son kandidaten hier im FOrum? 8O;



  • @junix: ja eben, wenn man das dann nur oft genug sieht, hält man es irgendwann für richtig... Insbesondere als Anfänger. Deswegen dachte ich, es wäre Zeit, da härter gegen vorzugehen.



  • Absolut richtig... muss ehrlich sagen, mir wars nicht aufgefallen, sonst hätte ichs auch bemängelt...



  • @ Joe: Das mit den Casts habe ich geändert. Wusste nicht, dass ich das melden muss :p

    Mit einer Ereignisbehandlungsroutione für meine zur Laufzeit erzeugten RichEdits hats nicht geklappt. Wahrscheinlich bin ich da falsch rangegangen und habe da noch was nicht durchblickt. Da es auch schon wieder einige Zeit her ist weiß ich leider auch nicht mehr was ich da gecodet habe. zZ habe ich eh Prüfungen und kann mich damit nicht so eingehend befassen wie ich gern würde.

    Ich habe das Ganze mal mit KeyPreview der Form und CaretPos.x ausprobiert. Leider werden nicht alle Tasten berücksichtigt (Pfeiltasten bspw.). Gibt es eine Möglichkeit alle Tasten zu Berücksichtigen. Ich meine gerade die Pfeiltasten zur textnavigation sind sehr wichtig.
    Auch dachte ich, dass ich mit einem OnMouseDown in FormMain die Position des Cursors irgendwie bestimmen könnte, wenn die Maus in ein RichEdit geklickt hat und der Cursor dort jetzt steht.

    Eigentlich liegt es ja nur am auslösenden Event, den Rest würde ja CaretPos erledigen.

    Den Thread den ihr meint ha eich nicht gefunden.

    Danke für eure Hilfe.

    MfG Martin


Anmelden zum Antworten