Je rencontre des problèmes pour modifier la taille de fielddefs dans un TClientDataSet après avoir utilisé LoadFromFile. Est-ce que quelqu'un a un bon moyen de changer la taille d'un ClientDataSet donné mais conserve tout le reste.Comment faire pour modifier la taille de la taille fielddef dans un TClientDataSet après LoadFromFile
Répondre
Vous pouvez créer un nouveau jeu de données en utilisant l'ancien FieldDefs de l'ensemble de données. Le point clé est TFieldDefs.Assign
. Voici un petit exemple:
// insert test data
procedure TForm1.InsertRecord(DataSet: TDataSet; ID: Integer; const Name: string);
begin
DataSet.Insert;
try
DataSet.Fields[0].AsInteger := ID;
DataSet.Fields[1].AsString := Name;
DataSet.Post;
except
DataSet.Cancel;
raise;
end;
end;
// create the original dataset
procedure TForm1.Button1Click(Sender: TObject);
var
DataSet: TClientDataSet;
begin
DataSet := TClientDataSet.Create(nil);
try
DataSet.FieldDefs.Add('ID', ftInteger);
DataSet.FieldDefs.Add('NAME', ftString, 20);
DataSet.CreateDataSet;
DataSet.LogChanges := False;
InsertRecord(DataSet, 1, 'Hello');
InsertRecord(DataSet, 2, 'World!');
DataSet.SaveToFile(ExtractFilePath(Application.ExeName) + 'old.xml', dfXML);
finally
DataSet.Free;
end;
end;
// create the new dataset
procedure TForm1.Button2Click(Sender: TObject);
var
OldDataSet, NewDataSet: TClientDataSet;
begin
OldDataSet := nil;
NewDataSet := nil;
try
OldDataSet := TClientDataSet.Create(nil);
OldDataSet.LoadFromFile(ExtractFilePath(Application.ExeName) + 'old.xml');
NewDataSet := TClientDataSet.Create(nil);
NewDataSet.FieldDefs.Assign(OldDataSet.FieldDefs);
NewDataSet.FieldDefs[1].Size := 30;
NewDataSet.CreateDataSet;
NewDataSet.LogChanges := False;
OldDataSet.First;
while not OldDataSet.EOF do
begin
InsertRecord(NewDataSet, OldDataSet.Fields[0].AsInteger, OldDataSet.Fields[1].AsString);
OldDataSet.Next;
end;
NewDataSet.SaveToFile(ExtractFilePath(Application.ExeName) + 'new.xml', dfXML);
finally
OldDataSet.Free;
NewDataSet.Free;
end;
end;
Merci TOndrej. Un peu plus tôt, je l'ai résolu de la même manière. Un CDS «pre» ouvrira un fichier xml. Ensuite, une procédure copiera le fielddefs (méthode assign) à partir du CDS de destination pré-CDS->. Ensuite, les fielddefs sont vérifiés pour les noms de champs qui pourraient avoir la mauvaise taille lorsque cela est corrigé. Après cela, les valeurs du pré-CDS sont copiées dans le CDS de destination. Dans ce processus de copie, les événements sont définis sur zéro et de nouveau à la fin. La même chose avec les champs en lecture seule. Le CDS de destination enregistre dans le fichier XML. En vérifiant ce fichier, cette procédure semble fonctionner correctement. – xsintill
La façon dont le TDataSet est implémenté, il existe des méthodes virtuelles pour allouer et libérer le tampon d'enregistrement et pour obtenir et définir des valeurs à partir de ce tampon. La plupart des descendants de jeux de données conservent un bloc de mémoire contiguë pour le tampon, donc si vos trois champs ont quatre, six et vingt octets, le champ 1 commencera à la position 0, le champ 2 à la position quatre et le champ 3 à la position dix.
Si vous souhaitez modifier la taille d'un champ alors que l'ensemble de données est ouvert, tous ces tampons doivent être redimensionnés et ajustés, sinon vous rencontrerez des problèmes. Il n'y a pas de méthode virtuelle pour redimensionner le tampon, donc je dirais que ce n'est probablement pas faisable.
La façon de procéder est de copier votre contenu du CDS original vers un nouveau avec différentes tailles de champs. Affectez-lui la valeur par valeur ou utilisez un TDataSetProvider. Si vous utilisez le fournisseur (meilleure approche) et que vous ne connaissez pas la définition exacte, vous devez toujours parcourir les champs de l'ensemble de données source et les ajouter à la destination avec la taille correcte.
- 1. Modifier la taille de la vue MPMoviePlayerController
- 2. wpf: modifier la taille de police pour le contrôle WebBrowser
- 3. Comment faire un zoom UIScrollView à la taille de UIImage?
- 4. Comment faire des options pour la fenêtre popup .. taille e
- 5. Comment faire pour suivre la taille des messages WCF?
- 6. Modifier uniquement la taille de police dans SWT
- 7. Comment faire pour étendre Jpanel à la taille du JFrame?
- 8. Comment faire deux éléments dans gtk ont la même taille?
- 9. Comment modifier dynamiquement la taille de la police de texte dans UITextView dans l'iPhone
- 10. Maintenir la même hauteur sur Modifier la taille (jQuery)
- 11. Modifier la taille de l'image avec du code JavaScript
- 12. Limiter la taille UITextField
- 13. Comment définir la taille de l'onglet dans un JEditorPane?
- 14. Modifier la taille du contrôle de l'image en javascript
- 15. Modifier la taille de police d'un ColumnHeader d'un GridView
- 16. Comment modifier la taille des contrôles enfants dans un contrôle composite dans Winforms?
- 17. Comment trouver la taille de la mémoire virtuelle et la taille du cache d'un système Linux?
- 18. comparaison de la taille du code et de la taille de la source
- 19. la taille de la fenêtre maximisée
- 20. Comment obtenir la plage de taille pour les polices
- 21. La taille du fichier de jQuery
- 22. curl: Comment limiter la taille de GET?
- 23. Comment spécifier la taille CDialogBar dans un projet MFC/MDI?
- 24. Outils pour réduire la taille HTML générée
- 25. Augmenter la taille de la police dans la légende d'octave?
- 26. Estimation de la taille nécessaire pour le texte dans MySQL
- 27. Comment déterminer la taille d'une liste SharePoint?
- 28. Comment modifier la taille du texte et la largeur des composants d'un UIPickerView?
- 29. CSS ajuster la taille de la table
- 30. Utilisation de la taille relative plutôt que de la taille fixe dans CSS
Pouvez-vous être un peu plus précis quant à ce que vous essayez de faire? –