Frage

ich weiß, dass fensterlos Kontrollen nicht Magie . Eine Steuerung kann fensterlos Eingang haben Fokus (z.B. Internet Explorer). Eingabefokus ist nichts anderes als Zeichnung entweder:

und wenn der Benutzerschlüssel beginnt Maischen, reagieren entsprechend. Sie wissen die Tastenanschläge gemeint sind für , dass Kontrolle konzentriert, denn das ist das Steuerelement Fokus.

Bei meiner (Windows®) Fenster, würde ich muss wissen, dass mein fensterlos Kind Kontrolle (lasst uns vorgeben es ist ein Nachkomme von TGraphicControl) wird die Tastatur Veranstaltungen. Also während meiner Form der OnKeyDown, OnChar, OnKeyUp, ich müsste so zu tun, sie zu meiner fensterlos Kind Kontrolle gehen.

, die ich tun kann, aber es ist ein Schmerz.

Aber dann wird der Benutzer wahrscheinlich wollen verwenden Tab Navigation, und ich werde irgendwie abfangen Delphi normalen Registerkarte Auftragsabwicklung haben, und Haken in mir, dass zu sagen, dieses Ding ist die nächste (und frühere) in der Tab-Reihenfolge.

, die ich tun kann, aber es ist ein Schmerz.

Und dann gibt es ActiveControl, die etwas nicht verstehen, außer TWinControl ist. Also, wenn Delphi jemals versucht, um herauszufinden, wer den Fokus hat, wird es verrückt. Also würde ich habe eine alternative Implementierung von Active haben.

, die ich tun kann, aber es ist ein Schmerz.

Mit anderen Worten: ist dies einfach zu viel Arbeit Ich kämpfe eveything dass Delphi ist, alle, so kann ich ein paar Dutzend fensterlos Anschlüsse sind durch Tastatureingabe haben? Die Delphi-Designer nie Kontrollen mit interaktiven fensterlos in Betracht gezogen, und wenn ich jetzt versuchen, es zu arbeiten, ich werde nur in dem hurtlocker ?

Delphi gab mir die Chance, mich bereitwillig Unterstützung, aber ich habe den Weg des Schmerzes gewählt.


Einige weitere Erklärung von fensterlose Steuerelemente benötigt wird.

Nicht jede Kontrolle, die Sie interact mit einer Windows-Kontrolle sein muss. Es ist durchaus möglich Fokus hat auf, und die Tastatureingabe, eine Steuer zu senden, die keine Windows-Fenster sind.

Zum Beispiel fast jede Kontrolle, die Sie in einem Internet Explorer-Browser-Fenster sehen, ist ein fensterloses Steuerelement. Im folgenden Screenshot sehen Sie ein Bearbeiten Steuerung finden, die Sie eingeben können, und eine Schaltfläche, die (in diesem Screenshot) den Fokus hat:

Sie können das gepunktete Fokusrechteck sehen, und die Taste ist bläulich (die unter Windows zeigen an, dass es den Fokus hat).

Wenn ich zu drücken waren Spacebar , während die Google Search Schaltfläche den Fokus hat, würde es drücken die Taste. Der Grund, dies funktioniert, ist, weil Microsoft eine ganze Widget-Bibliothek von Steuerelementen geschrieben. Diese Kontrollen Look and Feel (fast) genau wie die regelmäßigen gemeinsamen Kontrollen -. Sie sind sehr nahezu exakte Klone des allgemeinen Windows-Steuerelemente, bis hin zu den Themen angewandt wird

Mozilla Firefox und Google Chrome verwenden auch eine Widget-Bibliothek von Kontrollen. Sie verwenden nicht Microsoft-interne Fenstersteuerungen, sondern eine Bibliothek von grafischen, interaktiven, fensterlos verwenden Widgets .

Und wenn Sie eine passende Entwicklungsumgebung haben, dann ist diefensterlos Widgets funktionieren genauso wie „normale“ Fenster-Kontrollen. GTK + ist ein Widget-Bibliothek, und Glade ist eine IDE, die Sie Steuerelemente in diesem Widget-Bibliothek Layout können.

ich weiß nicht, in welcher Entwicklungsumgebung Firefox, Chrome oder Blender in erstellt wurden, aber ihre Widgets unterstützen fensterlose Steuerelemente.


So, jetzt auf meine Frage.

Wenn ich nicht irre, scheint es mir, dass, obwohl Delphi eine Basis TControl unterstützt, (die Breite, die Höhe und kann sich selbst malen), ist es nicht Tastaturfokus erhalten können. Es scheint mir, dass Borland nie als generische Widget-Bibliothek Delphi VCL entworfen. Der einzige Beweis, ich habe dies zu unterstützen, ist, dass eine Form des ActiveControl ist ein Twincontrol:

property ActiveControl: TWinControl;

Das bedeutet nicht, dass Delphi, sein könnte oder muss begrenzt sein, in den Fenstersteuerungen. Die Bibliothek Widget VCL könnte zur Unterstützung geben Fokus auf fensterlose Steuerelemente erweitert werden.

Aber vielleicht Delphi unterstützt bereits fensterlos Kontrollen , und ich es einfach nicht erkennen? Gibt es bereits einen etablierten Mechanismus in Delphi zu unterstützen Fokus auf TControl des zu geben? Aber ich bin ein ziemlich kluger Kerl, und ich bin ziemlich sicher, dass Delphis VCL kann nicht tun, was andere Widget-Bibliotheken tun können.

was dann zu einer anderen Frage: , wie viel Arbeit zu Unterklasse bildet sein würde und so unterstützen Gibt es jemand anderes da draußen, vielleicht jemand auf TeamB, der klüger ist viel, als ich, wer hat es schon versucht, und kommen zu dem Schluss, dass es unmöglich

Ich frage jetzt, nach vorne, wenn versucht, fensterlos Steuer Unterstützung hinzufügen verdammt nahe unmöglich ist (das heißt sinnlos) - so dass ich nicht verbringen Wochen auf sie für nichts. Ich versuche, auf dem Wissen einer Gemeinschaft von Delphi-Entwickler zu ziehen.

Ich frage eine Frage.

War es hilfreich?

Lösung

Es ist sinnlos zu bauen fensterlos Kontrollen und passen sie in Delphi VCL-Framework.

Sie bringen den Internet Explorer als Beispiel auf. Aber in diesem Fall ist es ganz für alles verantwortlich, dass wohnen auf sich. Es hat seine eigene innere Vorstellung von dem, was die aktiven Kontrolle, aber darüber nachdenken, wie es von außen aussieht: Es ist nur ein Riesen-Kontrolle. Wenn Sie das O fragen, welche den Fokus hat, hat die einzige Browser-Steuerung es, unabhängig davon, welche von dem Browser-subcontrols erscheint , um den Fokus zu haben.

Wenn Sie die Tabulatortaste drücken, sieht es auf dem OS als ob der Browser einfach ein Tab-Zeichen verbraucht hat, so wie Edit-Steuerelemente tun. Edit-Steuerelemente bewegen Sie den Cursor über ein paar Räume und fügen Sie Tabulatoren, um ihre internen Puffer; Browser steuert den Cursor auf einem anderen Bereich des Displays.

Sie denken an all dies auf einer Delphi TForm tun. Delphi Formen haben bereits einen Rahmen für die Verwaltung der aktiven Steuerung und Handhabung Tastenanschläge, und Sie gehen zu müssen kämpfen sie alle. Wenn Sie fensterlose Steuerelemente möchten, gehen die Strecke Internet Explorer und bauen Sie Ihre eigenen Container-Steuerelement halten sie so, dass Sie verantwortlich für alles bleiben kann, die im Inneren geschieht.

können Sie Ihre Behälter ein VCL-Steuerelement, aber die Dinge, die man auf sie setzen können wahrscheinlich nicht - sie werden nach wie vor die VCL Fokus- und Tastatur-Handling-Regeln verwenden erwarten. Beachten Sie, wie Sie kein normales Windows-Steuerelemente in Internet Explorer setzen können, auch nicht. Alles, was Sie setzen es durch spezifische ActiveX-Schnittstellen gehen muss. Vielleicht werden Sie Schnittstellen benötigen, auch, oder vielleicht können Sie nur Ihren eigenen Satz von Steuerklassen machen, die von einigen speziellen Vorfahrklasse Sie zur Arbeit mit Ihrem Container entwerfen absteigen. Nicht mit TGraphicControl beginnen; es ist auch in der VCL verschanzt für Ihre Spross-Control-Bibliothek nutzbar als Basis zu sein.

Es wird eine Menge Arbeit, aber dann wieder, so war Internet Explorer.

Andere Tipps

Ja, es ist zwecklos.
Und es ist nicht Delphi Schuld, du bist nur kämpfen Windows selbst.
Wenn Sie ein Steuerelement, das verhält sich wie ein fensterorientiertes Steuerelement, verwenden Sie ein ein Fenster.
Und du hast Recht, versuchen, die ganze API Stapel von Fenstersteuerungen von Grund auf neu zu erstellen ist ein Schmerz.

Yup, Sie haben ziemlich viel es herausgefunden. Mit fensterlos Kontrollen bedeutet, dass Sie verlieren alles, was Windows-tun können, um Ihnen zu helfen. mehr als ein Paar, ist auf einem einzigen aktuellen Fenster Schmerzen.

Die meisten dieser Programme wurden höchstwahrscheinlich ursprünglich nicht mit Typ RAD entwickelten Tools so keine andere Wahl hatte, sondern neu erfinden das Rad. Einer der größten Vorteile von Delphi ist die tiefe VCL und 3rd-Party-Komponente Unterstützung Ihrer gewünschtes Aussehen zu liefern.

