Tdbgrid mousedown

di il
14 risposte

Tdbgrid mousedown

Domanda stupida ma… a me non funziona ^_^

effettivamente non funziona l evento mousedown su una dbgrid?

o meglio, sembra funzionare solo se il click viene fatto in una zona vuota e non sui record.

14 Risposte

  • Re: Tdbgrid mousedown

    05/04/2023 - ziobacco ha scritto:


    effettivamente non funziona l evento mousedown su una dbgrid?

    o meglio, sembra funzionare solo se il click viene fatto in una zona vuota e non sui record.

    Non saprei… riesci a riportare il codice di esempio che hai scritto?

  • Re: Tdbgrid mousedown

    Ciao Aika, beh in verità non è che ci sia molto codice da scrivere,

    semplicemente se piazzi un tdbgrid su una form, la colleghi ad una dataset che punta ad ua query e apri il dataset ti visualizza le righe.

    il problema che non ci entra proprio li dentro, se metti un breakpoint  li vedi che non ci passa proprio, a meno che come detto prima, non clicchi in una zoa vuota della griglia, dove non ci sono record.

    banalmente il codice potrebbe essere semplicemnte 

    procedure TForm4.DBGrid1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
    var
    s:string;
    begin
    	s:= DBGrid1.DataSource.DataSet.FieldByName('DESCRDEF').AsString;
    end;
    		
  • Re: Tdbgrid mousedown

    05/04/2023 - ziobacco ha scritto:


    il problema che non ci entra proprio li dentro, se metti un breakpoint  li vedi che non ci passa proprio, a meno che come detto prima, non clicchi in una zoa vuota della griglia, dove non ci sono record.

    Osservando il codice sorgente della VCL, il problema (se così si può dire) risiede nel fatto che quando il mouse viene cliccato, Delphi controlla se il puntatore del mouse si trova nelle coordinate di una cella: in caso affermativo, gestisce la selezione relativa e quindi il messaggio non viene successivamente propagato agli altri eventi.

    Per ottenerlo, si dovrebbe creare un discendente della griglia e alterare questo tipo di gestione ridefinendo i metodi chiave.

  • Re: Tdbgrid mousedown

    Ho cominciato a scrivere s:=dbgrid1. Che già mi segnala l'errore…

    Forse se spieghi cosa dovrebbe succedere alla pressione del pulsante del mouse sopra la griglia possiamo darti un suggerimento.

  • Re: Tdbgrid mousedown

    06/04/2023 - sihsandrea ha scritto:


    Ho cominciato a scrivere s:=dbgrid1. Che già mi segnala l'errore…

    Per forza: l'istruzione ha senso una volta che è stata scritta completamente, non a metà…

  • Re: Tdbgrid mousedown

    07/04/2023 - Alka ha scritto:


    06/04/2023 - sihsandrea ha scritto:


    Ho cominciato a scrivere s:=dbgrid1. Che già mi segnala l'errore…

    Per forza: l'istruzione ha senso una volta che è stata scritta completamente, non a metà…

    A te funziona questa istruzione?   e cosa fa?

    Ovvio che l'ho scritta per intero ma continua a dare errore e non compila.

    Magari spere cosa dovrebbe succedere alla pressione del pulsante del mouse su una dbgrid…

  • Re: Tdbgrid mousedown

    07/04/2023 - sihsandrea ha scritto:


    A te funziona questa istruzione?   e cosa fa?

    L'istruzione (ovviamente scritta per intero) sarebbe questa qui:

    s := DBGrid1.DataSource.DataSet.FieldByName('DESCRDEF').AsString;

    Quello che fa è andare su una DBGrid che si chiama DBGrid1, accedere al componente DataSource e poi al DataSet assegnato a quest'ultimo, e infine recuperare sottoforma di stringa il valore del campo “DESCRDEF”.

    Ovvio che, se non hai la griglia, otterrai senz'altro un errore di compilazione perché il componente “DBGrid1” non esiste, ma il problema non è nel codice in sé, bensì nella mancanza della griglia.

  • Re: Tdbgrid mousedown

    A) Pensavo Fosse palese che:

    1) ho la dbgrid

    2) ho il dataset

    3) ho il datasource

    4) il fieldbyname è quello esistente

    Pensavo che magari servisse la dichiarazione di qualche unit in uses…

    B) la domanda non era riferita al comando ma a ciò che vuole ottenere ziobacco dal metodo mousedown per non usare in alternativa

    CustomerTable.FieldByName('Customer').AsString
  • Re: Tdbgrid mousedown

    07/04/2023 - sihsandrea ha scritto:


    A) Pensavo Fosse palese che […]

    Non saprei… hai detto che avevi un errore (senza dire quale), per cui senz'altro un ingrediente mancava, altrimenti errori in compilazione non ce ne sono.

    07/04/2023 - sihsandrea ha scritto:


    B) la domanda non era riferita al comando ma a ciò che vuole ottenere ziobacco dal metodo mousedown per non usare in alternativa

    Tu hai parlato di errore di compilazione.

    Detto questo, credo che si tratti solo di codice di esempio scritto nell'evento per vedere in qualche modo l'esito dell'esecuzione dell'evento, che però non ha luogo (per i motivi già indicati).

    Per il resto, l'accesso a una tabella si può fare in tanti modi, sia come hai indicato tu, sia come ha scritto l'autore della discussione.

    Se si giunge al medesimo componente, un metodo vale l'altro.

    Ciao! :)

  • Re: Tdbgrid mousedown

    07/04/2023 - sihsandrea ha scritto:


    B) la domanda non era riferita al comando ma a ciò che vuole ottenere ziobacco dal metodo mousedown per non usare in alternativa

    la questione non era il codice, ma lo scatenarsi dell ebento onmousedown su una tdbgrid,

    piuttosto che  l assegnazione della variabile allora fai uno showmessage del valore del record su cui esegui il mousedown, ci si aspetterebbe di vedere a vidio u messaggio, vedrai che non succede nulla,come se l evento onmousedown non fosse generato e, di fatto , è cosi' :) tutto qui, non era una questione di codice, ma piuttosto di funzionalità della tdbgrid :), perlomeno quella standard.

  • Re: Tdbgrid mousedown

    Mousedown non da alcuna informazione sul record dove si trova il puntatore…

    Ti dice che stai pigiando il tasto del mouse dentro un oggetto.

    Il comando che scrivi deve attribuire alla variabile s il valore del campo ma del record selezionato.

    Se vuoi attribuire il valore del campo in corrispondenza del record dove si trova il puntatore devi scrivere qualcosa in più. Paradossalmente puoi avere selezionata la riga 4 col puntatore sulla riga 4 (che fortuna) ma anche avere selezionata la riga 1 e il puntatore sulla riga 4 (riga della dbgrid).

    L'evento è riferito all'oggetto non al suo contenuto.

    Posso anche mettere un pannello e al mousedown passare al record successivo ogni 3-4 secondi finché non rilascio il pulsante L'evento riguarda l'oggetto, quello che fa il metodo lo inserisci tu.

    La mia domanda dunque è: cosa vuoi che succeda alla pressione del pulsante del mouse? Potresti gestire sia il pulsante dx che il sx che quello centrale… mouse down non significa niente per come lo gestisci tu. Ha lo stesso valore se lo inserisci su onenter, onmousemove ecc…

  • Re: Tdbgrid mousedown

    Ho capito, ma resta il fatto che l evento mousedown su di un record pieno della tdbgrid non si scatena.

    Nello specifico quello che volevo fare io è un drag and drop da una tdbgrid a una stringlist dei dati del record della tdbgrid.

    quello che avevo pensato io era quindi:

    al mousedown sulla tdbgrid mi memorizzo i dati del record corrente;

    e inizia il drag

    sull evento dragdrop della stringlist aggiungo i dati che mi ero memorizzato, ma appunto non “entrando” nel metodo mouse down dell dbrid non posso fare cosi.

    se c'e' un altro modo per fre drag and drop…

    grazie ancora 

    p.s. posto il codice:

     evento onmousedown della tdbgrid

       myRecColor:=TRecColor.create;
       myRecColor.ID:=DBGridInks.DataSource.DataSet.FieldByName('ID').AsInteger;
       myRecColor.Descrizione:=DBGridInks.DataSource.DataSet.FieldByName('DESCRDEF').AsString;
       myRecColor.rgb:=DBGridInks.DataSource.DataSet.FieldByName('RGBCODE').AsString;
       myRecColor.Colore:=DBGridInks.DataSource.DataSet.FieldByName('RGBCODE').AsInteger;
       myRecColor.Col:=DBGridInks.DataSource.DataSet.FieldByName('POSCOL').AsInteger;
       myRecColor.Row:=DBGridInks.DataSource.DataSet.FieldByName('POSROW').AsInteger;
       DBGridInks.BeginDrag(True);

    evento  dragdrop della tstringlist:

    var
      r,c:integer ;
      inkSource,inkDest:TRecColor;
     if Source = DBGridInks then
     begin
       with SgridInkPos do
       begin
          MouseToCell( x, y, c, r );
          inkDest :=  TRecColor( Objects[c, r]);
          //  if not(Assigned(inkDest) )then
          begin
             inkSource := myRecColor;
             if InkExistIngrid(inkSource) then
             begin
                ShowModalMessage('THIS COLOR IS PRESENT IN POSITION: '+#13#10+'ROW='+IntToStr(inkSource.Row)+#13#10+'COLUMN='+inttostr(inkSource.Col),'COPY IP',eTM_warning,5000,True,False);
                Exit;
             end;
            inkSource.Row := r+1;
            inkSource.Col := c+1;
            objects[c,r]  := inkSource;
            cells[c,r]    := inkSource.Descrizione ;
            inkDest:= inkSource;
          end;
       end;
  • Re: Tdbgrid mousedown

    13/04/2023 - ziobacco ha scritto:


    resta il fatto che l evento mousedown su di un record pieno della tdbgrid non si scatena.

    Esattamente.

    13/04/2023 - ziobacco ha scritto:


    al mousedown sulla tdbgrid mi memorizzo i dati del record corrente;

    e inizia il drag

    sull evento dragdrop della stringlist aggiungo i dati che mi ero memorizzato, ma appunto non “entrando” nel metodo mouse down dell dbrid non posso fare cosi.

    Se desideri implementare una funzionalità di drag & drop, puoi ereditare il controllo TDBGrid e ridefinire il metodo MouseDown: vedi questo esempio di codice.

    Per informazioni generali sul meccanismo in sé, in questo articolo trovi una panoramica abbastanza dettagliata.

    Ciao! :)

  • Re: Tdbgrid mousedown

    Senza codice il dragdrop dovrebbe essere considerato all'oggetto (spostare la griglia da a a b). Hai un punto di partenza x,y e un punto di arrivo x1, y1.

    Cosa prendere da a e mettere in b dipende dal codice su onmousedown e onmouseup (trascina la dbgrid o la riga del record o un campo) il programma non lo sa. Sei tu che da codice decidi cosa fare (pulsante dx sposta la tabella, pulsante sx sposta il record e pulsante centrale sposta il campo per esempio)

    Non so se questo ti può aiutare:

    https://it.comp.lang.delphi.narkive.com/17vLND4T/drag-n-drop-da-una-dbgrid

    Fa riferimento a Marco Cantù.

    Solo scopo didattico suppongo perché per spostare un record non serve il dragndrop sai il record selezionato e copi il record dove meglio credi, ma se, come me, vuoi l'effetto visivo del dragndrop il link ti può aiutare.

    Buona lettura.

Devi accedere o registrarti per scrivere nel forum
14 risposte