Autor Beitrag
Ruditschka
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Mi 11.06.03 11:10 
Hallo!

Ich suche eine Möglichkeit ein Objekt zu überprüfen, ob es Tastatureingabe zulässt. Bis jetzt hole ich mir den Classennamen mit GetClassName und vergleiche den String mit mir bekannten Classennamen von Objekten, die Tastatureingaben zulassen (also z.B. Edit, TEdit, Memo, TMemo, ComboBox, Internet Explorer_Server etc.).

Da ich so nicht auf fremde Anwendungen mit evtl. eigenen Classennamen reagieren kann suche ich ein anderes Kennzeichen von Objekten, die Texteingaben akzeptieren.

Gibt es vielleicht so etwas wie eine Oberklasse aller dieser Classen?
Oder steckt eine versteckte Information in der Classennummer?

Gruß
Christoph
specialwork
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52

Windows XP Professional; Windows Server 2003
Delphi 7 Prof, Delphi 8.Net
BeitragVerfasst: Mi 11.06.03 23:42 
Titel: CustomClass->FinalClass
Hallo Ruditschka,

Es gibt tatsächlich so etwas wie eine Oberklasse. Zum Beispiel ist die Komponente TEdit von TCustomEdit abgeleitet. Ist Überigens wunderbar in der Delphi Hilfe unter dem Punkt Hierarchie ersichtlich. Allerdings setzt dies nicht voraus, dass Du damit sämtliche Komponenten die ein Caret besitzen, auch tatsächlich aufspürst.

Gruß, Tom
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Mi 11.06.03 23:59 
Hi!

Die Delphi-Hilfe hat folgendes geschrieben:

Fensterorientierte Steuerelemente sind Objekte, die zur Laufzeit sichtbar sind und mit denen der Benutzer interagieren kann. Jedes fensterorientierte Steuerelement hat ein Fenster-Handle, das über die Eigenschaft Handle abgefragt wird und das Steuerelement gegenüber Windows identifiziert. Steuerelemente, die ein Handle haben, können den Eingabefokus erhalten. Außerdem kann das Handle an Funktionen der Windows-API übergeben werden.
Alle fensterorientierten Steuerelemente stammen von der Klasse TWinControl ab. Dazu gehören die meisten der unter Windows üblichen Standard-Steuerelemente wie z. B. Schaltflächen, Listenfelder und Eingabefelder. Obgleich Sie die Möglichkeit haben, ein völlig neues Steuerelement (also eines, das nicht von einem vorhandenen Steuerelement abstammt) direkt von TWinControl abzuleiten, bietet Ihnen Delphi zu diesem Zweck die Klasse TCustomControl an. TCustomControl ist ein spezielles fensterorientiertes Steuerelement, das über komplexe grafische Funktionen verfügt.


Geht also mit dem "Parent-Abklappern" nur bedingt. :(

Gruß,
Markus
Ruditschka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Do 12.06.03 11:35 
Das Handle der entsprechenden Komponente habe ich auf jeden Fall. Es geht auch nur darum, ob eine bestimmte (mir bekannte) Komponente auf Tastatureingaben reagieren kann.

Mit welcher Funktion bekomme ich heraus, von welcher Klasse das Element abgeleitet ist? Geht das nur mit den Delphi-Komponenten (also TEdit, TMemo etc.) oder auch mit normalen Windows-Komponenten (also nur Edit, Memo etc.)?

Gruß
Christoph
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 12.06.03 12:55 
GetClassName.
Ruditschka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Do 12.06.03 22:08 
Moin!

Luckie hat folgendes geschrieben:
GetClassName.


Die Funktion benutze ich jetzt bereits und vergleiche den Rückgabewert mit bekannten Classes die Tastatureingaben akzeptieren.
Kann man mit GetClassName evtl. den Namen der Stammklasse finden?

Gruß
Christoph
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 12.06.03 22:11 
Nein. Und Stammklassen gibt es nur bei Klassenbibliotheken. Hast du ein Programnm vor dir welches ohne VCL oder MFC geschrieben wurde bekommst du nur ein EDIT als Klassennamen, weder TEDIT noch CEDIT.
Ruditschka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Do 12.06.03 22:37 
Damit wäre ich wieder bei meiner jetzigen Methode:
Kassenname auswerten, ob bekannt.

Damit kann ich aber nicht auf unbekannte Anwendungen reagieren mit evtl. anderen Klassennamen.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 12.06.03 22:39 
wozu brauchst du das denn? Eventuell gibt es einen anderen Weg.
Ruditschka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Do 12.06.03 23:16 
Ich möchte wissen, ob das Objekt, von dem ich das Handle habe, ein Objekt ist, das Tastatureingaben akzeptiert.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 13.06.03 09:32 
Ja das ist mir schon klar, nur warum?
Ruditschka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Fr 13.06.03 10:50 
Ich habe eine Bildschirmtastatur geschrieben. Die überwacht mit einem Hook, wodrauf der Benutzer geklickt hat und wertet den Klick aus, ob es ein Element ist, dass Tastatureingaben verarbeitet.

Wenn der Benutzer jetzt auf einen Button in meinem Programm geclickt hat (also die entsprechende Taste auf der Tastatur), hat eben dieser Button den Fokus.

Jetzt gebe ich mit SetForegroundWindow(actHWND); dem letzten Element, das Tastatureingaben verarbeitet, den Fokus (SetFocus klappt aus irgendeinem Grund nicht immer) und löse ein Keyboardevent aus.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  if SetForegroundWindow(actHWND) then
  begin
    keybd_event(VK_BACK, MapVirtualKey(VK_BACK, 0), 00);
    keybd_event(VK_BACK, MapVirtualKey(VK_BACK, 0), KEYEVENTF_KEYUP, 0);
  end;


Mein Problem ist jetzt, dass ich über die Abfrage der Klassennamen nur auf bekannte Klassen(Namen) reagieren kann (bzw. den Fokus setzen kann). Sobald eine Anwendung kommt, die andere Klassennamen besitzt, stehe ich mit dieser Methode auf dem Schlauch. Genau so gibt es ja noch andere Felder, die Tastatureingaben akzeptieren/verarbeiten als Edits, Memos, Combos (unter Trillian z.B. heißt ein einfaches Edit-Feld "Trillian Displa").