Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 01:16

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem mit Tastatureingaben...
BeitragVerfasst: Sa Aug 07, 2010 23:08 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Moinsen,

mein GUI-Editor nimmt langsam aber sicher immer mehr Gestalt an (mein Studium beruhigt sich langsam wieder etwas, da kann man ja schonmal an seinen Projekten weiterarbeiten - vllt. wird SketchtowerWars wirklich noch irgendwann mal fertig), aber jetzt bin ich auf ein Problem gestoßen, von dem ich noch nicht genau weiß, wie ichs lösen soll:

Die Benutzeroberfläche meines Editors besteht aus einem Menü, einem ValueListEditor, mehreren SpeedButtons zum Erstellen von Kontrollelementen und einem Panel, auf dem auch gerendert wird. Ich will jetzt die Möglichkeit implementieren, Vertexe / ganze Kontrollelemente mithilfe der Pfeiltasten zu bewegen. Das Problem ist, dass das einzige Objekt auf meiner Form, welches etwas mit KeyPress-Ereignissen anfangen kann (oder vielmehr: welches überhaupt den Fokus erhalten kann) der ValueListEditor ist - und in dessen Feldern sollte man mit dem Pfeiltasten weiterhin navigieren können, ohne dabei ein Kontrollelement zu bewegen.

Ich hatte schon dein Einfall, eine kleine Statemachine zu integrieren, die bei einem Klick auf das Panel, auf dem ich regele auf "Bewege GUI-Elemente" und bei einem Klick auf den ValueListEditor auf "Bewege den Cursor" springt. Im KeyPress-Ereignis des Editors würde ich dann anhand des States entscheiden, was das Programm tut.

Aber: Geht das womöglich eleganter?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Tastatureingaben...
BeitragVerfasst: So Aug 08, 2010 12:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
Wenn du TWinControl in deine Klasse einbindest kannst du einen Focus für das Element bekommen und ganz normal Tasten für deine GUI abfangen.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Tastatureingaben...
BeitragVerfasst: So Aug 08, 2010 12:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
TPanel leitet ebenfalls von TWinControl ab. Also theoretisch solltest du ihm den Fokus geben können, zumindest manuell, mit TForm.ActiveControl := Panel.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Tastatureingaben...
BeitragVerfasst: So Aug 08, 2010 13:27 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
mori hat geschrieben:
Wenn du TWinControl in deine Klasse einbindest kannst du einen Focus für das Element bekommen und ganz normal Tasten für deine GUI abfangen.


Naja, darum gehts ja gar nicht - zumindest nicht direkt. Das Problem ist ja, dass die Tastatureingaben gar nicht bei der GUI ankommen, weil ein anderes Objekt anwesend ist, dass ihr den Fokus "stiehlt"

Lord Horazont hat geschrieben:
TPanel leitet ebenfalls von TWinControl ab. Also theoretisch solltest du ihm den Fokus geben können, zumindest manuell, mit TForm.ActiveControl := Panel.

greetings


Ich hab das gerade probiert - funktioniert leider nicht. Gibt man einem anderen Control als dem ListEditor mit ActiveControl := xyz den Fokus, so verliert der Editor zwar kurz den Fokus, kriegt ihn aber zurück, sobald man eine Taste drückt.
Und selbst wenn das Panel den Fokus behalten würde: Es hat kein KeyPress-Ereignis...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Tastatureingaben...
BeitragVerfasst: So Aug 08, 2010 14:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
zoiX hat geschrieben:
Und selbst wenn das Panel den Fokus behalten würde: Es hat kein KeyPress-Ereignis...

Das KeyPressed Ereigniss kann man wieder holen.
Code:
  TMyPanel=class(TPanel)
  public
    property OnKeyPress;
    property OnKeyDown;
    property OnKeyUp;
  end;

(Was der ValueListEditor eigendlich für eine Klasse? In Delphi 5 ist er nicht vorhanden)

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Tastatureingaben...
BeitragVerfasst: So Aug 08, 2010 15:08 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Hm, hab gerade mal versucht ein TMyPanel zu erstellen und darauf zu rendern - aber irgendwie krieg ich weder was zu Gesicht, noch krieg ich einen gültigen Handle mit GetHandle...hab den Weg jetzt vorerst mal begraben.
Seit wann der TValueListEditor an Bord ist weiß ich nicht, er ist Teil der Unit ValEdit (nutze Delphi 2007)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Tastatureingaben...
BeitragVerfasst: So Aug 08, 2010 15:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
Hast du auch MyHandle.Parent:=Form1 gesetzt? Oder meinst du ein du kriegst nichts zu gesicht, das du nur kein OpenGL Handle bekommst?

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Tastatureingaben...
BeitragVerfasst: So Aug 08, 2010 23:01 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Könntest du nicht eine Klasse von TPanel ableiten, der du dann einige Methoden spendierst, die direkt auf die Tastatureingabe reagieren? Mittels der Funktion GetASyncKeyState sollte das möglich sein. Mit dieser Methode kannst du prüfen, ob eine bestimmte Taste oder Tastenkombination gedrückt wurde oder gerade gedrückt wird. Darauß kannst du garantiert die nötigen Features zusammen schreiben. Diese Methoden brauchst du ja nur dann aufrufen, wenn deine Form bemerkt, dass eine Taste gedrückt wurde.
Wann das TPanel auf die Tastatur reagieren muss/darf musst du natürlich ebenfalls manuell programmieren, weil GetASyncKeyState auch dann reagiert, wenn dein Programm den Fokus nicht hat. Also nebenher in ICQ schreiben könnte sonst unter Umständen auch schon Aktionen im Editor auslösen.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Tastatureingaben...
BeitragVerfasst: So Aug 08, 2010 23:16 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
GetAsyncKeyState, ich wusste, dass es da ne Funktion für gibt - aus VB-Zeiten, ewig ists her.
Aber das Problem bleibt ja - ich kann keinem anderen Steuerelement, außer dem ValueListEditor den Fokus geben...werd den wohl in ne eigene Form auslagern, dann erübrigt sich das Problem ja...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Tastatureingaben...
BeitragVerfasst: Mo Aug 09, 2010 00:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

