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