AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Window-ClassName eines VCL-Controls bekommen?

Ein Thema von himitsu · begonnen am 18. Dez 2008 · letzter Beitrag vom 19. Dez 2008
Antwort Antwort
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#1

Window-ClassName eines VCL-Controls bekommen?

  Alt 18. Dez 2008, 12:49
Moin erstmal,

irgendwie häng ich grad dabei fest den ClassName des sich hinter der VCL versteckenden Windows-Controls zu bekommen.

z.B.

Edit1.ClassName und GetClassName(Edit1.Handle, ...) liefern mir nur die VCL-Klasse
und das ist im Normalfall 'TEdit' ... ich bräuchte aber den ClassNamen des gekapselten Fensters, also 'EDIT'

Nja, eigentlich möchte ich nur sicher rausbekommen, ob ein Control ein Edit/Memo, Rich Edit 1.0, Rich Edit 2.0 oder Rich Edit 3.0 kapselt,
da ich zum Auslesen von SelStart in Pixeln das Edit/Memo und Rich Edit 2.0 anders befragen muß
http://msdn.microsoft.com/en-us/library/bb761631.aspx

Und nein, GetCaretPos der WinAPI bringt nicht viel, da das Caret hierbei z.B. am Ende, oder am Anfang des selekterten Bereiches sein kann.

[add]
ich versuch das jetzt zwar erstmal für die Delphi-VCL zu zerlegen, aber blöd ist da, daß TCustomRichEdit ein Nachfahre von TCustomEdit ist, obwohl sie von seitens Windows unterschiedliche Klassen sind.


[add2]mein bisheriger Ansatz:
Delphi-Quellcode:
var N: Array[0..31] of Char;
    CP: TPoint;

//N[GetClassName(_Edit.Handle, @N, Length(N) - 1)] := #0;
//If SameText(N, 'EDIT') or (SameText(N, 'RICHEDIT_CLASS') and ((Win32Platform < 1)
// or ((Win32Platform = 1) and (Win32MajorVersion = 4) and (Win32MinorVersion < 90))
// or ((Win32Platform = 2) and (Win32MajorVersion < 5)))) Then Begin
If ((_Edit is TCustomEdit) and not (_Edit is TCustomRichEdit))
    or ((_Edit is TCustomRichEdit) and ((Win32Platform < 1)
      or ((Win32Platform = 1) and (Win32MajorVersion = 4) and (Win32MinorVersion < 90))
      or ((Win32Platform = 2) and (Win32MajorVersion < 5)))) Then Begin
  // Edit ('EDIT') or RichEdit 2.0 ('RICHEDIT_CLASS' on .../98/NT4)
  i := _Edit.Perform($0426{EM_POSFROMCHAR}, _SelStart, 0);
  CP.X := i and $0000ffff;
  CP.Y := i shr 16;
End Else Begin
  // RichEdit 1.0 ('RichEdit') or RichEdit 3.0 ('RICHEDIT_CLASS' on Me/2000/XP/...)
  _Edit.Perform($0426{EM_POSFROMCHAR}, Integer(@CP), _SelStart);
End;
[add3]
ich glaub ich spinne
im MSDN seht, daß nur je eine Aufrufkonvention geht
und irgendwie stimmt hier garnichts

weder mit Edit.Perform, noch über SendMessage(Edit.Handle bekomm ich "richtige" Ergebnisse.

bei einem TRichEdit bekomm ich über beide Varianten
Delphi-Quellcode:
i := Edit.Perform($0426{EM_POSFROMCHAR}, SelStart, 0);
CP.X := i and $0000ffff;
CP.Y := i shr 16;
// und
Edit.Perform($0426{EM_POSFROMCHAR}, Integer(@CP), SelStart);
scheinbar richtige Werte,
aber bei TEdit und TMemo kommt immer 0 raus
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Window-ClassName eines VCL-Controls bekommen?

  Alt 18. Dez 2008, 20:18
Zu deiner ersten Frage: du könntest die (protected) Methode TWinControl.CreateParams aufrufen und dir dann TCreateParams.WinClassName anschauen. Alternativ kannst du die Windows-API-Funktion GetClassName mit Control.Handle benutzen. (Hattest du ja schon)

Zu add3: ist's wirklich ein normales TRichEdit oder ist es ein TJvRichEdit (also 3.0). Das ist nämlich abwärtskompatibel:
Zitat von MSDN:
Rich Edit 3.0 and later: For backward compatibility, Microsoft Rich Edit 3.0 supports the syntax used by Rich Edit 2.0. If Rich Edit 3.0 detects that wParam is not a valid POINTL pointer, it assumes the message was sent using the Rich Edit 2.0 syntax. In this case, it uses the return value to return the coordinates.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#3

Re: Window-ClassName eines VCL-Controls bekommen?

  Alt 19. Dez 2008, 09:04
Zitat von Flocke:
Zu deiner ersten Frage: du könntest die (protected) Methode TWinControl.CreateParams aufrufen und dir dann TCreateParams.WinClassName anschauen. Alternativ kannst du die Windows-API-Funktion GetClassName mit Control.Handle benutzen. (Hattest du ja schon)

Zu add3: ist's wirklich ein normales TRichEdit oder ist es ein TJvRichEdit (also 3.0). Das ist nämlich abwärtskompatibel:
Zitat von MSDN:
Rich Edit 3.0 and later: For backward compatibility, Microsoft Rich Edit 3.0 supports the syntax used by Rich Edit 2.0. If Rich Edit 3.0 detects that wParam is not a valid POINTL pointer, it assumes the message was sent using the Rich Edit 2.0 syntax. In this case, it uses the return value to return the coordinates.
zu [Edit3]
ein ganz normales TRichEdit (nur Delphi-Standardkomponenten getestet hab)

aber laut MSDN soll es doch auch bei EDIT (TEdit und TMemo) funktionieren und dann jeweils über unterschiedliche Aufrufe ... hier geht s nur bei TRichEdit und komischer Weise mit beiden Aufrufmöglichkeiten, da frag ich mich allerdings woran Delphi oder WinAPI (k.A. wer sich da "falsch" verhält) erkennt welche Variante man grad verwendet.

hätt beinah "nee, geht och nicht" geschrieben, aber Params.WindowClass.lpszClassName liefert das gesuchte Ergebnis

(praktisch an der Lösung: die neue Klasse kann ich gleich weiterverwenden und mir so spätere Typcasts ersparren, da einiges anderes in TCustomEdit noch nicht sichtbar ist)



Danke für die Hilfe
(jetzt muß ich nur noch rausfinden warum EM_POSFROMCHAR so "spinnt", da mir dieses sonst umsonst wär )
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz