PowerBuilder
Voici quelques trucs et codes pour PowerBuilder.
Toute remarque, suggestion, question bienvenue. N'hésitez pas à me laisser un mail.
Vous pouvez consulter la liste de mes liens PB (sur Del.icio.us)
Extensions PBNI
PBNI = PowerBuilder Native Interface, c'est un SDK fourni par Sybase qui permet d'écrire des extensions pour PB en C++ (avec Microsoft Visual Studio)
PbniRegex + PbRegexCoach
Pour tenter de pallier aux problèmes de performances de unvo_regexp j'ai fait une extension pbni pouvant utiliser des expressions régulières compatibles perl (réutilise le moteur PCRE). Cette extension ajoute aussi une fonction globale de replaceall.
Cette extention est faite à partir du SDK fourni avec PB et des exemples que j'ai pu trouver sur Codexchange.
Fonctionnalités principales de l'objet uo_regex
:
- syntaxe des regex perl (notamment les groupes capturants - PCRE = Perl Compatible Regular Expression)
- fonction de remplacement sur les matches de la regex qui peut réutiliser les groupes matchés (syntaxe :
\1 \2 \n
)
- fournit une fonction globale
FastReplaceAll()
utilisable sans devoir instancier uo_regex
; même si cette fonction est implémentée en C++, elle est beaucoup plus rapide qu'un équivalent en pbscript
Pour tester cette extension j'ai aussi créé PbRegexCoach (inspiré de The Regex Coach) :
Cette application réutilise aussi plusieurs composants de Nicolas Georges : redimensionneur automatique, splitters horizontal et vertical dérivés de ceux de Roland Smith. Nicolas a aussi publié un exemple d'utilisation de pbniregex.
Extension pbniregex.zip (sources incluses) + PbRegexCoach - Dernière mise à jour : samedi 1 avril 2017.
ChangeLog
2017-03-31 - version 1.3.2 (copyright update)
- added the generation of pbx for PB125
- added the demo application for PB125
2013-11-20 - Version 1.3.1
- support for named capturing group, including in replace strings
- bugfixed the empty pattern replacing that caused infinite loop
- IMPORTANT : until now the lib PCRE was compiled with default newline=LF
that is causing unexpected behavior when matching / replacing
text near end of line.
NOW it compiled with default newline=CRLF.
To get back the old behavior, you can add the option (*LF)
at the beginning of your patterns.
2013-07-01 - Version 1.3
- upgraded the underlying PCRE to 8.33 !!!
- addition of jit-enabled regexps (available in PCRE since v.8.20)
- replaced the Hello() method by GetVersion() and GetVersionFull()
- fixed some memory leaks when calling Study() some multiple times
- code cleanup
2011-07-04 - Added the PB12 version
2011-06-28 - PB9 backport complete.
Support for escaped backslashes in Replace(), now you can use strings like
'\\1' for inserting '\1' into replaced text. Added the possibility to get the
whole match with '\0'.
2011-06-21 - Started the PB9 backport, exported the source code separately into folder
for each PB version 9,10,11.5
2011-06-18 - the pbx/pbd files zere backported to PB10.5 and PB10.0 (actually 10.2)
the pbx, pbd and sample files (pbregexcoach.exe, pbl's) are named like the
PB development files : pbniregex115, pbregexcoach105, worksp100.pbw...
2011-02-14 - Upgrade of the splitters (various bugfixes and enhancements)
Export of the components source code (into pb_src folder) to help backporting
2009-09-09 - Project upgraded to PB 11.5
2009-06-26 - Added the GetLastError() method to get... err... the last error :)
2009-04-27 - PBX recompiled with PB 10.5.2.7826
2009-04-01 - I noticed that the utf-8 mode was buggy : when strings contained some
extended chars, both length & positions functions returned wrong values and
the returned strings were not correctly translated back into PB internal
utf-16. Reworked the internal string handling to always work in utf-8,
setutf8() does nothing and isutf8() always returns true.
The initialize() method does not fail anymore if the pattern is null (it used
to return a PBX_E_INVOKE_WRONG_NUM_ARGS status in that case)
I reworked the UI layout a bit with Nicolas Georges. The close menu problem
is solved.
The license conditions were updated to adopt the formal MIT license.
2009-03-16 - Minor refactor of the GUI + added a mini-help TODO : there is a little GUI
problem : the close button and system menu have disappeared you have to quit
with the File / Quit menu item
2009-03-11 - Bugfix in Replace() : broken by last modification to get the capturing groups
count, was replacing only the first occurence
Bugfix 2 : trying to replace an empty string by an empty string got endless
loop :S
Nicolas Georges refactored the UI to use a splitter and added a live-update
of the results. There is also a unit-test functionnality now.
2009-02-25 - Bugfix in Replace() : use the number of capturing groups from the pattern
instead of the number of the matched groups for the expansion of the \nn
items. E.g: Replace() returned \1 instead of an empty string when a pattern
with a capturing group matched nothing.
2009-02-09 - fixaround with search() when a match has null length
I noticed that the HeapAlloc calls *should* be surrounded by try/catch ;)
2008-11-26 - added the getpattern() method
2008-11-14 - fixed the correct handling of the option multiline
added the options and methods to handle dot-match-newlines, ungreedy and
extended syntax minor layout changes in regex coach
2008-11-13 - bugfix : crashing during replace() when a group matches nothing is bad :o)
2008-11-11 - rewrote the vector allocation for matches & groups with dynamic allocation
added the study() method
2008-11-05 - first public release
2008-09-08 - creation of PbRegexCoach as a test tool for PbniRegex
2008-09-01 - start of the project
PbniHash
La table de hachage (ou hashtable, dictionnaire, tableau associatif) est une structure de données très utile mais malheureusement absente de Powerbuilder.
La lib opensource libhashish implémente plusieurs algorithmes de hachage sous GNU/Linux. J'ai porté cette lib sous Windows grâce à MinGW (Nicolas Georges a ensuite désactivé la fonction de tri en arbre pour pouvoir réutiliser libhashish sous licence BSD) et j'ai écrit une extension pbni permettant d'utiliser des hashtables directement en Powerscript.
La libhashish a plein de possibilités mais le wrapper pbni est limité à l'essentiel :
- les clés sont des chaînes
- les valeurs sont de type any, donc tout type d'objet peut être stocké dans la table
- ajout ou suppression d'un élément par sa clé
- remplacement d'un élément déjà présent
- on peut obtenir le nombre d'éléments stockés
- on peut récupérer la liste des clés dans un tableau, ce qui peut permettre un parcours de l'ensemble des valeurs - mais l'ordre n'est pas garanti : il dépend de l'algorithme de hachage
- on peut purger la table
Extension pbnihash.zip (sources incluses) + sample PB de test - Dernière mise à jour : mardi 17 juillet 2018.
ChangeLog
2018-07-17 - Resurrected the 10.5 version
2017-04-10 - Reorganized the project for PB115 in order to produce other versions
the .pbx is now pbnihash115.pbx
2012-05-09 - Fix of_getkeys / of_geteach by reusing any array from argument
2012-04-11 - Use in memory buffer rather than temporary files
2012-01-05 - Use Shiny lib to profile code
improve pbserializer by using FILE* rather than HANDLE for file access
2012-01-02 - Fixe ReleaseString memory leaks
Pre-allocate pbarray before to fill'them'up
Added of_getvalues, of_geteach, of_serialize, of_unserialize
Add Display_hash button and function to demo project
Allow null values as data
2011-07-03 - Added a script to help the packaging and distrbution
2009-07-11 - first public release
2009-07-02 - bug fixed GetKeys() - the returned array is from correct type so no more
crash while copying the array
2009-06-05 - Nicolas Georges has recompiled libhashish without tree hashing algorithm to
let us use the BSD license
2008-09-01 - start of the project
PbniList
La liste chaînée est une autre structure absente de Powerbuilder. Je me suis appuyé sur les STL pour implémenter un objet de liste (uo_list
) et un vecteur (uo_vector
).
Mes listes et vecteurs ont quelques caractéristiques intéressantes :
- on peut ajouter au début, à la fin ou à la position de son choix
- la liste et le vecteur ont un itérateur intégré permettant un parcours dans les 2 sens
- les 2 structures sont triables (il faut indiquer à la méthode
sort()
un objet implémentant une fonction int list_compare(any, any)
permettant de comparer 2 éléments de la liste ou du vecteur
Extension pbnilist.zip (sources incluses) + sample PB de test - Dernière mise à jour : mardi 11 avril 2017.
ChangeLog
2017-03-31 - version 0.4.3 (copyright update)
- Added the demo application for PB125
2017-01-25 - fixed the settings for the PB12 version
- Added the PB125 and PB126 pbx
2015-03-26 - renamed insert() to inserthere()
2011-07-04 - Added the PB12 version
2011-07-03 - added a script to help the packaging and distribution
2011-06-28 - Backported the extension and the demo application to PB9,10,10.5
2011-02-04 - patch SetCorrectPBValue method to allow Object, Enum, Array and null values
(geni)
2010-11-10 - added the comparison function name to sort() method arguments : now we can
use any comparison function, as long as its signature is "int func(any a, any b)"
the returned value is like for the classical strcmp() : -1 if a<b, 0 if a=b, 1 if a>b
2010-05-01 - First public release
2010-02-16 - implemented the sort() methods for both list and vector
2010-02-12 - added the vector implementation + benchmarks
2010-02-02 - start of the project
PbniCW - Cool Wrappers
Voici plusieurs wrappers qui ne pouvaient pas être intégrés aux extensions précédentes.
Liste des fonctionnalités :
- accès en lecture aux ressources VersionInfo des .exe et .dll
GetVersionInfoString()
, GetVersionInfoFullString()
, GetVersionInfoFixed()
CWGetField()
/ CWSetField()
pour accéder à n'importe quelle propriété d'un objet ou contrôle graphique
RetrieveVarArgs()
permet de faire un retrieve
sur une Datawindow ou Datastore en passant les arguments dans un tableau de any (pratique pour écrire du code dynamique avec une DW dont on change le dataobject)
- Fonctions logiques pour unsigned longs
BitwiseOr()
, BitwiseXor()
, BitwiseAnd()
, BitwiseNot()
, BitwiseLeftShift()
, BitwiseRightShift()
- Converstions ulong -> string
ToHexString()
et ToOctalString()
- Spécial ASA : objet
uo_transaction
permettant de recevoir des notifications de la base, par exemple pendant l'ecécution d'une procédure stockée. Si vous voulez recompiler cette extension vous devez être en possession du SDK ASA.
Bugs connus
CWGetField()
sur une propriété qui n'existe pas fait planter PB
GetVersionInfoxxx()
sur l'application depuis elle-même fait planter PB
Extension pbnicw.zip (sources incluses) + sample PB de test - Dernière mise à jour : lundi 17 mai 2010.
ChangeLog
2010-05-17 - First public release
2009-09-25 - Bitwise manipulation functions, ToHEx(), ToOct()
added a #define for USE_ASA_ODBC
Bugfix RetrieveVaArgs when no arg in array + test from pbnicw.pbl
2009-09-24 - Message notification handler for asaodbc by Nicolas
2009-08-29 - Upgraded to PB 11.5.0.3127, RetrieveVaArgs by Nicolas Georges
2009-04-27 - Upgraded to PB 10.5.2.7826
2008-12-17 - Access to simplified version infos
2008-09-18 - start of the project, access to FixedVersionInfo
Autres composants - userobjects
unvo_regexp
unvo_regexp est un userobject natif qui remappe l'objet OLE vbscript.regex (auteur : Nicolas Georges). La syntaxe acceptée par l'objet est rappelée dans la liste des variables d'instance (c'est la syntaxe de l'objet vbscript.regex).
Si vous utilisez cet objet ponctuellement, c'est très pratique. Toutefois les performances ne sont pas fantastiques dès que vous instanciez l'objet dans des boucles du fait de la connexion à l'objet OLE dans le constructeur.
splitters
u_scilexer
Roland Smith a publié sur
Topwiz Software un contrôle PB permettant de wrapper l'éditeur
Scintilla. Avec l'aide de Nicolas Georges, j'ai ajouté des fonctionnalités permettant d'utiliser les icônes, la complétion de code et d'autres choses. Voici mon implémentation :
u_scilexer.sru (vous avez également besoin de la dll de scintilla, renommée "scilexer.dll").
Dernière mise à jour : dimanche 30 octobre 2011
n_zlib
n_zlib.sru : encore un composant de Roland Smith destiné à wrapper la
zlib pour PB. J'ai ajouté le support des flux gzippés à l'implémentation de Roland Smith.
Dernière mise à jour : mercredi 11 juin 2014
nv_codec_base64
nv_codec_base64.sru est une implémentation en pbscript d'un codec base64 (pour un problème de performance il y a une dépendance avec pbnicw pour les calculs binaires). Cependant l'encodage est relativement lent sur de grosses données, n'essayez pas de traiter des méga-octets...
Outils complémentaires
libexport
libexport est un petit outil que j'ai écrit pour tester l'export d'objets d'une pbl en PBScript.
On peut exporter la totalité des objets ou seulement une sélection. Les objets sont exportés au format UTF-16le avec leurs commentaires.
libexport.zip - Dernière mise à jour : vendredi 10 juin 2016
FILL ME: script perl check pbg
FILL ME: script perl dw
pbdumper
pbdumper est un outil expérimental permettant d'enregistrer la totalité du contenu d'une bibliothèque PB (pbl / pbd) ou d'un exe ou dll compilés par PB. Cet outil a été utilisé avec succès sur des fichiers produits par PB 5 à 11.5 et devrait fonctionner également avec PB12 si le format des pbl n'a pas changé. Je me suis servi de cet outil pour récupérer des ressources dans des applications écrites à mon travail et dont nous avions perdu les sources.
Il est programmé en C99 et compilé avec MinGW. Cet outil n'aurait pas pu exister sans les précieuses informations contenues dans le format de fichier PBL publié par Arnd Schmidt. Il a aussi fait quelques outils pour étudier les libs PB.
Todo :
pbdumper.zip - Dernière mise à jour : mardi 13 mars 2012
ChangeLog
2012-03-13 - (0.9.9) - bugfix newline export in source files headers
- bugfix library name display in list mode
- do not try to process directories (problem seen when processing *.pbl
and there is some lib.pbl-dump folders)
- refactor of the source code export
- added the --scc info to show the source control attributes of library entries
2012-02-21 - (0.9.8) - added the support for library entries with a path in the name
2012-01-12 - (0.9.7) - added the --debug to filter debug output + reworked the listing mode
2012-01-10 - (0.9.6) - added the --name for wildcard matching on objects names
2012-01-09 - (0.9.5) - fixed a stupid bug in the NOD* tree parsing
- added the --source-only option
- added the --list option
2011-11-05 - (0.9.4) - rewrote the command line parsing with getopt
- added a simulation parameter (--dry-run)
2011-10-26 - (0.9.3) - bugfixed the dump of ENT* blocks
- code rewritten in C99 instead of C++
- filter the output with a verbose switch
- can create a folder to dump the objects in
2009-10-26 - (0.9.2) improved the export of the pbscript source files
2008-10-22 - (0.9) initial release
2009-10-18 - proper export of the source files with header and comments
2008-10-24 - Initial prototype
Liens
- Nicolas Georges : l'auteur de la Datawindow Debug Machine, des auto-resizers et du projet Embedding Perl (pour scripter vos applis PB en perl)
- Roland Smith : propose de nombreux modules d'intégration d'outils tiers comme Scintilla, ou de composants comme les splitters...
- PowerToTheBuilder : propose quelques composants (payants) pour donner un coup de neuf à vos applications PB : fenêtres dockables, tab controls, auto filter pour datawindow...
- PBadonf un portail et des forums en Français sur PB