![]() |
Window-ClassName eines VCL-Controls bekommen?
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ß :wall: ![]() 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:
[add3]
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; ich glaub ich spinne im MSDN seht, daß nur je eine Aufrufkonvention geht und irgendwie stimmt hier garnichts :shock: weder mit Edit.Perform, noch über SendMessage(Edit.Handle bekomm ich "richtige" Ergebnisse. bei einem TRichEdit bekomm ich über beide Varianten
Delphi-Quellcode:
scheinbar richtige Werte,
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); aber bei TEdit und TMemo kommt immer 0 raus :wall: |
Re: Window-ClassName eines VCL-Controls bekommen?
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:
|
Re: Window-ClassName eines VCL-Controls bekommen?
Zitat:
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 :? ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz