2016-10-05 8 views
0

Je suis en utilisant le code suivant ajouté à mon DBGrid - événement OnCellClickDBGrid - OnCellClick & OnDblClick, renvoient une forme/TBMemo contenant la valeur cellules/colonne/s

procedure TForm2.DBGrid1CellClick(Column: TColumn); 
begin 
if dbmodule.comenziDataSet.Active then 
    begin 
    if not Assigned(dbgridCelulaForm) then 
    begin 
     dbgridCelulaForm := TdbgridCelulaForm.Create(Self); 
     dbgridCelulaForm.DBMemoCelula.DataSource := dbmodule.comenziSource; 
    end; 

    dbgridCelulaForm.Visible := False; 
    dbgridCelulaForm.Visible := True; 
    dbgridCelulaForm.DBMemoCelula.DataField := Column.FieldName; 
    dbgridCelulaForm.Caption := Format('%s/randul: %d',[Column.FieldName, DBGrid1.DataSource.DataSet.RecNo]); 
    end; 
end; 

de dbgridCelulaForm = nom du formulaire contenant le TDBMemo DBMemoCelula = nom du TDBMemo dbmodule.comenziDataSet = comenziDataSet est le nom de la DataSet et dbmodule est le nom d'un data module (unité, comme formes) - le DataSet est sur la data module, de sorte que, dbmodule.comenziDataSet dbmodule. comenziSource = Identique ensemble de données, une source de données sur un module de données, la source est nommé comenziSource

Ok, donc ce que fait ce code:

Une fois que je clique sur une cellule sur mon DBGrid il apparaît un form (nommé dbgridCelulaForm) qui contient un TBMemo (nommé DBMemoCelula) et il me montre les informations contenues dans cette cellule (comme, un nom de client par exemple, ou quelle que soit la cellule tient, dans ma db)

Cela est bien, mon problème est que je ne peut pas sélectionner des lignes maintenant DBGrid, bien, je peux mais une fois que je fais la 1ère place, je clique (une cellule, tout) sur la ligne particulière que je veux sélectionner avec ma souris, puis la cellule s'active et le form apparaît.

Est-il possible d'utiliser ce code dans l'événement DBGrid - OnDblClick au lieu du OnCellClick? Signification une fois que je double-cliquez sur une ligne/cellule le form devrait apparaître et me montrer l'information, mais double-cliquez sur - pas un seul clic.

De cette façon, je peux toujours sélectionner la ligne et toujours afficher les informations dans la cellule si nécessaire.

Ou tout autre moyen/lieu d'utiliser/recevoir cette fonctionnalité. Des pensées?

Je peux poster une vidéo rapide de tout si mon explication est ambiguë et que vous pensez que cela aiderait, dites-moi simplement dans le commentaire/réponse.

En outre, j'utilise les composants RAD Studio 10 Seattle et dbexpress pour la base de données - si cela peut vous aider.

Merci!

+0

Pas d'ambiguïté du tout ... La façon dont je mis en œuvre des fonctionnalités similaires est par le bouton d'édition des colonnes de la grille - déclenche un événement OnEditButtonClick sur la grille. Définissez le style du bouton sur cbsEllipsis afin qu'il soit évident qu'une boîte de dialogue s'affiche lorsque vous cliquez dessus. Peut également être déclenché avec Alt + Bas. –

+0

Bonjour, merci pour votre réponse. J'utilise déjà OnEditButtonClick pour quelque chose d'autre, donc je ne peux pas l'utiliser. La réponse de Martyn aide, même pour votre commentaire SelectedField, merci! – Petzy

Répondre

1

Le code suivant montre comment accéder aux coordonnées de colonne et de ligne d'une cellule dbl-cliquée d'un TDBGrid et à la valeur de chaîne du contenu de la cellule. Tel qu'écrit, il affiche le contenu de la colonne Column and Row number + string sur la légende du formulaire. À vous de voir ce que vous faites réellement avec ces valeurs.

Cela fonctionne parce que le curseur de jeu de données sur l'ensemble de données connecté au DBGrid est déplacé vers la ligne de l'ensemble de données correspondant à la cellule où se trouve le pointeur de la souris.

type 
TMyDBGrid = class(TDBGrid); 

procedure TForm1.DBGrid1DblClick(Sender: TObject); 
var 
    ARow, 
    ACol : Integer; 
    Pt : TPoint; 
    CellValue : String; 
begin 
    // First, get the mouse pointer coordinates 
    Pt.X := Mouse.CursorPos.X; 
    Pt.Y := Mouse.CursorPos.Y; 
    // Translate them into the coordinate system of the DBGrid 
    Pt := DBGrid1.ScreenToClient(Pt); 

    // Use TDBGrids inbuilt functionality to identify the Column and 
    // row number. 
    ACol := DBGrid1.MouseCoord(Pt.X, Pt.Y).X -1; 
    ARow := DBGrid1.MouseCoord(Pt.X, Pt.Y).Y; 
    CellValue := DBGrid1.Columns[ACol].Field.AsString; 

    Caption := Format('Col:%d Row:%d Cell Value:%s', [ACol, ARow, CellValue]); 
end; 

Notez que je l'ai utilisé la propriété Légende du formulaire pour afficher les informations de cellule de la grille comme un moyen rapide n sale de montrer quelque part les informations. Bien sûr, vous pouvez également l'afficher sur une autre zone du formulaire ou sur un formulaire différent. Le code ci-dessus fonctionnera également bien dans l'événement OnCellClick de la grille, btw.Comme noté dans un commentaire, vous pouvez utiliser la propriété SelectedField de la grille au lieu de ce qui précède, mais personnellement, je pense que ce qui précède est plus instructif sur la façon de travailler avec DBGrid, car il montre comment obtenir la colonne et la ligne de la cellule coordonnées. Consultez les propriétés SelectedField, SelectedIndex et SelectedRows de DBGrid dans l'aide en ligne pour plus d'informations sur les propriétés utiles du TDBGrid.

Mise à jour Vous avez demandé dans un commentaire un exemple d'affichage des informations sur un autre formulaire. Supposons que ce formulaire s'appelle OtherForm, se trouve dans une unité OtherFormu.Pas et est créé avant que le DBGrid1DblClick ne soit appelé. Vous devez utiliser cette unité dans la liste d'utilisation de l'unité qui contient le DBGrid. Supposons que cette autre forme contienne un contrôle TMemo appelé Memo1. Ensuite, vous pouvez écrire votre DBGrid1DblClick hanndler comme ceci:

procedure TForm1.DBGrid1DblClick(Sender: TObject); 
[as above] 
begin 
    [ as above ] 
    CellValue := DBGrid1.Columns[ACol].Field.AsString; 

    OtherForm.Memo1.Lines.Add(Format('Col:%d Row:%d Cell Value:%s', [ACol, ARow, CellValue])); 
end; 
+1

Vous n'avez pas besoin de tous ces codes de localisation de cellule, vous pouvez utiliser le SelectedField de la grille. –

+0

@SertacAkyuz: Alors? Il illustre comment le faire à partir de zéro, ce qui est utile de savoir, imo, et des conseils sur la façon de le faire lorsque la cellule d'intérêt n'est pas actuellement sélectionnée. – MartynA

+1

* "So?" * - Parce que le code n'est pas vraiment nécessaire. Semble être une raison valable de me commenter. –