Pas d'inquiétude, avec PBAdonf, c'est dans la poche ! ^^

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 10-06-2014 15:25:08

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

[SOURCE] TreeList, un contrôle TreeView multi-colonnes

Cas concret : vous auriez besoin d'afficher dans une liste des données arborescentes, mais la DW TreeView vous casse les pieds quand vous n'avez pas le même nombre de sous groupes dans les différents niveaux, et le TreeView PB ne gère qu'une seule colonne.

Je vous propose un nouveau contrôle hybride, issu des contrôles ListView et TreeView de l'API windows : le TreeList.

Distribué sous forme de dll, vous pouvez l'utiliser dans n'importe quelle application windows (32bit, non testé dans du code 64bit mais ça doit pouvoir se recompiler avec les bonnes options) et wrappé en vo_treelist pour PB10/11+ (version unicode pour le moment, j'essaie de faire une version non-unicode).

Ce n'est pas une extension PBNI, donc la version non-unicode devrait pouvoir s'utiliser avec des PB plus anciens que PB9 (ça peut intéresser certains contributeurs du forum qui maintiennent des vieilleries... )

Comme pour mes autre projets, une application PB permet de tester le contrôle et d'avoir un exemple d'utilisation.

http://github.com/sebkirche/treelist/raw/master/demo_pb.png

Bon, je n'ai pas réinventé la roue, j'ai repris du code existant, j'en ai fait une dll et j'ai wrappé un useroject visuel autour

Le code est dispo sur GitHub (en collaboration avec xlat), vous êtes libres de jouer avec et de me faire part de vos rapports de bugs ou demandes d'évolutions.  Je n'ai pas encore remappé vers PB l'ensemble des possibilités du contrôle mais il permet déjà pas mal de choses.

Edit: Note : sur l'image on voit des icônes associées à certains items ou aux colonnes. Il faut savoir que c'est un contrôle moins "intelligent" qu'une DW : les icônes de filtre ou de tri dans les entêtes ne sont que des images persos qu'on fait charger au TreeList. Il faudra gérer vous même le filtrage des éléments ou le tri (le contrôle a certaines possibilités de tris pour les enfants d'un noeud, mais rien d'élaboré pour trier par colonne au choix de l'utilisateur). Idem pour un clic sur une colonne pour la mettre en surbrillance : vous pouvez recevoir la notif du clic sur la colonne, mais c'est au choix du codeur de déclencher la mise en surbrillance ("mark" de la colonne)

Enjoy!

Dernière modification par seki (11-06-2014 09:53:33)


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#2 11-06-2014 09:04:03

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

et


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#3 01-10-2014 17:21:35

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

Hello, un p'tit UP pour signaler que le projet avance (je viens de gérer le changement de couleur de texte d'un item en plus du fond) et que j'ai aussi fait une version non-unicode de la dll, testé avec PB9 (donc en théorie utilisable aussi sur les versions précédentes) !

Allez, un ptit scrinechote de la version PB9 histoire de piquer un peu les yeux : http://i.imgur.com/tzOAsS2.png


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#4 13-10-2014 12:33:26

Van  
Bienfaiteur du site
Award: bf
Lieu: mouvaux
Date d'inscription: 19-03-2013
Messages: 125
Pépites: 673
Banque: 41

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

Bien le bonjour,

Je suis bien intéressé par ton contrôle mixte pour une vieillerie en PB 9.
Je suis bloqué sur la génération de la dll avec tes sources récupéré sur Github.
Je me retrouve avec des erreurs de compiles sur le formatage des printf avec les handles.  warning C4313: 'printf' : conflit entre '%x' dans la chaîne de format et l'argument 1 de type 'HINSTANCE'.

Avec quel version de VS compile tu cette DLL?

En te remerciant d'avance.


Tant que ça bouge c'est pas mort, dans le doute frappe encore!
Ni dieu ni maître, sauf maître Kanter!

Hors ligne

 

#5 14-10-2014 07:18:08

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

Mon environnement de dev c'est VS2005 (ils ne renouvellement pas souvent VS ici, vu que ça ne nous sert que pour des devs "annexes" ), et notre PB "officiel" c'est 11.5. Mais tu devrais pouvoir générer avec un VS plus récent (j'ai testé avec un VC++ 2010 express mais il y a des erreurs de compilation dûes à des fichiers manquants dans la soupe AFX de M$).

Pour ce qui est des warnings, je reconnais que le projet visual studio est un peu "crade" au niveau des configurations, je maîtrise mal la cohabitation de plusieurs projets dans une même solution et j'ai un peu bricolé pour pouvoir générer la dll en plusieurs version debug/release et unicode (pb10+)/ non-unicode (pb9) ainsi qu'un programme de test autre que celui qui se compile avec la dll. Les microsofteries m'embêtent aussi pas mal (les afx... et compagnie ). D'habitude je travaille beaucoup avec MinGW / GCC pour produire des outils simples à porter quand c'est possible.

Je te conseille de ne compiler que le sous-projet "treelist" et pas la solution complète, et de choisir les configurations "Dll Debug" (PB9) / "Dll Debug unicode" (PB10+) et "Dll Release" (PB9) / "Dll release unicode" (PB10+). Si tu veux un exemple simple qui contruit "à la main" en C un treelist en déclarant les colonnes, puis en ajoutant les données et en spécifiant certains paramètres c'est le projet "SimpleTest" (quand l'exemple de l'auteur TreeListDlg est fait sur base des MFC).

Il est aussi fortement conseillé de faire un "clean" avant le "build" quand tu changes de type de configuration (de debug à release par exemple) car il y des fichiers objets qui ne se refont pas systématiquement.

Enfin pour les warnings, ce n'est pas bloquant : le compilo signale que je n'ai pas utilisé le bon type de données dans des printf de debuggage pour certaines valeurs de handles (HTREEINFO, HINSTANCE, HMODULE et HWND) qui ne collent pas avec %x, c'est dans simple.cpp le programme de test. Tu peux ignorer ceux-là.

Ajout:
Merci de ton intérêt pour TreeList , nous étions le seul client connu de ce contrôle pour le moment.
N'hésite pas à remonter des bugs éventuels ou à faire part de ce qui te manquerait; le userobject PB ne wrappe pas entièrement ce que le contrôle sait faire (il peut manquer des envois de messages du côté PB).

Pour info, on a construit un objet plus évolué en PB su la base du TreeList qui sait retrouver un item à partir d'une clé (ce que ne sait pas faire le TreeList en C - il faut soit chercher, soit retenir les HTREEITEM associés aux lignes) mais ça impose une dépendance sur PbniHash et j'hésitais à publier ça...

Dernière modification par seki (14-10-2014 07:25:13)


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#6 14-10-2014 08:31:08

Van  
Bienfaiteur du site
Award: bf
Lieu: mouvaux
Date d'inscription: 19-03-2013
Messages: 125
Pépites: 673
Banque: 41

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

Je suis seul sur le projet et j'ai a mettre en place une fenêtre de paramétrage assez chiante de part sa structure.
Pour certains cas j'ai besoin de données filles qui peuvent changer en nombre de 0 à n dans le temps.
En réunion avec mon responsable il me dit qu'un "+" serait bien pour afficher/masquer les données filles. Du coup j'ai tout de suite penser au TreeList de ta DLL

La solution ne passait pas direct la migration sur une VS2013 (pas mal de warning) et des plantage de compile par rapport à des header précompilée de TreeList (WTF!!!!).
Faute de temps pour regarder tout ça j'ai pris le ficher vcproj, j'ai vu la version "8,00" et j'ai du coup ouvert sous VS2005.
J'arrive donc sur ces messages par rapport aux Handle.

En comilant que la partie TreeList j'ai quand même un couac sur l'édition de liens par rapport au fichier TreeListA.def qui effectivement ne fait pas partie des fichiers du zip récupérer sur Github. J'ai loupé une étape?

Ps : Par la suite je serais bien intéressé par les objets supplémentaire mais faudra que je prenne le temps de voir l'intégration de PbniHash du coup.

Dernière modification par Van (14-10-2014 08:50:12)


Tant que ça bouge c'est pas mort, dans le doute frappe encore!
Ni dieu ni maître, sauf maître Kanter!

Hors ligne

 

#7 14-10-2014 09:00:55

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

Van a écrit:

La solution ne passait pas direct la migration sur une VS2013 (pas mal de warning) et des plantage de compile par rapport à des header précompilée de TreeList (WTF!!!!).
Faute de temps pour regarder tout ça j'ai pris le ficher vcproj, j'ai vu la version "8,00" et j'ai du coup ouvert sous VS2005.
J'arrive donc sur ces messages par rapport aux Handle.

Oui, la gestion des headers précompilés c'est vraiment le souk dans le projet et je ne sais même pas si on en a vraiment besoin. Il fadrait que je nettoie ce bin's mais ce n'est pas vraiment la priorité...

Van a écrit:

En comilant que la partie TreeList j'ai quand même un couac sur l'édition de liens par rapport au fichier TreeListA.def qui effectivement ne fait pas partie des fichiers du zip récupérer sur Github. J'ai loupé une étape?

Regarde mieux : il y est bien (maintenant)...
Argl, la version PB9 est la denière chose que j'ai faite sur le projet, et j'ai oublié ce fichier... Merci pour le signalement

Il me semble que j'ai sauvé des dll pré-compilées sur GitHub, tu ne pouvais pas les utiliser directement ? En tout cas ça permet de voir ce qu'il faudra améliorer dans le projet... N'hésite pas à ouvrir des tickets sur github au besoin.


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#8 14-10-2014 09:18:44

Van  
Bienfaiteur du site
Award: bf
Lieu: mouvaux
Date d'inscription: 19-03-2013
Messages: 125
Pépites: 673
Banque: 41

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

C'est toujours mieux de voir comment ça tourne (et tu va rire de moi je n'avais pas vu les dll dans le dossier pb ^^')

Dernière modification par Van (14-10-2014 09:21:29)


Tant que ça bouge c'est pas mort, dans le doute frappe encore!
Ni dieu ni maître, sauf maître Kanter!

Hors ligne

 

#9 15-10-2014 13:56:50

Van  
Bienfaiteur du site
Award: bf
Lieu: mouvaux
Date d'inscription: 19-03-2013
Messages: 125
Pépites: 673
Banque: 41

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

Bonjour,

J'ai un petit soucis sur l'utilisation orca.
J'ai encore jamais eu à l'utiliser. Et je tombe sur une erreur "Target file not found:treeList90.pbt" sur la commande "scc set target 'TreeList90.pbt', 'REFRESH_ALL | IMPORTONLY'"

La variable project est correctement valorisé avec le chemin menant à la target

Est ce qu'il y a quelque chose à changer/paramétrer pour utiliser ce script ORCA si on utilise jamais  ce dernier?

Merci


Tant que ça bouge c'est pas mort, dans le doute frappe encore!
Ni dieu ni maître, sauf maître Kanter!

Hors ligne

 

#10 15-10-2014 15:47:38

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

Mmhh, si je regarde les scripts, je vois que c'est un peu différent pour PB9 que pour 10.5/11.5.
Le script orca ne sert qu'à automatiser la tâche après un "git pull".
Je vais creuser sur ma deuxième machine de dev...

En attendant, est-ce que tu arrives à refaire la pbl du bon nom puis à importer les objets de src\90\ manuellement ?


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#11 16-10-2014 08:04:43

Van  
Bienfaiteur du site
Award: bf
Lieu: mouvaux
Date d'inscription: 19-03-2013
Messages: 125
Pépites: 673
Banque: 41

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

Oui à la mano ça passe j'ai mis ça dans une pbl d'outil de dév sans soucis.
Je vais commencer la prise en main avec ta fenêtre de test.

Mais ebn mode curieux je voulais voir comment ça se passer avec orca.

Dernière modification par Van (16-10-2014 08:05:07)


Tant que ça bouge c'est pas mort, dans le doute frappe encore!
Ni dieu ni maître, sauf maître Kanter!

Hors ligne

 

#12 16-10-2014 09:24:35

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

Van a écrit:

Mais ebn mode curieux je voulais voir comment ça se passer avec orca.

Tu fais bien, je suis en train de dépatouiller le merdier pour avoir un script de rebuild valable pour 9, 10, 11 mais cette cochonnerie est assez sensible au niveau des répertoires de travail et des chemins qu'on lui passe.

Ça sera mieux pour les mises à jour ultérieures du code (c'est quand même beaucoup mieux de versionner des sources que des pbl). Stay tuned... et merci de prendre la peine de signalier ce qui coince. Tu es le premier


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#13 16-10-2014 10:28:06

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

seki a écrit:

je suis en train de dépatouiller le merdier pour avoir un script de rebuild valable pour 9, 10, 11 mais cette cochonnerie est assez sensible au niveau des répertoires de travail et des chemins qu'on lui passe.

Je crois que c'est bon : maintenant on doit arriver à regénérer les pbl après un "git pull", pour PB9 comme pour les suivants.

J'ai fini par trouver qu'un path passé à orcascript par un /D sur la ligne de commande (le project path) devait avoir les backslash doublés, mais pas les autres...
Si je tenais les devs de Sybase...


Ah, et puis aussi je crois que j'avais oublié de mettre treelist90.pbw dans git...

Dernière modification par seki (16-10-2014 10:33:56)


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#14 16-10-2014 11:11:24

Van  
Bienfaiteur du site
Award: bf
Lieu: mouvaux
Date d'inscription: 19-03-2013
Messages: 125
Pépites: 673
Banque: 41

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

Yép il n'y avais pas le Workspace.
Je ne savais pas trop si c'était normal n'ayant jamais travaillé avec ORCA mais comme ça passé pas j'ai tenté la création d'un workspace avec import de la target qui n'était pas passé étant donné que la pbl n'existait pas ^^'.
Donc création d'une pbl dans la foulée avec l'application créé en auto que j'ai tenté de supprimé pour mettre la tienne....mais j'ai du foiré à un endroit, ça se planté...

Là le module fonctionne bien. J'ai juste un freeze de la fenêtre sur l'utilisation des boutons "no(h)scroll", j'ai pas trop regarder le pourquoi du comment pour l'instant.

Sinon j'ai vu sur le site d'Anton Zechner qu'il y avais des possibilité de mettre en place des combo box, à priori ce n'est pas encore possible avec ton wrapp je vais regarder de mon coté si c'est dans mes cordes et je te fais un retour.


Tant que ça bouge c'est pas mort, dans le doute frappe encore!
Ni dieu ni maître, sauf maître Kanter!

Hors ligne

 

#15 16-10-2014 12:24:07

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

Van a écrit:

Là le module fonctionne bien. J'ai juste un freeze de la fenêtre sur l'utilisation des boutons "no(h)scroll", j'ai pas trop regarder le pourquoi du comment pour l'instant.

Il peut aussi y avoir des vrais bugs dans le code C. J'ai déjà corrigé 2/3 bricoles, et complété des features manquantes :
- possibilité d'utiliser une imagelist différente pour les items et pour les entêtes de colonnes
- répondre à WM_GETFONT
- gérér correctement le WM_SETFONT pour pouvoir encore utiliser le bold après changement

Van a écrit:

Sinon j'ai vu sur le site d'Anton Zechner qu'il y avais des possibilité de mettre en place des combo box, à priori ce n'est pas encore possible avec ton wrapp je vais regarder de mon coté si c'est dans mes cordes et je te fais un retour.

Oui, je n'ai pas du tout mappé en PB la possibilité de remplacer le champ d'édition texte par des boutons radio ou une liste déroulante. Je pense qu'il manque des méthodes dans vo_treelist permettant d'envoyer les bons messages à la dll.


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#16 16-10-2014 13:32:25

Van  
Bienfaiteur du site
Award: bf
Lieu: mouvaux
Date d'inscription: 19-03-2013
Messages: 125
Pépites: 673
Banque: 41

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

J'ai tester tes modifs mais la génération se plante sur un message "Orcasrc90.exe à cessé de fonctionner"

Je vais quand même faire un petit reboot de mon poste car je trouve qu'il est un peu sur les rotules


Tant que ça bouge c'est pas mort, dans le doute frappe encore!
Ni dieu ni maître, sauf maître Kanter!

Hors ligne

 

#17 20-10-2014 14:41:09

Van  
Bienfaiteur du site
Award: bf
Lieu: mouvaux
Date d'inscription: 19-03-2013
Messages: 125
Pépites: 673
Banque: 41

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

Question conne (ou pas) , les champs sont prévu pour etre éditable?
Si c'est bien le cas j'ai un soucis car dans la pbl que j'ai remonter de tes source ça passe pas et je n'arrive pas à trouver où ça coince.

En parallèle j'ai récupérer les sources d'origine et je met la main sur un VS2008 pour faire tourner le bousin histoire de voir exactement ce qu'il a prévu


Tant que ça bouge c'est pas mort, dans le doute frappe encore!
Ni dieu ni maître, sauf maître Kanter!

Hors ligne

 

#18 20-10-2014 15:32:05

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

Tu devrais regarder TreeList.exe dans le répertoire tests (c'est le programme de démo de l'auteur du TreeList) : si tu coches TVS_EDITLABELS les cellules deviennent éditables.
- la colonne 3 devient "auto editable" et si tu coches TVAE_DBLCLICK il suffit de double-cliquer sur une cellule de la colonne 3 pour passer en éditition ou si tu coches TVAE_ONLYRETURN ça sera lors de l'appui de la touche RETURN
- si tu utilise les boutons "Edit" ou "ComboBox" la cellule qui aura le focus devient éditable avec un champ texte ou une combobox.

Mais ce n'est pas built-in comme pour une datawindow et il faut se farcir la messagerie entre la fenêtre et le contrôle pour permettre de gérer ces possibilités d'édition et je n'en avais pas le temps quand j'ai intégré le TreeList dans l'application qui l'utilise ici.

En résumé, c'est possible, mais pas encore géré dans mon vo_treelist PB.


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#19 20-10-2014 16:03:41

Van  
Bienfaiteur du site
Award: bf
Lieu: mouvaux
Date d'inscription: 19-03-2013
Messages: 125
Pépites: 673
Banque: 41

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

Je n'avais pas vu que l'exe du dossier tests était celui d'origine pur C.

Je regarde dans ce cas à mettre en place le caractère editable.

Merci pour l'info


Tant que ça bouge c'est pas mort, dans le doute frappe encore!
Ni dieu ni maître, sauf maître Kanter!

Hors ligne

 

#20 22-10-2014 09:17:31

Van  
Bienfaiteur du site
Award: bf
Lieu: mouvaux
Date d'inscription: 19-03-2013
Messages: 125
Pépites: 673
Banque: 41

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

Bon en définitive je vais être emmerder car je bloque sur l'appel au sendmessage à l'appuis du bouton edit.

J'ai besoin de faire des opérations bitwise pour refaire l'appel à la fonction :

Code: cpp

TreeList_EditLabel(m_hWnd,hItem,TVIR_EDITCOL(nCol)|((iF)? TVIR_EDITFULL:0)|(iS))) ) 


Ce que j'aurais pu faire avec le pbniCW mais l'extension a été faite pour pb10 et je n'arrive pas à en faire une version PB9 (shame on me...)

J'ai dégager tout ce qui a trait aux fichiers transaction car des fonctionalités arrivé avec Pb10 sont utilisé. Ca compile jusqu'a la créatioàn du pbx qui se crash sur un message d'erreur "1>Command syntax error at line 1. Found 'c', expected '<class or globalfunctions or forward>'"

Faute de temps pour mon projet, je vais bricoler ma fenêtre de paramétrage avec des datawindows et je verrai pour poursuivre plus tard avec le treelist

Dernière modification par Van (22-10-2014 09:18:10)


Tant que ça bouge c'est pas mort, dans le doute frappe encore!
Ni dieu ni maître, sauf maître Kanter!

Hors ligne

 

#21 22-10-2014 09:24:40

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [SOURCE] TreeList, un contrôle TreeView multi-colonnes

Van a écrit:

Ce que j'aurais pu faire avec le pbniCW mais l'extension a été faite pour pb10 et je n'arrive pas à en faire une version PB9 (shame on me...)

ça, ça peut se faire... En attendant, je te fournis un userbject qui permet de faire de tels calculs, en pur PB9 (c'est lent, mais juste pour un message, ça ne devrait pas se voir) ça peut t'aider ?

Van a écrit:

J'ai dégager tout ce qui a trait aux fichiers transaction car des fonctionalités arrivé avec Pb10 sont utilisé. Ca compile jusqu'a la créatioàn du pbx qui se crash sur un message d'erreur "1>Command syntax error at line 1. Found 'c', expected '<class or globalfunctions or forward>'"

Faute de temps pour mon projet, je vais bricoler ma fenêtre de paramétrage avec des datawindows et je verrai pour poursuivre plus tard avec le treelist

Cette partie qui utilise du code Sybase, de mémoire on peut la désactiver par un #define, non ? (c'est xlat qui avait ajouté cette partie, on s'en sert notamment (de mémoire) pour pouvoir recevoir des notifications depuis un traitement sql en cours)

Code: pb

forward
global type n_cst_numerical from nonvisualobject
end type
end forward

global type n_cst_numerical from nonvisualobject autoinstantiate
end type

forward prototypes
public function string of_binary (long al_decimal)
public function long of_decimal (string as_binary)
public function boolean of_getbit (long al_decimal, unsignedinteger aui_bit)
public function long of_bitwiseand (long al_decimala, long al_decimalb)
public function long of_bitwiseor (long al_decimala, long al_decimalb)
public function long of_setbit (long al_decimal, unsignedinteger aui_bit)
public function long of_clearbit (long al_decimal, unsignedinteger aui_bit)
public function long of_flipbit (long al_decimal, unsignedinteger aui_bit)
public function long of_bitwisenot (long al_decimal)
public function long of_bitwisexor (long al_decimala, long al_decimalb)
public function integer of_bitwiseand (integer ai_decimala, integer ai_decimalb)
public function integer of_bitwiseor (integer ai_decimala, integer ai_decimalb)
public function int of_setbit (int ai_decimal, unsignedinteger aui_bit)
public function int of_clearbit (int ai_decimal, unsignedinteger aui_bit)
public function int of_flipbit (int ai_decimal, unsignedinteger aui_bit)
public function integer of_bitwisenot (integer ai_decimal)
public function integer of_bitwisexor (integer ai_decimala, integer ai_decimalb)
end prototypes

public function string of_binary (long al_decimal);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_Binary
//
// Access:  public
//
//  Arguments:
//    al_decimal    unsigned long to convert to bit string
//
//  Returns:  string
//
//  Description:  Convert al_decimal to a string of 32 1's and 0's in
//            big-endian format i.e with LSB at position 1.
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

string       ls_binary
unsignedint   lui_cnt
long         ll_remainder
unsignedlong  lul_decimal

lul_decimal = al_decimal

for lui_cnt = 1 to 32
  ll_remainder = mod(lul_decimal, 2)
  lul_decimal = lul_decimal / 2

  ls_binary = ls_binary + string(ll_remainder)
next

return ls_binary
end function

public function long of_decimal (string as_binary);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_Decimal
//
// Access:  public
//
//  Arguments:
//    as_binary  string to convert
//
//  Returns:  long
//
//  Description:  Convert an array of 1's and 0's in big-endian format
//            i.e. LSB at index 1 to a number.
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

long ll_decimal
unsignedint lui_cnt

// Propogate the sign bit
as_binary += Fill(Right(as_binary, 1), 31)

// Calculate the value
for lui_cnt = 1 to 32
  ll_decimal = ll_decimal + (long(Mid(as_binary, lui_cnt, 1)) * (2 ^ (lui_cnt - 1)))
next

return ll_decimal
end function

public function boolean of_getbit (long al_decimal, unsignedinteger aui_bit);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_GetBit
//
// Access:  public
//
//  Arguments:
//    al_decimal    value
//    aui_bit      bit number to test
//
//  Returns:  boolean
//
//  Description:  Tests a given bit in a number.
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

unsignedlong  lul_decimal

lul_decimal  = al_decimal

if (Mod(long(lul_decimal /  2 ^(aui_bit - 1)), 2) > 0) then
  return true
end if

return false
end function

public function long of_bitwiseand (long al_decimala, long al_decimalb);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_BitwiseAND
//
// Access:  public
//
//  Arguments:
//    al_decimala
//    al_decimalb
//
//  Returns:  long
//
//  Description:  Logically AND 2 numbers
//
//    a  b  result
//    -- -- ------
//    0  0  0
//    0  1  0
//    1  0  0
//    1  1  1
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

unsignedint lui_bit
long      ll_decimal

ll_decimal = 0

for lui_bit = 1 to 32
  if this.of_GetBit(al_decimala, lui_bit) and this.of_GetBit(al_decimalb, lui_bit) then
    ll_decimal = this.of_SetBit(ll_decimal, lui_bit)
  end if
next

return ll_decimal
end function

public function long of_bitwiseor (long al_decimala, long al_decimalb);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_BitwiseOR
//
// Access:  public
//
//  Arguments:
//    al_decimala
//    al_decimalb
//
//  Returns:  long
//
//  Description:  Logically OR 2 numbers
//
//    a  b  result
//    -- -- ------
//    0  0  0
//    0  1  1
//    1  0  1
//    1  1  1
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

unsignedint lui_bit
long      ll_decimal

ll_decimal = 0

for lui_bit = 1 to 32
  if this.of_GetBit(al_decimala, lui_bit) or this.of_GetBit(al_decimalb, lui_bit) then
    ll_decimal = this.of_SetBit(ll_decimal, lui_bit)
  end if
next

return ll_decimal
end function

public function long of_setbit (long al_decimal, unsignedinteger aui_bit);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_SetBit
//
// Access:  public
//
//  Arguments:
//    al_decimal    value
//    aui_bit      bit number to set
//
//  Returns:  new value
//
//  Description:  Sets a given bit in a number.
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

if not this.of_GetBit(al_decimal, aui_bit) then
  return al_decimal + (2 ^ (aui_bit - 1))
end if

return al_decimal
end function

public function long of_clearbit (long al_decimal, unsignedinteger aui_bit);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_ClearBit
//
// Access:  public
//
//  Arguments:
//    al_decimal    value
//    aui_bit      bit number to clear
//
//  Returns:  new value
//
//  Description:  Clears a given bit in a number.
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

if of_GetBit(al_decimal, aui_bit) then
  return al_decimal - (2 ^ (aui_bit - 1))
end if

return al_decimal
end function

public function long of_flipbit (long al_decimal, unsignedinteger aui_bit);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_FlipBit
//
// Access:  public
//
//  Arguments:
//    al_decimal    value
//    aui_bit      bit number to flip
//
//  Returns:  new value
//
//  Description:  Flips a given bit in a number.
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

if not this.of_GetBit(al_decimal, aui_bit) then
  return this.of_SetBit(al_decimal, aui_bit)
else
  return this.of_ClearBit(al_decimal, aui_bit)
end if
end function

public function long of_bitwisenot (long al_decimal);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_BitwiseNOT
//
// Access:  public
//
//  Arguments:
//    al_decimal    value to not
//
//  Returns:  none
//
//  Description:  Logically NOT all bits in a number
//
//    a  result
//    -- ------
//    0  1
//    1  0
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

unsignedint lui_bit
long      ll_decimal

ll_decimal = 0

for lui_bit = 1 to 32
  if not this.of_GetBit(al_decimal, lui_bit) then
    ll_decimal = this.of_SetBit(ll_decimal, lui_bit)
  end if
next

return ll_decimal
end function

public function long of_bitwisexor (long al_decimala, long al_decimalb);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_BitwiseXOR
//
// Access:  public
//
//  Arguments:
//    al_decimala
//    al_decimalb
//
//  Returns:  long
//
//  Description:  Logically XOR 2 numbers
//
//    a  b  result
//    -- -- ------
//    0  0  0
//    0  1  1
//    1  0  1
//    1  1  0
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

unsignedint lui_bit
long      ll_decimal

ll_decimal = 0

for lui_bit = 1 to 32
  if this.of_GetBit(al_decimala, lui_bit) <> this.of_GetBit(al_decimalb, lui_bit) then
    ll_decimal += (2 ^ (lui_bit - 1))
  end if
next

return ll_decimal
end function

public function integer of_bitwiseand (integer ai_decimala, integer ai_decimalb);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_BitwiseAND
//
// Access:  public
//
//  Arguments:
//    ai_decimala
//    ai_decimalb
//
//  Returns:  int
//
//  Description:  Logically AND 2 numbers
//
//    a  b  result
//    -- -- ------
//    0  0  0
//    0  1  0
//    1  0  0
//    1  1  1
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

unsignedint lui_bit
int      li_decimal

li_decimal = 0

for lui_bit = 1 to 16
  if this.of_GetBit(ai_decimala, lui_bit) and this.of_GetBit(ai_decimalb, lui_bit) then
    li_decimal = this.of_SetBit(li_decimal, lui_bit)
  end if
next

return li_decimal
end function

public function integer of_bitwiseor (integer ai_decimala, integer ai_decimalb);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_BitwiseOR
//
// Access:  public
//
//  Arguments:
//    ai_decimala
//    ai_decimalb
//
//  Returns:  int
//
//  Description:  Logically OR 2 numbers
//
//    a  b  result
//    -- -- ------
//    0  0  0
//    0  1  1
//    1  0  1
//    1  1  1
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

unsignedint lui_bit
int      li_decimal

li_decimal = 0

for lui_bit = 1 to 16
  if this.of_GetBit(ai_decimala, lui_bit) or this.of_GetBit(ai_decimalb, lui_bit) then
    li_decimal = this.of_SetBit(li_decimal, lui_bit)
  end if
next

return li_decimal
end function

public function int of_setbit (int ai_decimal, unsignedinteger aui_bit);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_SetBit
//
// Access:  public
//
//  Arguments:
//    ai_decimal    value
//    aui_bit      bit number to set
//
//  Returns:  new value
//
//  Description:  Sets a given bit in a number.
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

if not this.of_GetBit(ai_decimal, aui_bit) then
  return ai_decimal + (2 ^ (aui_bit - 1))
end if

return ai_decimal
end function

public function int of_clearbit (int ai_decimal, unsignedinteger aui_bit);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_ClearBit
//
// Access:  public
//
//  Arguments:
//    ai_decimal    value
//    aui_bit      bit number to clear
//
//  Returns:  new value
//
//  Description:  Clears a given bit in a number.
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

if of_GetBit(ai_decimal, aui_bit) then
  return ai_decimal - (2 ^ (aui_bit - 1))
end if

return ai_decimal
end function

public function int of_flipbit (int ai_decimal, unsignedinteger aui_bit);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_FlipBit
//
// Access:  public
//
//  Arguments:
//    ai_decimal    value
//    aui_bit      bit number to flip
//
//  Returns:  new value
//
//  Description:  Flips a given bit in a number.
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

if not this.of_GetBit(ai_decimal, aui_bit) then
  return this.of_SetBit(ai_decimal, aui_bit)
else
  return this.of_ClearBit(ai_decimal, aui_bit)
end if
end function

public function integer of_bitwisenot (integer ai_decimal);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_BitwiseNOT
//
// Access:  public
//
//  Arguments:
//    ai_decimal    value to not
//
//  Returns:  none
//
//  Description:  Logically NOT all bits in a number
//
//    a  result
//    -- ------
//    0  1
//    1  0
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

unsignedint lui_bit
int      li_decimal

li_decimal = 0

for lui_bit = 1 to 16
  if not this.of_GetBit(ai_decimal, lui_bit) then
    li_decimal = this.of_SetBit(li_decimal, lui_bit)
  end if
next

return li_decimal
end function

public function integer of_bitwisexor (integer ai_decimala, integer ai_decimalb);//////////////////////////////////////////////////////////////////////////////
//
//  Function:  of_BitwiseXOR
//
// Access:  public
//
//  Arguments:
//    ai_decimala
//    ai_decimalb
//
//  Returns:  int
//
//  Description:  Logically XOR 2 numbers
//
//    a  b  result
//    -- -- ------
//    0  0  0
//    0  1  1
//    1  0  1
//    1  1  0
//
//////////////////////////////////////////////////////////////////////////////
//  
//  Revision History
//
//  Version
//  1.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright ©1996 Simon Harris (simon@addease.com.au).  All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

unsignedint lui_bit
int      li_decimal

li_decimal = 0

for lui_bit = 1 to 16
  if this.of_GetBit(ai_decimala, lui_bit) <> this.of_GetBit(ai_decimalb, lui_bit) then
    li_decimal = this.of_SetBit(li_decimal, lui_bit)
  end if
next

return li_decimal
end function

on n_cst_numerical.create
call super::create
TriggerEvent( this, "constructor" )
end on

on n_cst_numerical.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on

The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22