Results 1 to 4 of 4

Thread: Hoe haal je het geselecteerde deel van een string in een cell van een dbgrid op?

  1. #1
    Senior Member
    Join Date
    Mar 2002
    Location
    Edam
    Posts
    426

    Hoe haal je het geselecteerde deel van een string in een cell van een dbgrid op?

    Hoi,

    Ik heb een handig filterknopje boven mijn dbgrids waarmee je op simpele wijze een filter kan instellen: Bij het aanklikken van het filterknopje wordt de waarde van het op dat moment geselecteerde veld in het dbgrid opgehaald en omgezet naar een filter.

    Code:
    veldnaam:=dbgrid.selectedfield.fieldname;
    waarde:=dbgrid.selectedfield.fieldname.asstring;
    
    if waarde='' then waarde:='NULL'
    else if not dbgrid.selectedfield.datatype in [ftInteger, ftFloat,ftBoolean] then waarde := quotedstr(waarde);
    
    filter:= format('(%s=%s'),[veldnaam, waarde]);
    Hiermee wordt de hele inhoud van het veld opgehaald.
    Om een "like" filter te maken wil ik graag alleen het geselecteerde deel van de waarde in de dbgrid cell gebruiken zoals je dat bv. met de tekst uit een tedit kan doen via :
    Code:
    copy(edit.text, edit.selstart, edit.sellength
    .

    Hoe doe je zo iets met een cel in een dbgrid?
    Last edited by Willem; 23-Mar-18 at 20:19. Reason: cosmetisch

  2. #2
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    De cell van een grid is virtueel en alleen voor tonen van gegevens.
    Je moet naar de bron kijken en dat is je dataset. Het mooiste zal zijn is een static field aan te maken en met (uit mijn hoofd) event ongettext te spelen met de waarde van het veld. Zo'n veld kan je ook benaderen met TStringfield(fieldbyname('hallo').AsString).ongett ext := dogetgext
    Delphi is great. Lazarus is more powerfull

  3. #3
    Een dbgrid heeft een InplaceEditor component die gebruikt wordt tijdens het wijzigen van een veld. Als je dus alleen de geselecteerde tekst wilt hebben in zo'n edit dan zul je die tedit/InplaceEditor aan moeten spreken. Helaas is deze standaard verborgen en zul je die dus met een hack zichtbaar moeten maken.

    Bijvoorbeeld met
    Code:
    type 
    THackGrid = class(TDBGrid); 
    
    TEdit(THackGrid(DBGrid1).InplaceEditor).Selstart := 1;
    Mooier is het natuurlijk een descendant te maken met Grid.GetSelectedText.
    Voorbeeldje zie hier: http://www.delphipages.com/forum/sho...d.php?t=131406

  4. #4
    Senior Member
    Join Date
    Mar 2002
    Location
    Edam
    Posts
    426
    Misschien moet ik het inderdaad wat fundamenteler aanpakken maar voorlopig heb ik het even opgelost met een message in de onMouseleave event van het dbgrid

    Code:
    procedure TForm5.DBGrid1MouseLeave(Sender: TObject);
    begin
      SendMessage(winapi.Windows.GetFocus, EM_GETSEL,  longint(@StartPos), longint(@EindPos));
    end;
    De handle van de actieve dbgrid cel wordt opgehaald met winapi.Windows.GetFocus.
    Start- en Eindpositie van de selectie krijg je dan via SendMessage(hnd, EM_GETSEL, longint(@StartPos), longint(@EindPos)).

    Het lastige is dat de selectie verdwijnt (?) zodra het grid geen focus meer heeft. Bij een DBGrid.OnMouseleave heeft de cell nog focus en kunnen de selectiewaarden worden opgeslagen voor later gebruikt:

    Code:
     selectietekst:=copy(dbgrid.selectedfield.asstring,StartPos+1,StartPos-EindPos);

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •