Einzelnen Beitrag anzeigen

se0man

Registriert seit: 8. Mär 2004
51 Beiträge
 
#7

Re: Markierter Text in TField

  Alt 28. Mai 2004, 13:42
Habe in DF ne Antwort bekommen:
Code:
function GetStringGridOrDBGridSelText(Grid : TWinControl) : String;
var
  Wnd      : Cardinal;
  Buf      : String;
  SelStart : Cardinal;
  SelEnd   : Cardinal;
begin
  Wnd:=GetWindow(Grid.Handle,GW_CHILD);
  SendMessage(Wnd,EM_GETSEL,Integer(@SelStart),Integer(@SelEnd));
  SetLength(Buf,SendMessage(Wnd,WM_GETTEXTLENGTH,0,0)+1);
  SendMessage(Wnd,WM_GETTEXT,Length(Buf),Integer(@Buf[1]));
  Result:=Copy(Buf,SelStart+1,SelEnd-SelStart);
end;
Zitat:
Kannst ja mal die Delphi Hilfe zum Typ "Cardinal" aufrufen. Dann bekommst du eine Auflistung aller Typen und deren Gültigkeitsgrenzen.

Das Windows Betriebssystem stellt allen Win32 Programmen die sogenannte WinAPI zur Verfügung. Die WinAPI ist nichts anderes als eine riesige Sammlung von Befehlen (gepackt in verschiedene DLL Dateien).

Die Funktionalität der TMemo Komponente ist z.B. keine Erfindung von Borland. TMemo erlaubt den vereinfachten Zugriff auf das EditBox Feature der WinAPI. Wenn du also ein Memo in dein Programm einbaust, dann gehört das weisse Memo Feld eigentlich nicht dir oder Delphi sondern Windows. Das Fenster ist sozusagen nur geborgt. Deshalb kannst du darauf auch direkt zugreifen, ohne über das TMemo Interface von Delphi zu gehen. Die meisten solchen Komponenten haben ein "Handle" Property, welches du für den Zugriff über die WinAPI brauchst. Meistens geschieht der Zugriff über sogenannte Fensternachrichten (Window Messages) mit der SendMessage Funktion.

Um dein Problem zu lösen, habe ich zusert versucht, ein paar Messages wie WM_GETTEXT oder EM_GETSELTEXT an das DBGrid Control zu senden. Als das keinen Erfolg zeigte, hab ich das folgende Tool gestartet: http://kobik.videodot.net/spy_capture.asp

Es zeigt dir, aus welchen Controls ein Fenster aufgebaut ist und wie die Klassennamen heissen. Diese Namen kann man dann bei den WinAPI Funktionen FindWindow und FindWindowEx verwenden. Da die StringGrid und DBGrid Controls nur ein Child Window besitzen, gings auch ohne Klassennamen über GetWindow(Wnd,GW_CHILD).

Wenn du die Enterprise Version von Delphi hast, kannst du im Quelltext nachgucken, wie die Delphi Komponenten aufgebaut sind. Die StringGrid Komponente benutzt zum Editieren ein TInPlaceEdit Objekt was von TCustomMaskEdit abgeleitet ist welches wiederum von TCustomEdit abgeleitet ist. So sieht man auch schnell, welche Window Messages unterstützt werden.

Alle WinAPI Befehle sind auch in Delphi verwendbar, wenn die richtige Unit eingebunden ist. Die wichtigsten Befehle sind in der Unit "Windows" enthalten. Diese Befehle sind in der Delphi Help selber nicht enthalten, da sie nichts mit Borland zu tun haben, sondern von Microsoft kommen und in einer eigenen Help Datei beschrieben sind.

Bei meinem Delphi7 kann ich die WinAPI Help im Menu "Hilfe-Windows SDK" aufrufen.

Falls dein Kopf vor lauter obskuren Erklärungen schon etwas dröhnt, kannst du ja auch einfach etwas mit den WinAPI Befehlen herumspielen und mal gucken, was es denn so alles gibt. Nach einer Weile wird's dann viel klarer.

Das oben genannte Spy Programm ist sicher auch sehr hilfreich. Damit kann man auch Messages an andere Fenster abschicken, z.B. WM_DESTROY, WM_SHOW usw...
  Mit Zitat antworten Zitat