//+------------------------------------------------------------------+
//| MyTreeNode.mq5 |
//| Copyright 2010, MetaQuotes Software Corp. |
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
//---
#include <Arrays\TreeNode.mqh>
//+------------------------------------------------------------------+
//| Décrit la classe dérivée de CTreeNode. |
//+------------------------------------------------------------------+
//| Class CMyTreeNode. |
//| But : Classe d'un élément d'un arbre binaire. |
//| Descendant de la classe CTreeNode. |
//+------------------------------------------------------------------+
class CMyTreeNode : public CTreeNode
{
protected:
//--- données utlisateur
long m_long; // champ clé de type long
double m_double; // variable personnelle de type double
string m_string; // variable personnelle de type string
datetime m_datetime; // variable personnelle de type datetime
public:
CMyTreeNode();
//--- méthodes d'accès aux données utilisateur
long GetLong(void) { return(m_long); }
void SetLong(long value) { m_long=value; }
double GetDouble(void) { return(m_double); }
void SetDouble(double value) { m_double=value; }
string GetString(void) { return(m_string); }
void SetString(string value) { m_string=value; }
datetime GetDateTime(void) { return(m_datetime); }
void SetDateTime(datetime value) { m_datetime=value; }
//--- méthodes de travail avec les fichiers
virtual bool Save(int file_handle);
virtual bool Load(int file_handle);
protected:
virtual int Compare(const CObject *node,int mode);
//--- méthodes de création des instances de classe
virtual CTreeNode* CreateSample();
};
//+------------------------------------------------------------------+
//| Constructeur de la classe CMyTreeNode. |
//| ENTREE : aucun. |
//| SORTIE : aucune. |
//| REMARQUE : aucune. |
//+------------------------------------------------------------------+
void CMyTreeNode::CMyTreeNode()
{
//--- initialisation des données utilisateur
m_long =0;
m_double =0.0;
m_string ="";
m_datetime =0;
}
//+------------------------------------------------------------------+
//| Comparaison avec un autre noeud par l'algorithme spécifié. |
//| ENTREE : noeud - élément à comparer, |
//| mode - identifiant de l'algorithme de comparaison. |
//| SORTIE : résultat de la comparaison (>0,0,<0). |
//| REMARQUE : aucune. |
//+------------------------------------------------------------------+
int CMyTreeNode::Compare(const CObject *node,int mode)
{
//--- le paramètre mode est ignoré, car l'algorithme de construction de l'arbre est le seul
int res=0;
//--- cast explicite
CMyTreeNode *n=node;
res=(int)(m_long-n.m_long);
//---
return(res);
}
//+------------------------------------------------------------------+
//| Création d'une nouvelle instance de classe. |
//| ENTREE : aucun. |
//| SORTIE : pointeur sur la nouvelle instance de classe CMyTreeNode. |
//| REMARQUE : aucune. |
//+------------------------------------------------------------------+
CTreeNode* CMyTreeNode::CreateSample()
{
CMyTreeNode *result=new CMyTreeNode;
//---
return(result);
}
//+------------------------------------------------------------------+
//| Sauvegarde les données du noeud de l'arbre dans un fichier. |
//| ENTREE : file_handle - handle d'un fichier ouvert en écriture. |
//| SORTIE : vrai si OK, sinon faux. |
//| REMARQUE : aucune. |
//+------------------------------------------------------------------+
bool CMyTreeNode::Save(int file_handle)
{
uint i=0,len;
//--- vérifications préliminaires
if(file_handle<0) return(false);
//--- écriture des données utilisateur
//--- écriture des variables personnelles de type long
if(FileWriteLong(file_handle,m_long)!=sizeof(long)) return(false);
//--- écriture des variables personnelles de type double
if(FileWriteDouble(file_handle,m_double)!=sizeof(double)) return(false);
//--- écriture des variables personnelles de type string
len=StringLen(m_string);
//--- écriture de la longueur de la chaîne
if(FileWriteInteger(file_handle,len,INT_VALUE)!=INT_VALUE) return(false);
//--- écriture de la chaîne
if(len!=0 && FileWriteString(file_handle,m_string,len)!=len) return(false);
//--- écriture des données personnelles de type datetime
if(FileWriteLong(file_handle,m_datetime)!=sizeof(long)) return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| Charge les données du noeud de l'arbre depuis un fichier. |
//| ENTREE : file_handle - handle d'un fichier ouvert en lecture. |
//| SORTIE : vrai si OK, sinon faux. |
//| REMARQUE : aucune. |
//+------------------------------------------------------------------+
bool CMyTreeNode::Load(int file_handle)
{
uint i=0,len;
//--- vérifications préliminaires
if(file_handle<0) return(false);
//--- lecture
if(FileIsEnding(file_handle)) return(false);
//--- lecture des variables personnelles de type char
//--- lecture des variables personnelles de type long
m_long=FileReadLong(file_handle);
//--- lecture des variables personnelles de type double
m_double=FileReadDouble(file_handle);
//--- lecture des variables personnelles de type string
//--- lecture de la longueur de la chaîne
len=FileReadInteger(file_handle,INT_VALUE);
//--- lecture de la chaîne
if(len!=0) m_string=FileReadString(file_handle,len);
else m_string="";
//--- lecture des variables personnelles de type datetime
m_datetime=FileReadLong(file_handle);
//---
return(true);
}
|