Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Markierter Text in TField (https://www.delphipraxis.net/21473-markierter-text-tfield.html)

se0man 3. Mai 2004 15:48


Markierter Text in TField
 
Hoi,

nach ewigem Searchen :wall:
entschied ich mich nun doch dafür,
eine hoffentlich nicht allzu blöde Frage
als Neues Thema zu 'eröffnen':

Wie kann ich auf den markierten Text
der in meinem DBGrid befindlichen
TField-Komponente zugreifen?

DBGrid.SelectedField.AsString &
DBGrid.SelectedField.Text
liefern mir unbefriedigenderweise
den gesamten Text des Feldes.

Thanx,

- se0man

fkerber 3. Mai 2004 15:50

Re: Markierter Text in TField
 
Hi!

Gibt es da sowas wie Seltext?

Ciao fkerber

se0man 3. Mai 2004 15:58

Re: Markierter Text in TField
 
Ne, leider nicht.

- se0man

se0man 4. Mai 2004 13:23

Re: Markierter Text in TField
 
Es kann doch nicht sein,
dass das nicht möglich ist !?
:gruebel:
Hat denn niemand eine Idee?

se0man 9. Mai 2004 13:31

Re: Markierter Text in TField
 
Wow!
Bin ich da also schon an die Grenzen von Delphi gestoßen...
:-D

se0man 23. Mai 2004 17:15

Re: Markierter Text in TField
 
So,
jetzt bin ich am Punkt meines Programmes angelangt,
an dem ich ohne die Lösung dieses Problems,
nicht weiter komme.
:shock: Habt ihr wirklich keine Hilfen??

:wall: Alles was ich will,
ist es auf den markierten Text meines DBGrids
(während sich die Zelle im Edit-Modus befindet)
zugreifen.

Das muss doch irgendwie zu bewerkstelligen sein.

Stellt euch vor, ihr steht vor diesem Problem.
Was würdet ihr machen?? :gruebel:

Dankbar für jede Idee
-se0man

se0man 28. Mai 2004 12:42

Re: Markierter Text in TField
 
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...

se0man 1. Jun 2004 10:26

Re: Markierter Text in TField
 
Meine Frage jetzt an alle Non-VCL Kids,
(auch an die anderen...): :mrgreen:

Wie schaffe ich es nun,
einen kopierten Text an der aktuellen Cursor-Position (im Field)
einzufügen? :pale:

EM_GETSEL gibt mir ja je nach Position (0,1,2,3,...)
die seltsamen Werte 0,10001,20002,30003,... aus.
Aber hilft mir das weiter?
Ich wüsste nicht wie...


ciao
-se0man

Muetze1 1. Jun 2004 10:35

Re: Markierter Text in TField
 
Moin!

Entweder ein WM_SETTEXT oder WM_SETSELTEXT senden...

MfG
Muetze1

se0man 1. Jun 2004 11:13

Re: Markierter Text in TField
 
thx, für die schnelle Antwort,

WM_SETSELTEXT existiert leider nicht,
und WM_SETTEXT ersetzt ja den ganzen Text.
Oder gibt es bei zweiterem etwa die Möglichkeit,
eine Startposition anzugeben?

thx
-se0man


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr.
Seite 1 von 2  1 2      

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