Autor Beitrag
seoman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Di 04.05.04 12:47 
Hoi,

nach ewigem Searchen
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
seoman Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Do 06.05.04 12:24 
Hätte den niemand irgend einen Tipp ???

Würde mir echt weiterhelfen...

-seoman
seoman Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: So 23.05.04 17:10 
So,
jetzt bin ich am Punkt meines Programmes angelangt,
an dem ich ohne die Lösung dieses Problems,
nicht weiter komme.
:shock: Habt ihr wirkliche keine Hilfen??

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

Das muss doch irgendwie zu bewerkstelligen sein.

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

Dankbar für jede Idee
-seoman
EUOCheffe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 124



BeitragVerfasst: So 23.05.04 19:05 
Du Armer! *Mitleid hab*

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
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;


Btw: Das ist kein Copy&Paste Code sondern meine eigene Kreation.
seoman Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mo 24.05.04 12:06 
:dance: :dance2:

:mrgreen: thanxxxxx @ EUOCheffe



:roll:
Eine kleine Bitte wäre da halt noch...
Könntest du den Code vielleischt kurz für mich erklären.
Ich verstehe nur die Hälfte,
und mit Cardinal habe ich noch nie gearbeitet.
Ausserdem kann ich nie verstehen,
wo ihr diese Funktionen/Prozeduren herbekommt,
die nicht in der DH dokumentiert sind (z. B. GetWindow) !?

:beer: Auch so, Danke nochmal.
-seoman
EUOCheffe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 124



BeitragVerfasst: Di 25.05.04 20:02 
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: 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...
seoman Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mi 26.05.04 10:01 
Was sollte bei einer so klaren Erklärung rauchen?
Alles kapiert! :think:

Ich danke nochmal und werde mich gleich mal ans ausprobieren machen.
:rofl:
thanxxxxx
-seoman