la mise en Œuvre de FoxPro d'Éparpillement et de Recueillir Memvar en Delphi.
Développeur Delphi | février 2001 |
droit d'Auteur Pinnacle Publishing, Inc. Tous droits réservés.
la mise en Œuvre de FoxPro d'Éparpillement et de Recueillir Memvar en DelphiSteve Zimmelman
Technologie est toujours aller de l'avant, qui conduisent généralement à plus productif de développement. Cependant, il ya des moments quand à atteindre dans le passé peut être utile, aussi. La réplication ou la comparaison des données d'une table dans FoxPro était une tâche relativement simple. Steve Zimmelman soutient que peut-être cette technologie est intéressant de parvenir à revenir.
FoxPro de l'Éparpillement et de Recueillir les commandes ont toujours été utile pour la copie des enregistrements d'une table à l'autre, la comparaison des données, ou d'enregistrer la réplication entre plusieurs tables. Pour ceux d'entre vous qui n'ont pas eu le plaisir de travailler avec FoxPro, l'Éparpillement et de Recueillir des commandes de travailler comme ça.
Supposons que vous avez besoin de copier un enregistrement d'une table à l'autre. Vous feriez quelque chose comme:
Select Table1
Scatter Memvar
Sélectionnez Table2
de Recueillir Memvar
L'Éparpillement commande lit tous les champs de l'actuel
enregistrement et les place dans des variables de mémoire. Chaque variable
créé avec l'Éparpillement des a le même nom que le champ à partir de laquelle il
à l'origine. La commande collecte des mises à jour de l'enregistrement courant avec des variables de mémoire qui ont des noms qui correspondent aux champs. Donc, si Table1 a les champs Nom, l'Adresse et le Téléphone, et les variables Nom, l'Adresse et le Téléphone existe pas, lors de la réunion de la commande est exécutée, elle met à jour l'enregistrement avec la valeur stockée dans ces variables.
Il existe de nombreuses façons d'accomplir cela avec Delphi, mais il n'y a rien en natif fourni dans la VCL qui travaille à la TDataSet. Dans ma dernière tentative, j'ai eu un besoin pour les vieux de dispersion et de Recueillir des fonctionnalités. Donc, j'ai fini d'écrire mon propre ScatterMemvar et GatherMemvar méthodes.
la Création de l'Éparpillement et de Recueillir des fonctions
ces Deux méthodes sont des wrappers pour un objet appelé TMemvar. TMemvar maintient un tableau dynamique d'un enregistrement appelé TMemVarFields. Chaque élément de la MemVarFields tableau contient le nom du champ, le Type de données, et de la Valeur d'un champ correspondant à un ensemble de données. De sorte que chaque instance de TMemvar contient les données à partir d'un seul enregistrement de la table.
& nbsp & nbsp & nbsp Type
& ! & ! & ! & ! & ! & nbsp MemVarField = Paniers Enregistrement
& ! & ! & ! & ! & ! & nbsp FieldName : String
& ! & ! & ! & ! & ! & nbsp Valeur : Variant
& ! & ! & ! & ! & ! & nbsp DataType : TFieldType
& nbsp & nbsp & nbsp Fin
& nbsp & nbsp & nbsp TMemVarFields = Array De TMemVarField
Lorsque le ScatterMemvar fonction est appelée, elle crée une instance de TMemvar et retourne un pointeur vers cette instance. Lorsque TMemvar est créé, il charge les champs de la désignée jeu de données dans le tableau. Pour éviter DataSet duplication, chaque instance de TMemvar est identifié par sa propriété DataSet. Avant une nouvelle instance de TMemvar est créé, une recherche est effectuée pour une contrepartie de données dans toutes les instances existantes de TMemvar. Si l'on est trouvé, l'instance correspondante est réutilisé. Si non, une nouvelle instance est créée.
Fonction ScatterMemvar(DataSet:TDataSet) : TMemVar
Begin
& nbsp & nbsp & nbsp Si (DataSet = Nil) Then
& ! & ! & ! & ! & ! & nbsp Raise Exception.Create('DataSet Ne peut pas Être NUL')
& ! & ! & ! & ! & ! & nbsp // Réutilisation de l'objet, si elle existe déjà.
& ! & ! & ! & ! & ! & nbsp Résultat := FindMemvarObject(DataSet)
& ! & ! & ! & ! & ! & nbsp If (Result = Nil) Then Begin
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp Résultat := TMemvar.Créer(DataSet)
& ! & ! & ! & ! & ! & nbsp End Else Begin
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp Résultat.LoadFieldData
& ! & ! & ! & ! & ! & nbsp Fin
& nbsp & nbsp & nbsp Fin
Constructeur TMemVar.Créer(DataSet:TDataSet)
Begin
& nbsp & nbsp & nbsp FFlds := Nil
& nbsp & nbsp & nbsp FDataSet := DataSet
& nbsp & nbsp & nbsp Si (FDataSet = Nil) Then Begin
& ! & ! & ! & ! & ! & nbsp Raise Exception.Create('DataSet Ne peut pas Être NUL')
& nbsp & nbsp & nbsp Fin
& nbsp & nbsp & nbsp Si (FScatterList = Nil) Then
& ! & ! & ! & ! & ! & nbsp FScatterList := TList.Créer
& nbsp & nbsp & nbsp FScatterList.Ajouter ' (Auto -)
& nbsp & nbsp & nbsp LoadFieldData
Fin
Procédure TMemVar.LoadFieldData
Var
& nbsp & nbsp & nbsp i : Integer
Begin
& nbsp & nbsp & nbsp Si Pas de jeu de données.Actif, Puis Le Jeu De Données.Ouvert
& nbsp & nbsp & nbsp FFlds := Nil
& nbsp & nbsp & nbsp // définir la longueur du tableau d'enregistrements.
& nbsp & nbsp & nbsp SetLength(FFlds,FieldCount)
& nbsp & nbsp & nbsp For i := 0 to (DataSet.FieldCount-1) Do Begin
& ! & ! & ! & ! & ! & nbsp Avec un jeu de données.Champs[I] Do Begin
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp FFlds[i].FieldName := FieldName
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp FFlds[i].Valeur := Valeur
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp FFlds[i].DataType := Type de données
& ! & ! & ! & ! & ! & nbsp Fin
& nbsp & nbsp & nbsp Fin
Fin
Normalement, lorsque vous créez un objet, il est nécessaire de libérer l'objet lorsqu'il n'est plus nécessaire. Mais l'unité qui contient le code pour cet objet conserve sa propre liste interne de TMemvar les instances et les détruit automatiquement lorsque l'application se ferme. De sorte que vous pouvez libérer les objets quand ils ne sont pas nécessaires, ou de les ignorer et de laisser l'appareil prendre soin de lui-même.
Pour la gestion de la TMemvar les objets qui sont créés pour chaque ScatterMemvar l'utilisation, j'ai ajouter chaque nouvelle instance de TMemvar à FScatterList, un type de TList. L'unité qui gère l'ensemble de ce code contient l'Initialisation et la Finalisation des sections. L'Initialisation permet de s'assurer FScatterList est définie à zéro. Ceci est fait de sorte que la méthode de création de TMemvar peut interroger la valeur de FScatterList et de créer une instance uniquement lorsque c'est nécessaire. Cela permet de maintenir les ressources que l'unité doit être à un minimum. La Finalisation
la section de tours à travers la liste et libère toute TMemvar objets qu'il référence.
Procédure FreeScatterList
Var i : Integer
Begin
& nbsp & nbsp & nbsp Si (FScatterList = Nil) Then Exit
& nbsp & nbsp & nbsp Essayer
& ! & ! & ! & ! & ! & nbsp For i:=(FScatterList.Count-1) DownTo 0 Do Begin
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp Essayer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp TMemVar(FScatterList.Les éléments[i]).Gratuit
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp à l'Exception de
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp Fin
& ! & ! & ! & ! & ! & nbsp Fin
& nbsp & nbsp & nbsp Enfin
& ! & ! & ! & ! & ! & nbsp FScatterList.Gratuit
& ! & ! & ! & ! & ! & nbsp FScatterList := Nil
& nbsp & nbsp & nbsp Fin
Fin
Initialisation
& nbsp & nbsp & nbsp FScatterList := Nil
Finalisation
& nbsp & nbsp & nbsp FreeScatterList
afin D'éviter les possibilités d'accès des exceptions, TMemvar supprime lui-même de la FScatterList quand il est libéré. Vous remarquerez également que si tous les éléments ont été supprimés à partir de FScatterList, la liste est libéré. Encore une fois, c'est le fait de garder de l'utilisation des ressources vers le bas.
Destructeur TMemVar.Détruire
& nbsp & nbsp & nbsp Var i : Integer
Begin
& nbsp & nbsp & nbsp // Effacer les éléments d'un tableau.
& nbsp & nbsp & nbsp FFlds := Nil
& nbsp & nbsp & nbsp For i := 0 to (FScatterList.Count-1) Do Begin
& ! & ! & ! & ! & ! & nbsp Essayer
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp Si (TMemvar(FScatterList.Les éléments[i]).DataSet = FDataSet), Puis Commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp FScatterList.Supprimer(i)
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp Fin
& ! & ! & ! & ! & ! & nbsp à l'Exception de
& ! & ! & ! & ! & ! & nbsp Fin
& nbsp & nbsp & nbsp Fin
& nbsp & nbsp & nbsp Si (FScatterList.Count = 0) then Begin
& ! & ! & ! & ! & ! & nbsp FScatterList.Gratuit
& ! & ! & ! & ! & ! & nbsp FScatterList := Nil
& nbsp & nbsp & nbsp Fin
& nbsp & nbsp & nbsp Hérité
Fin
Après ScatterMemvar a été utilisé à la place d'un jeu de données en mémoire, TMemvar objet peut être consulté à partir de n'importe quelle unité dans l'application. Parce que chaque instance de TMemvar est stocké dans FScatterList, il peut être considéré comme un objet Global qui peut être consulté par n'importe quelle unité qui a une référence à la Memvar unité dans son Utilise l'instruction.
La méthode GatherMemvar est utilisé pour placer les données dans la même table à partir de laquelle il est originaire ou, si nécessaire, à une autre table. GatherMemvar tours à travers les champs stockés dans le TMemvar objet et les mises à jour de l'enregistrement cible avec des champs qui correspondent le nom de champ et le Type de données. De sorte que les champs dans la TMemvar objet n'avez pas à être l'exacte structurelles correspondent à la cible. Les champs qui ne correspondent pas, le nom de champ et le Type de données sont ignorées. En outre, TMemvar de valeurs de champ peut être modifié avant d'utiliser GatherMemvar, de sorte que vous pouvez répliquer légèrement différentes données en cas de besoin.
GatherMemvar est mis en œuvre en deux versions, à l'aide de la Surcharge de la directive dans la déclaration de la méthode:
Procédure GatherMemVar(Source:TMemVar Cible:TDataSet
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Options:TGatherOptions) Surcharge
Procédure GatherMemVar(Source,Cible:TDataSet
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Options:TGatherOptions) Surcharge
La seule différence entre ces deux méthodes est le premier paramètre. La première mise en œuvre utilise le réel TMemvar objet de référence. La seconde utilise le jeu de données utilisé pour créer l'instance de TMemvar. Autre que cela, ils sont tous les deux identiques. En fait, la première mise en œuvre appelle en fait la deuxième. Il y a aussi quelques options qui vous permettent de contrôler la façon dont le GatherMemvar méthode rassemble les données. Vous pouvez Remplacer ou d'Ajouter des données, de délivrer un message, ou de libérer l'objet une fois la réunion terminée. Si aucun
options sont présents dans le paramètre, la valeur par défaut est de Remplacer les
Cible du DataSet enregistrer et de le laisser dans l'état de modification après il modifie le champ de données.
TGatherOption = (goReplace, goAppend, goPost, goFree)
TGatherOptions = Ensemble De TGatherOption
Procédure GatherMemVar(Source:TMemVar Cible:TDataSet
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Options:TGatherOptions)
Begin
& nbsp & nbsp & nbsp If (Source = Nil) Then
& ! & ! & ! & ! & ! & nbsp Raise Exception.Créer (Source TMemVar Objet Ne peut pas Être NUL')
& nbsp & nbsp & nbsp GatherMemVar(Source.DataSet,Cible,Options)
Fin
Procédure GatherMemVar(Source,Cible:TDataSet Options:TGatherOptions)
Var
& nbsp & nbsp & nbsp i : Integer
& nbsp & nbsp & nbsp iIndex : Integer
& nbsp & nbsp & nbsp MemObj : TMemvar
& nbsp & nbsp & nbsp FR : TMemvarField
Begin
& nbsp & nbsp & nbsp MemObj := FindMemvarObject(Source)
& nbsp & nbsp & nbsp Si (MemObj = Nil) Then Begin
& ! & ! & ! & ! & ! & nbsp Raise Exception.Créer (Source des Données ('
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Source.Nom ') N'A Pas Été Dispersés!')
& nbsp & nbsp & nbsp Fin
& nbsp & nbsp & nbsp Si (goAppend Dans les Options), Puis Commencer
& ! & ! & ! & ! & ! & nbsp Cible.Ajouter
& nbsp & nbsp & nbsp End Else Begin
& ! & ! & ! & ! & ! & nbsp Si ce N' (la Cible.État [dsEdit,dsInsert])
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp Cible.Edit
& nbsp & nbsp & nbsp Fin
& nbsp & nbsp & nbsp For i := 0 À (Cible.FieldCount-1) Do Begin
& ! & ! & ! & ! & ! & nbsp iIndex := MemObj.FindFieldIndex(La Cible.Champs[i].FieldName)
& ! & ! & ! & ! & ! & nbsp Si iIndex >= 0 then Begin
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp if (Cible.Champs[i].DataType = MemObj.Champs[iIndex].Type de données)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Cible.Champs[i].Valeur := MemObj.Champs[iIndex].Valeur
& ! & ! & ! & ! & ! & nbsp Fin
& nbsp & nbsp & nbsp Fin
& nbsp & nbsp & nbsp Si (goPost Dans les Options), Puis
& ! & ! & ! & ! & ! & nbsp Cible.Post
& nbsp & nbsp & nbsp Si (goFree Dans les Options), Puis
& ! & ! & ! & ! & ! & nbsp MemObj.Gratuit
Fin
& nbsp
les nouvelles fonctions à utiliser
Voici quelques exemples de la façon dont ces méthodes peuvent être utilisées.
Procédure MyExample1 des copies des données de champ de la table Table1 et ajoute un enregistrement à la Table2 avec les données de la table Table1. Le paramètre options goPost et goFree instruire la méthode de délivrer un message à la Table2, puis libérer la TMemvar objet.
Procédure MyExample1
& nbsp & nbsp & nbsp Var
& ! & ! & ! & ! & ! & nbsp MemObj : TMemvar
Begin
& nbsp & nbsp & nbsp MemObj := ScatterMemvar(Table1)
& nbsp & nbsp & nbsp //
& nbsp & nbsp & nbsp // Ajouter un enregistrement à la Table2, le Poster,des
& nbsp & nbsp & nbsp // puis libérer la TMemvar objet.
& nbsp & nbsp & nbsp GatherMemvar(MemObj,Table2,[goAppend,goPost,goFree])
Fin
Procédure MyExample2 des copies des données de champ de la table Table1, ajoute un enregistrement à la Table2 avec les données de la table Table1, puis modifie le Nom de domaine avant d'ajouter un enregistrement à Tableau3. Dans les deux GatherMemvar cas, l'enregistrement est affiché. Le dernier libère également l'TMemvar objet.
Procédure MyExample2
& nbsp & nbsp & nbsp Var
& ! & ! & ! & ! & ! & nbsp MemObj : TMemvar
Begin
& nbsp & nbsp & nbsp MemObj := ScatterMemvar(Table1)
& nbsp & nbsp & nbsp //
& nbsp & nbsp & nbsp // Ajouter un enregistrement à la Table2 & Tableau3, Post,
& nbsp & nbsp & nbsp // puis libérer la TMemvar objet.
& nbsp & nbsp & nbsp GatherMemvar(Table1,Table2,[goAppend,goPost])
& nbsp & nbsp & nbsp // Modifier une memvar valeur de champ avant d'ajouter
& nbsp & nbsp & nbsp // un record de Tableau3.
& nbsp & nbsp & nbsp MemObj.FieldValue['Nom'] := 'Steve Zimmelman'
& nbsp & nbsp & nbsp GatherMemvar(Table1,Tableau3,[goAppend,goPost,goFree])
Fin
La mise en œuvre de foxpro d'eparpillement et de recueillir memvar en delphi
La mise en œuvre de foxpro d'eparpillement et de recueillir memvar en delphi : Plusieurs milliers de conseils pour vous faciliter la vie.
la mise en Œuvre de FoxPro d'Eparpillement et de Recueillir Memvar en Delphi.
Developpeur Delphi | fevrier 2001 |
droit d'Auteur Pinnacle Publishing, Inc. Tous droits reserves.
la mise en Œuvre de FoxPro d'Eparpillement et de Recueillir Memvar en DelphiSteve Zimmelman
Technologie est toujours aller de l'avant, qui conduisent generalement a plus productif de developpement. Cependant, il ya des moments quand a atteindre dans le passe peut etre utile, aussi. La replication ou la comparaison des donnees d'une table dans FoxPro etait une tache relativement simple. Steve Zimmelman soutient que peut-etre cette technologie est interessant de parvenir a revenir.
FoxPro de l'Eparpillement et de Recueillir les commandes ont toujours ete utile pour la copie des enregistrements d'une table a l'autre, la comparaison des donnees, ou d'enregistrer la replication entre plusieurs tables. Pour ceux d'entre vous qui n'ont pas eu le plaisir de travailler avec FoxPro, l'Eparpillement et de Recueillir des commandes de travailler comme ça.
Supposons que vous avez besoin de copier un enregistrement d'une table a l'autre. Vous feriez quelque chose comme:
Select Table1
Scatter Memvar
Selectionnez Table2
de Recueillir Memvar
L'Eparpillement commande lit tous les champs de l'actuel
enregistrement et les place dans des variables de memoire. Chaque variable
cree avec l'Eparpillement des a le meme nom que le champ a partir de laquelle il
a l'origine. La commande collecte des mises a jour de l'enregistrement courant avec des variables de memoire qui ont des noms qui correspondent aux champs. Donc, si Table1 a les champs Nom, l'Adresse et le Telephone, et les variables Nom, l'Adresse et le Telephone existe pas, lors de la reunion de la commande est executee, elle met a jour l'enregistrement avec la valeur stockee dans ces variables.
Il existe de nombreuses façons d'accomplir cela avec Delphi, mais il n'y a rien en natif fourni dans la VCL qui travaille a la TDataSet. Dans ma derniere tentative, j'ai eu un besoin pour les vieux de dispersion et de Recueillir des fonctionnalites. Donc, j'ai fini d'ecrire mon propre ScatterMemvar et GatherMemvar methodes.
la Creation de l'Eparpillement et de Recueillir des fonctions
ces Deux methodes sont des wrappers pour un objet appele TMemvar. TMemvar maintient un tableau dynamique d'un enregistrement appele TMemVarFields. Chaque element de la MemVarFields tableau contient le nom du champ, le Type de donnees, et de la Valeur d'un champ correspondant a un ensemble de donnees. De sorte que chaque instance de TMemvar contient les donnees a partir d'un seul enregistrement de la table.
& nbsp & nbsp & nbsp Type
& ! & ! & ! & ! & ! & nbsp MemVarField = Paniers Enregistrement
& ! & ! & ! & ! & ! & nbsp FieldName : String
& ! & ! & ! & ! & ! & nbsp Valeur : Variant
& ! & ! & ! & ! & ! & nbsp DataType : TFieldType
& nbsp & nbsp & nbsp Fin
& nbsp & nbsp & nbsp TMemVarFields = Array De TMemVarField
Lorsque le ScatterMemvar fonction est appelee, elle cree une instance de TMemvar et retourne un pointeur vers cette instance. Lorsque TMemvar est cree, il charge les champs de la designee jeu de donnees dans le tableau. Pour eviter DataSet duplication, chaque instance de TMemvar est identifie par sa propriete DataSet. Avant une nouvelle instance de TMemvar est cree, une recherche est effectuee pour une contrepartie de donnees dans toutes les instances existantes de TMemvar. Si l'on est trouve, l'instance correspondante est reutilise. Si non, une nouvelle instance est creee.
Fonction ScatterMemvar(DataSet:TDataSet) : TMemVar
Begin
& nbsp & nbsp & nbsp Si (DataSet = Nil) Then
& ! & ! & ! & ! & ! & nbsp Raise Exception.Create('DataSet Ne peut pas Etre NUL')
& ! & ! & ! & ! & ! & nbsp // Reutilisation de l'objet, si elle existe deja.
& ! & ! & ! & ! & ! & nbsp Resultat := FindMemvarObject(DataSet)
& ! & ! & ! & ! & ! & nbsp If (Result = Nil) Then Begin
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp Resultat := TMemvar.Creer(DataSet)
& ! & ! & ! & ! & ! & nbsp End Else Begin
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp Resultat.LoadFieldData
& ! & ! & ! & ! & ! & nbsp Fin
& nbsp & nbsp & nbsp Fin
Constructeur TMemVar.Creer(DataSet:TDataSet)
Begin
& nbsp & nbsp & nbsp FFlds := Nil
& nbsp & nbsp & nbsp FDataSet := DataSet
& nbsp & nbsp & nbsp Si (FDataSet = Nil) Then Begin
& ! & ! & ! & ! & ! & nbsp Raise Exception.Create('DataSet Ne peut pas Etre NUL')
& nbsp & nbsp & nbsp Fin
& nbsp & nbsp & nbsp Si (FScatterList = Nil) Then
& ! & ! & ! & ! & ! & nbsp FScatterList := TList.Creer
& nbsp & nbsp & nbsp FScatterList.Ajouter ' (Auto -)
& nbsp & nbsp & nbsp LoadFieldData
Fin
Procedure TMemVar.LoadFieldData
Var
& nbsp & nbsp & nbsp i : Integer
Begin
& nbsp & nbsp & nbsp Si Pas de jeu de donnees.Actif, Puis Le Jeu De Donnees.Ouvert
& nbsp & nbsp & nbsp FFlds := Nil
& nbsp & nbsp & nbsp // definir la longueur du tableau d'enregistrements.
& nbsp & nbsp & nbsp SetLength(FFlds,FieldCount)
& nbsp & nbsp & nbsp For i := 0 to (DataSet.FieldCount-1) Do Begin
& ! & ! & ! & ! & ! & nbsp Avec un jeu de donnees.Champs[I] Do Begin
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp FFlds[i].FieldName := FieldName
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp FFlds[i].Valeur := Valeur
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp FFlds[i].DataType := Type de donnees
& ! & ! & ! & ! & ! & nbsp Fin
& nbsp & nbsp & nbsp Fin
Fin
Normalement, lorsque vous creez un objet, il est necessaire de liberer l'objet lorsqu'il n'est plus necessaire. Mais l'unite qui contient le code pour cet objet conserve sa propre liste interne de TMemvar les instances et les detruit automatiquement lorsque l'application se ferme. De sorte que vous pouvez liberer les objets quand ils ne sont pas necessaires, ou de les ignorer et de laisser l'appareil prendre soin de lui-meme.
Pour la gestion de la TMemvar les objets qui sont crees pour chaque ScatterMemvar l'utilisation, j'ai ajouter chaque nouvelle instance de TMemvar a FScatterList, un type de TList. L'unite qui gere l'ensemble de ce code contient l'Initialisation et la Finalisation des sections. L'Initialisation permet de s'assurer FScatterList est definie a zero. Ceci est fait de sorte que la methode de creation de TMemvar peut interroger la valeur de FScatterList et de creer une instance uniquement lorsque c'est necessaire. Cela permet de maintenir les ressources que l'unite doit etre a un minimum. La Finalisation
la section de tours a travers la liste et libere toute TMemvar objets qu'il reference.
Procedure FreeScatterList
Var i : Integer
Begin
& nbsp & nbsp & nbsp Si (FScatterList = Nil) Then Exit
& nbsp & nbsp & nbsp Essayer
& ! & ! & ! & ! & ! & nbsp For i:=(FScatterList.Count-1) DownTo 0 Do Begin
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp Essayer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp TMemVar(FScatterList.Les elements[i]).Gratuit
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp a l'Exception de
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp Fin
& ! & ! & ! & ! & ! & nbsp Fin
& nbsp & nbsp & nbsp Enfin
& ! & ! & ! & ! & ! & nbsp FScatterList.Gratuit
& ! & ! & ! & ! & ! & nbsp FScatterList := Nil
& nbsp & nbsp & nbsp Fin
Fin
Initialisation
& nbsp & nbsp & nbsp FScatterList := Nil
Finalisation
& nbsp & nbsp & nbsp FreeScatterList
afin D'eviter les possibilites d'acces des exceptions, TMemvar supprime lui-meme de la FScatterList quand il est libere. Vous remarquerez egalement que si tous les elements ont ete supprimes a partir de FScatterList, la liste est libere. Encore une fois, c'est le fait de garder de l'utilisation des ressources vers le bas.
Destructeur TMemVar.Detruire
& nbsp & nbsp & nbsp Var i : Integer
Begin
& nbsp & nbsp & nbsp // Effacer les elements d'un tableau.
& nbsp & nbsp & nbsp FFlds := Nil
& nbsp & nbsp & nbsp For i := 0 to (FScatterList.Count-1) Do Begin
& ! & ! & ! & ! & ! & nbsp Essayer
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp Si (TMemvar(FScatterList.Les elements[i]).DataSet = FDataSet), Puis Commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp FScatterList.Supprimer(i)
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp Fin
& ! & ! & ! & ! & ! & nbsp a l'Exception de
& ! & ! & ! & ! & ! & nbsp Fin
& nbsp & nbsp & nbsp Fin
& nbsp & nbsp & nbsp Si (FScatterList.Count = 0) then Begin
& ! & ! & ! & ! & ! & nbsp FScatterList.Gratuit
& ! & ! & ! & ! & ! & nbsp FScatterList := Nil
& nbsp & nbsp & nbsp Fin
& nbsp & nbsp & nbsp Herite
Fin
Apres ScatterMemvar a ete utilise a la place d'un jeu de donnees en memoire, TMemvar objet peut etre consulte a partir de n'importe quelle unite dans l'application. Parce que chaque instance de TMemvar est stocke dans FScatterList, il peut etre considere comme un objet Global qui peut etre consulte par n'importe quelle unite qui a une reference a la Memvar unite dans son Utilise l'instruction.
La methode GatherMemvar est utilise pour placer les donnees dans la meme table a partir de laquelle il est originaire ou, si necessaire, a une autre table. GatherMemvar tours a travers les champs stockes dans le TMemvar objet et les mises a jour de l'enregistrement cible avec des champs qui correspondent le nom de champ et le Type de donnees. De sorte que les champs dans la TMemvar objet n'avez pas a etre l'exacte structurelles correspondent a la cible. Les champs qui ne correspondent pas, le nom de champ et le Type de donnees sont ignorees. En outre, TMemvar de valeurs de champ peut etre modifie avant d'utiliser GatherMemvar, de sorte que vous pouvez repliquer legerement differentes donnees en cas de besoin.
GatherMemvar est mis en œuvre en deux versions, a l'aide de la Surcharge de la directive dans la declaration de la methode:
Procedure GatherMemVar(Source:TMemVar Cible:TDataSet
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Options:TGatherOptions) Surcharge
Procedure GatherMemVar(Source,Cible:TDataSet
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Options:TGatherOptions) Surcharge
La seule difference entre ces deux methodes est le premier parametre. La premiere mise en œuvre utilise le reel TMemvar objet de reference. La seconde utilise le jeu de donnees utilise pour creer l'instance de TMemvar. Autre que cela, ils sont tous les deux identiques. En fait, la premiere mise en œuvre appelle en fait la deuxieme. Il y a aussi quelques options qui vous permettent de controler la façon dont le GatherMemvar methode rassemble les donnees. Vous pouvez Remplacer ou d'Ajouter des donnees, de delivrer un message, ou de liberer l'objet une fois la reunion terminee. Si aucun
options sont presents dans le parametre, la valeur par defaut est de Remplacer les
Cible du DataSet enregistrer et de le laisser dans l'etat de modification apres il modifie le champ de donnees.
TGatherOption = (goReplace, goAppend, goPost, goFree)
TGatherOptions = Ensemble De TGatherOption
Procedure GatherMemVar(Source:TMemVar Cible:TDataSet
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Options:TGatherOptions)
Begin
& nbsp & nbsp & nbsp If (Source = Nil) Then
& ! & ! & ! & ! & ! & nbsp Raise Exception.Creer (Source TMemVar Objet Ne peut pas Etre NUL')
& nbsp & nbsp & nbsp GatherMemVar(Source.DataSet,Cible,Options)
Fin
Procedure GatherMemVar(Source,Cible:TDataSet Options:TGatherOptions)
Var
& nbsp & nbsp & nbsp i : Integer
& nbsp & nbsp & nbsp iIndex : Integer
& nbsp & nbsp & nbsp MemObj : TMemvar
& nbsp & nbsp & nbsp FR : TMemvarField
Begin
& nbsp & nbsp & nbsp MemObj := FindMemvarObject(Source)
& nbsp & nbsp & nbsp Si (MemObj = Nil) Then Begin
& ! & ! & ! & ! & ! & nbsp Raise Exception.Creer (Source des Donnees ('
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Source.Nom ') N'A Pas Ete Disperses!')
& nbsp & nbsp & nbsp Fin
& nbsp & nbsp & nbsp Si (goAppend Dans les Options), Puis Commencer
& ! & ! & ! & ! & ! & nbsp Cible.Ajouter
& nbsp & nbsp & nbsp End Else Begin
& ! & ! & ! & ! & ! & nbsp Si ce N' (la Cible.Etat [dsEdit,dsInsert])
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp Cible.Edit
& nbsp & nbsp & nbsp Fin
& nbsp & nbsp & nbsp For i := 0 A (Cible.FieldCount-1) Do Begin
& ! & ! & ! & ! & ! & nbsp iIndex := MemObj.FindFieldIndex(La Cible.Champs[i].FieldName)
& ! & ! & ! & ! & ! & nbsp Si iIndex >= 0 then Begin
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp if (Cible.Champs[i].DataType = MemObj.Champs[iIndex].Type de donnees)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Cible.Champs[i].Valeur := MemObj.Champs[iIndex].Valeur
& ! & ! & ! & ! & ! & nbsp Fin
& nbsp & nbsp & nbsp Fin
& nbsp & nbsp & nbsp Si (goPost Dans les Options), Puis
& ! & ! & ! & ! & ! & nbsp Cible.Post
& nbsp & nbsp & nbsp Si (goFree Dans les Options), Puis
& ! & ! & ! & ! & ! & nbsp MemObj.Gratuit
Fin
& nbsp
les nouvelles fonctions a utiliser
Voici quelques exemples de la façon dont ces methodes peuvent etre utilisees.
Procedure MyExample1 des copies des donnees de champ de la table Table1 et ajoute un enregistrement a la Table2 avec les donnees de la table Table1. Le parametre options goPost et goFree instruire la methode de delivrer un message a la Table2, puis liberer la TMemvar objet.
Procedure MyExample1
& nbsp & nbsp & nbsp Var
& ! & ! & ! & ! & ! & nbsp MemObj : TMemvar
Begin
& nbsp & nbsp & nbsp MemObj := ScatterMemvar(Table1)
& nbsp & nbsp & nbsp //
& nbsp & nbsp & nbsp // Ajouter un enregistrement a la Table2, le Poster,des
& nbsp & nbsp & nbsp // puis liberer la TMemvar objet.
& nbsp & nbsp & nbsp GatherMemvar(MemObj,Table2,[goAppend,goPost,goFree])
Fin
Procedure MyExample2 des copies des donnees de champ de la table Table1, ajoute un enregistrement a la Table2 avec les donnees de la table Table1, puis modifie le Nom de domaine avant d'ajouter un enregistrement a Tableau3. Dans les deux GatherMemvar cas, l'enregistrement est affiche. Le dernier libere egalement l'TMemvar objet.
Procedure MyExample2
& nbsp & nbsp & nbsp Var
& ! & ! & ! & ! & ! & nbsp MemObj : TMemvar
Begin
& nbsp & nbsp & nbsp MemObj := ScatterMemvar(Table1)
& nbsp & nbsp & nbsp //
& nbsp & nbsp & nbsp // Ajouter un enregistrement a la Table2 & Tableau3, Post,
& nbsp & nbsp & nbsp // puis liberer la TMemvar objet.
& nbsp & nbsp & nbsp GatherMemvar(Table1,Table2,[goAppend,goPost])
& nbsp & nbsp & nbsp // Modifier une memvar valeur de champ avant d'ajouter
& nbsp & nbsp & nbsp // un record de Tableau3.
& nbsp & nbsp & nbsp MemObj.FieldValue['Nom'] := 'Steve Zimmelman'
& nbsp & nbsp & nbsp GatherMemvar(Table1,Tableau3,[goAppend,goPost,goFree])
Fin
La mise en œuvre de foxpro d'éparpillement et de recueillir memvar en delphi
By commentfaire
La mise en œuvre de foxpro d'éparpillement et de recueillir memvar en delphi : Plusieurs milliers de conseils pour vous faciliter la vie.
commentfaire
www.commentfaire.net
PARIS
6 Place de la Madeleine
FR-75
75012
Île-de-France
+33.01.23.45.67.89