Page 1 sur 1

Dim 15/01/2012 - Actualités

Posté : dim. 15 janv. 2012 12:18
par Xavier
Dim 15/01/2012 - Actualités


11:15

La classe des données a été simplifiée : les attributs Level et Index ont été supprimés.
Ils renvoyaient respectivement le niveau de l'objet dans la hiérarchie et son numéro d'ordre dans un dossier, mais :
  • Mettre à jour ces champs complexifie et ralentit les opérations de copie et de déplacement.
  • Le Level n'est pas vraiment utile, et il reste toujours possible de distinguer l'ancêtre si besoin car c'est le seul objet qui n'a pas de Parent.
  • Maintenir l'Index ne sert à rien, il est disponible par les fonctions de base des Lists : "Self.Parent.Children.IndexOf(Self)". lol

Re: Dim 15/01/2012 - Actualités

Posté : dim. 15 janv. 2012 13:00
par Denis
A la fin, il ne restera plus qu'une ligne de code !

Re: Dim 15/01/2012 - Actualités

Posté : dim. 15 janv. 2012 13:23
par Xavier
DMo a écrit :A la fin, il ne restera plus qu'une ligne de code !
Tu sais bien ce que c'est, le but du jeu est de passer des heures à optimiser du code jusqu'à le rendre totalement illisible. :D

Voilà donc la nouvelle méthode qui a été "sécurisée" après branchement... et crashes :

Code : Tout sélectionner

//------------------------------------------------------------------------------
// Move : déplace ou repositionne un objet TData
// 15/01/2012 - XT400
//------------------------------------------------------------------------------
procedure TData.Move(New_Parent: TData; New_Index: Integer);
var
	Old_Index: Integer;
	Max_Index: Integer;
begin
	// Déplacement
	if	New_Parent <> Self.Parent
	then	begin
		if	Self.Parent <> Nil
		then	Self.Parent.Children.Remove(Self);
		Self.Parent := New_Parent;
		if	New_Parent <> Nil
		then	New_Parent.Children.Add(Self);
		end;

	// Repositionnement
	if	New_Index >= 0
	then	begin
		Old_Index := Self.Parent.Children.IndexOf(Self);
		if	New_Index <> Old_Index
		then	begin
			Max_Index := Self.Parent.Children.Count - 1;
			if	New_Index <= Max_Index
			then	Self.Parent.Children.Move(Old_Index, New_Index);
			end;
		end;
end;

Dim 15/01/2012 - Actualités

Posté : dim. 15 janv. 2012 17:58
par Xavier
16:50


Gérer graphiquement les actions Monter et Descendre a été plus difficile que prévu.
Après quelques heures à tenter du couper/coller puis du refresh global avec perte de la sélection, c'est finalement la méthode MoveTo des TreeNodes qui a été utilisée, et ce grâce au paramètre naInsert qui permet de déplacer un Node à l'intérieur du même parent. Paramètre très discret dans la doc ! :evil:

Le résultat est un double GetNextSibling qui semble étrange mais qui est nécessaire quand on y réfléchit. :mrgreen:

Code : Tout sélectionner

		// Monter
		if	Sender = Contacts_Up_Action
		then	begin
			// Gestion des données
			...

			// Gestion graphique
			if	New_Index = Max_Index
			then	Selected_Node.MoveTo(Selected_Node.Parent, naAddchild)
			else	Selected_Node.MoveTo(Selected_Node.GetPrevSibling, naInsert);
			end;

		// Descendre
		if	Sender = Contacts_Down_Action
		then	begin
			// Gestion des données
			...

			// Gestion graphique
			if	New_Index = Max_Index
			then	Selected_Node.MoveTo(Selected_Node.Parent, naAddchild)
			else	if	New_Index = 0
				then	Selected_Node.MoveTo(Selected_Node.Parent, naAddchildFirst)
				else	Selected_Node.MoveTo(Selected_Node.GetNextSibling.GetNextSibling, naInsert)
			end;
Et sinon la gestion du bouton Dossiers est terminée, c'est un vrai plaisir de jouer avec ça selon les différentes options. :)
ShowFolders.png
Reste à faire pour le premier prototype :
  • Gérer les données dans le panneau de droite. Le ListView sera peut être remplacé par un autre TreeView.
  • Brancher la lecture/écriture des données et des options (les services XML écrits cet été).
  • Peut-être débugger un peu la Barre qui crashe assez facilement.