2017-04-18 4 views
0

J'ai fait un testproject très simple dans Delphi 10.2 en utilisant FMX. La configuration est simple:FMX.TGrid comment permettre à l'utilisateur de déplacer des colonnes sans gâcher les données

  • TGrid qui est binded à un TClientDataSet (fait dans le concepteur).
  • bouton
  • qui permet à l'utilisateur d'ouvrir un fichier XML

Tout cela fonctionne très bien et le TGrid est peuplé de tous les enregistrements du fichier XML. Le fichier XML est créé par un autre TClientDataSet d'un projet plus ancien.

Maintenant pour le problème.
Lorsque je déplace une colonne vers un autre emplacement, toutes les données sont corrompues. Je fais ceci en maintenant juste la souris sur une colonne et en faisant glisser quelques colonnes vers la droite.
Au début, cela semble bien, mais lorsque vous commencez à défiler verticalement, il semble que les données ne sont plus dans les colonnes correctes.
J'ai le sentiment qu'il corrige seulement les données dans la partie visuelle de la grille, et dès que vous commencez à défiler les données ne sont plus dans les bonnes colonnes.

Est-ce un bug connu ou est-ce qu'il y a un problème avec mon projet?
Comme je l'ai déjà dit, il n'y a absolument aucun code dans ce projet tout est fait dans le concepteur. (Sauf pour le clientdataset1.LoadFromFile biensur)

+0

En ce qui concerne FMX, il est important d'indiquer correctement la version Delphi en raison des nombreux changements intervenus au cours des dernières années. Dans votre texte, vous parlez de * XE 10 *, qui n'existe pas. Dans les tags, vous avez sélectionné 'delphi-xe' qui n'avait pas FMX. Alors s'il vous plaît, éditez votre q et faites les corrections nécessaires. –

+0

@ TomBrunberg Je n'ai pas ce delphi ici, donc je ne peux pas vérifier maintenant quelle version. Mais c'était XE10 ce que j'ai vu en le démarrant. Donc je suis confus ici. – GuidoG

+0

@TomBrunberg J'ai appelé mon collègue avec ce delphi il semble être XE10.2 – GuidoG

Répondre

1

Ce qu'il fixe pour moi. Je viens de déplacer les champs qui ont été déplacés dans la grille aussi dans le ClientDataSet et jusqu'à présent, il semble fonctionner.

procedure TForm1.Grid1ColumnMoved(Column: TColumn; FromIndex, ToIndex: Integer); 
var 
    FieldFrom : string; 
    FieldTo : string; 
begin 
    FieldFrom := Grid1.ColumnByIndex(FromIndex).Header; 
    FieldTo := Grid1.ColumnByIndex(ToIndex).Header; 

    ClientDataSet1.FieldByName(FieldFrom).Index := FromIndex; 
    ClientDataSet1.FieldByName(FieldTo).Index := ToIndex; 
end; 

Mais je souhaite juste qu'il y avait une meilleure façon de savoir de la TColumn qui nomchamp est impliqué. Il semble que les informations les plus significatives manquent dans cette classe.

1

Vous pouvez remplir vos données manuellement (Grid: TGrid; CDS: TClientDataSet):

procedure TForm1.FormCreate(Sender: TObject); 
var 
    I: Integer; 
    Col: TColumn; 
begin 
    CDS.Active := True; 
    for I := 0 to CDS.FieldDefs.Count - 1 do begin 
    Col := TColumn.Create(Grid); 
    Grid.AddObject(Col); 
    Col.Header := CDS.FieldDefs[I].Name; 
    Col.Tag := I; 
    end; 
    Grid.RowCount := CDS.RecordCount; 
end; 

procedure TForm1.GridGetValue(Sender: TObject; const ACol, ARow: Integer; var Value: TValue); 
begin 
    CDS.First; 
    CDS.MoveBy(ARow); 
    Value := CDS.Fields[ACol].Text; 
end; 

Et après cela, vous pouvez utiliser ma solution pour les colonnes: stackoverflow.com/q/43418528/2292722

+0

Votre solution fonctionnera, mais j'ai trouvé un moyen de la réparer et continuer à utiliser la liaison, donc je vais m'en tenir à cela. Merci – GuidoG