Shortcuts Objektabhängig und nicht Anwendungsabhängig.



  • Hallo zusammen.
    Wenn man im C++ Builder ein Shortcut für z.B. ein MainMenu vergibt, wird das selbe Shortcut für eine Funktion vom System überschrieben. Kann man dies irgendwie nur Objektabhängig machen?

    Genauer:
    Im MainMenü unter bearbeiten findet man immer die schönen Funktionen Rückgängig, Wiederholen, Ausschneiden, Kopieren, Einfügen und dazu habe ich auch die klassischen Shortcuts erstellt. 😉
    Wenn man nun in einer StringGrid ist und nun auf kopieren geht oder eben Strg+C drückt, kann ich die Funktionien in dem MainMenu Objektabhängig indem ich mit einem Zeiger oder eben prüfe, ob ein Objekt fokussiert ist. Dann kann ich ja schon per Strg+C Werte aus der Zelle kopieren.
    Nun, wenn ich aber in einem TEdit reingehe, funktioniert Strg+C nicht mehr, da dieser Shortcut nun auf die Funktion des MainMenus (Kopieren) zugreifft.
    Das selbe passiert auch in einer ganz anderen Form, was ich für meinen Teil als unverständlich ansehe, da mindestens ShortCuts in der nächsten Form nicht mehr gelten sollten.

    Gibt es eine Möglichkeit die zu vergebenen ShortCuts nur Objektabhängig zu machen? Ich habe zwar schon ein paar Dinge ausprobiert, wie ich es alternativ machen kann (z.B. Zeiger und Sendern), jedoch finde ich es unpassend da ich auch für die einfachsten Shortcuts eigene Funktionen schreiben darf. Denn ich muss ja dann für jedes Objekt die Shortcuts erstellen und dazu die passenden Funktionen schreiben 😮

    Oder ich weiß irgendwas Grundlegendes nicht, was man einstellen oder beachten soll während man ShortCuts vergibt? 😕



  • Ich kann deiner Beschreibung nicht ganz folgen, aber warum definierst du systemweit gültige Shortcuts in deinem Programm überhaupt nochmal neu?



  • Also im Mainmenu kann man ja bei den Items unter Eigenschaften einen ShortCut wählen. Da es ja üblich ist, ein Bearbeiten-Menü zu erstellen, habe ich auch die klassichen Dinge wie Kopieren, Einfügen, Ausschneiden drin und damit auch der Benutzer die ShortCuts dazu sehen kann, habe ich die entsprechend eingetragen. Joar, und dann gehen die System-ShortCuts nicht mehr, da dieses Menü diese ShortCuts überschreibt (auch wenn dort keine Aktionen sind).

    Desweiteren möchte ich ja auch bei meinem StringGrid Aktionen für das Kopieren, Ausschneiden und Einfügen haben, weshalb ich mir die ja selbst geschrieben hatte.



  • Ich habe dein Problem verstanden, da ich auch schon dieses selbst hatte -)

    Überprüf einfach in deinen Methoden, welches Control gerade aktiv ist (d.h. den Focus besitzt) und bei einem Edit oder Memo etc. rufst du dann dessen Cut(), Copy() und Paste() Methoden auf. Dies kannst du auch allgemeingültig programmieren, z.B. mittels dyamischem cast oder den TObject-Methoden (z.B. ClassNameIs oder InheritsFrom).



  • Danke für deine Antwort Th69. 🙂

    Die Prüfung, ob der Focus gesetzt ist, mache ich ja schon zur Zeit bei der StringGrid. Da die Systemfunktionen sowieso nicht funktionieren (z.B. Strg+C würde meiner Meinung nach kopiere Wert aus Zelle entsprechen), muss man seine eigenen schreiben. 🙄

    Aber dann funktioniert eben Strg+C bei den anderen Objekten nicht mehr. Denn wenn kein StringGrid ein Focus hat, wird keine Aktion ausgeführt... 😞

    Damit das funktioniert, muss ich wie gesagt hattest, prüfen, ob ein anderes TObjekt Focus hat und dann dafür Methoden ausführen, die ich aber selber geschrieben habe. Also in der Ausführ-Aktion des ShortCut alle TObjekte (brauch nur die ich benutze) prüfen lassen und dann bei "Treffer" eben eine Aktion ausführen.

    Mit Zeigern auf ein TObjekt und OOP ist das ja kein Problem, aber ich finde das von Borland nicht gerade toll gelöst, dass beim Setzen eines ShortCuts direkt das ShortCut für die ganze Anwendung gilt (samt andere Formulare)... Es dreht sich ja nicht nur um Cut, Copy, Paste sondern auch um das Markieren sowie Rückgängig und Wiederholen... 🙄

    edit: Öhm, dass ist nicht nur bei Borland so, hab gerade auch Visual C++ ausprobiert. Da bin ich wohl mit anderen Erwartungen dran gegangen. 😉


Anmelden zum Antworten