Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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