also ich bin mir nicht sicher ob "ActiveControl := xyz" dasselbe macht, dafür sind meine Delphi-Zeiten zu lange her... aber, probier es mal mit "panel1.setFocus()" im MouseDown-Event vom Panel.

Irgendwie so muß es aufjedenfall gehen, denn ich hatte damals eine OpenGL Komponente von TPanel (oder TWinControl) abgeleitet die mir die ganzen Standard-Sachen abgenommen hat. Und die konnte auch OnKeyDown-Events etc..
Müßte mal meine Delphi-sachen durchwühlen, irgendwo find ich das sicher noch.

Ansonsten falls ich falsch liege wäre eine - zwar unschöne - notlösung einfach ein Edit-Feld o.Ä. mit 0x0 Größe irgendwo platzieren dem du den focus gibst sobald auf dein Panel geklickt wird. Dann bedienst du dich einfach an den Events von dem ding :)

Aya


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Tastatureingaben...
BeitragVerfasst: Do Aug 12, 2010 09:44 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Okay Leute, danke für eure Hilfe, es läuft jetzt. Der Reihe nach:

mori:
Es reicht sogar (frag mich nicht warum) einfach eine Klasse wie folgt "abzuleiten":
Code:
TCrackThePanel = class(TPanel);

Und schon kann man auf die OnKeyDown/Up/Press-Ereignisse zugreifen, ein "Publizieren" der Eigenschaften ist komischerweise nicht nötig. Man muss, wenn man dann auf die Eigenschaften zugreifen will, nichtmal ein neues TCrackThePanel erstellen, wenn man
Code:
TCrackThePanel(Panel).OnKeyDown := Eventhandler;

ausführt, ist einem bestehenden Panel vom Typ TPanel der Eventhandler an das OnKey...-Ereignis zugewiesen.

nochmal mori:
Die Parentsache: Ja, danke, das hatte ich tatsächlich vergessen!

Sellman:
GetAsyncKeystate war letztlich doch nicht nötig, und einer neuen Klasse großartig Methoden spendieren musste ich auch nicht, siehe oben - es ging am Ende doch alles mit der "Cracking"klasse

Aya:
Ich denke die beiden Varianten ActiveControl := xyz und xyz.SetFocus() machen das Gleiche, will mich aber nicht festlegen.

Und jetzt zu der Lösung meines Problems:
Zunächst nochmal ein kurzer Anriss des Problems:
Ich wollte einem TPanel ein KeyDown-Ereignis verpassen, welches es ermöglicht, auf Eingaben durch die Cursortasten zu reagieren. Auf meiner Form außer dem TPanel anwesend war noch ein ValueListEditor (und einiges Anderes, was aber kein Problem darstellt), und immer wenn ich das TPanel angeklickt hab (und ihm den Fokus zugewiesen hatte), ging der Fokus auf den Editor über, sobald ich eine Pfeiltaste drückte. Davon ganz abgesehen besitzt TPanel auch noch kein publiziertes OnKeyDown-Ereignis.

Um letzteres Problem zu lösen hab ich recht bald das getan, was ich in meiner ersten "Ansprache" an mori beschrieben hab. Das funktionierte auch tatsächlich - solange das Panel Fokus hatte reagierte es auf Tastendrücke mit dem Ausführen des KeyDown-Eventhandlers. Wie beschrieben, war es nicht einmal nötig eine eigene Instanz der Crackingklasse zu erstellen. Heureka? Nein. Alle Tastendrücke? - Auch nicht: Ein Druck auf die Pfeiltasten sorgte weiterhin dafür, dass das Panel den Fokus verlor.

Um rauszufinden, was da noch falsch lief war eine kleine Internetrecherche nötig, und die lieferte zu Tage, dass TPanel nicht auf die Windowsmessage reagiert, die zum Druck einer Pfeiltaste gehört. Um das Problem zu lösen brauchte meine Crackingklasse doch noch eine zusätzliche Prozedur, hier sämtliche Deklarationen und Prozeduren, die nötig sind, um mit einem TPanel adäquat auf einen Pfeiltastendruck zu reagieren (vllt. brauchts ja nochmal wer):

Code:
type
 TCrackThePanel = class(TPanel)
  procedure WMGetDlgCode(var Msg: TMessage); message WM_GETDLGCODE;
 end;

procedure TCrackThePanel.WMGetDlgCode(var Msg: TMessage);
begin
 inherited;
 Msg.Result := Msg.Result or DLGC_WANTARROWS;
end;

procedure TForm.OnCreate;
begin
// Hier eine Instanz von TCrackThePanel erstellen und alle wichtigen Eigenschaften eines Dummy-Panels zuweisen
// (damit man die Eigenschaften des geknackten Panels mit der Delphi-IDE bequem ändern kann).
// Dabei natürlich den KeyDown-Handler nicht vergessen - für den betreiben wir den Aufwand ja ;)
end;

procedure TForm.PanelKeyDown(Sender: TObject; var Key: Word; Shift:TShiftState);
begin
 ShowMessage(IntToStr(Ord(Key)));
end;


Anwendung starten, dem Panel den Fokus verpassen (am besten im OnClick-Handler des Panels via SetFocus), Pfeil-nach-unten-Taste drücken und...eine Messagebox mit "40" erscheint!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 17 Queries | GZIP : On ]