Eine Technik, die ich mit großem Erfolg eingesetzt habe, die Menge an Fenstergriffen in einem Komplex (Steuer-Vorbereitung) zu reduzieren basierte Anwendung bilden war, den Text auf einer Leinwand zu zeichnen, und zog eine einzige TCustomEdit decendant in die Position der Benutzer redigierte. Es war trivial die TAB / Hoch / Runter-Tasten zu erfassen und die Bearbeitung in die entsprechende Position zu bewegen. Die Herausforderung, die wir entdeckt wurde, in ein heißes Rechteck zeichnen rund um die Maus Feld schwebte. Wir sind am Ende mit einer Gitteranordnung von TObject, wo das Array-Element nil wird (kein Feld), ein tlist (Gitter enthalten mehrere Felder) oder eine Klasse, die unseren Felddeskriptor enthalten. Dies reduziert die Menge der Bereichsprüfungen mussten wir durchführen, da es wahrscheinlicher war, dass die Box nur ein einzelnes Feld enthalten ist, oder höchstens 4 Felder aus.

fpGUI Toolkit ist ein Beispiel dafür, was Sie wollen. Der neueste fpGUI Code im Quelltext-Repository auf einem Multi-Fenster-Design basiert. Die einfache bedeutet jedes Widget / Komponente einen Fenstergriff, aber Windows oder Linux tut nichts mit diesem Fenster, andere, dass grundlegende Benachrichtigungsnachrichten (MouseEnter-, mouseexit, etc). fpGUI hat noch volle Kontrolle darüber, wo jede Komponente geht, wenn sie fokussierbar sind, wie sie aussehen usw. Einige Widgets / Komponenten in fpGUI sind Nichtfenster zu Komponenten. zB:. TfpgScrollbar, TfpgMainMenu, die Taste in einem ComboBox etc

Wenn Sie eine echte Nichtfenster-Version wollen, bedeuten, dass es nur ein Fenster der obersten Ebene, die einen Fenstergriff hat, werden alle anderen Widgets / Komponenten innerhalb dieses Fenster nicht mehr existiert tatsächlich auf das OS (sie keine Fenstergriffe haben auch), helfen fpGUI kann dann. Der ursprüngliche Entwurf von fpGUI Toolkit wurde auf eine solche Konstruktion basiert. im Quellcode-Repository für den v0.4 Zweig des Code wieder sehen. Ich, dass Design, hatte fpGUI absolut alles zu handhaben, MouseEnter- / mouseleave Ereignisse zu schaffen, Koordinatensysteme für Containerkomponenten Griff (fake) Komponente des Fokus heißt etc übersetzen ... Ja, der erste Entwurf ist eine Menge Arbeit, aber dann Sie haben einen sehr tragbaren Rahmen, der leicht auch auf andere Betriebssysteme angewendet werden kann.

Und ja, fpGUI ist vollständig in der Sprache Object Pascal mit dem Free Pascal Compiler Cross-Plattform-Unterstützung implementiert, um mich. Derzeit fpGUI läuft unter Windows, Linux (32 & 64 Bit), Windows Mobile und Embedded Linux (ARM) Geräte.

Ich habe keine Ahnung von dem, was Ihr Problem wirklich ist, hier, aber ich denke, diese kleine Geschichte von Bedeutung sein kann ...

Wir haben eine Anwendung, die ein Dutzend Formen füllt. Der Benutzer kann zusätzliche Formulare ausfüllen, und auch durch die Anwendung gefüllt Änderungswerte aus selbst ein.

Nun, in unserer ersten Implementierung verwenden wir Fenster Komponenten für jedes einzelnes Eingabefeld, so dass die Felder Fokus und Eingaben empfangen können. Das erwies sich als ein großes Problem zu sein, denn alle diese Fenster eine Menge von Ressourcen hat.

Wir haben jetzt fensterlose Steuerelemente für jedes Eingabefeld ein. Das bedeutet, dass alles, was wir am Ende mit, ist eine kombinierte Darstellung der Form und seine Eingabefelder. Wenn der Benutzer klickt in der Zeichnung, oder verwendet einige Tastenanschläge bewegen / set Fokus legen wir eine neue Fenstersteuerung für das Klickfeld. Wenn sich der Benutzer bewegt sich auf das nächste Eingabefeld, zerstören wir das erste Fenster, und erstellen Sie eine neue. So können wir nur eine Fenstersteuerung haben, die uns wieder eine schöne Verbesserung der Geschwindigkeit gab.

Auch hier - ich habe keine Ahnung von dem, was Sie wirklich wollen, zu verwalten. Twincontrol ist ein Twincontrol aus einem Grund, aber es kann eine Lösung sein, was Sie wollen, was auch immer das wäre ...

Ich denke, fgGUI kann Ihnen helfen.

Do überprüfen Sie die Wiki zuerst.

ich glaube, Sie diesen Rahmen für Ihre Anwendung in Delphi verwenden können, wie es völlig in Pascal geschrieben. Eigentlich ist es auf Freepascal;)

HTH

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top