mercredi 27 juin 2012

Clipper: Comment installer Harbour sous Ubuntu

Voici un article qui explique comment:
  • Installer les sources de Harbour
  • Le compiler
  • Compiler le premier programme clipper
SOUS UBUNTU.

Je n'ai pas encore testé cette référence... mais c'est toujours bon à prendre
http://www.elart.it/links/harbourhowto_deb_en.php

mercredi 13 juin 2012

Un utilitaire pour compresser des PDF sous Ubunu (dans Nautilus)

Voici un petit script qui permet d'installer facilement un utilitaire de compression de fichier PDF.

sudo apt-get install zenity ghostscript
mkdir -p ~/.gnome2/nautilus-scripts
cd ~/.gnome2/nautilus-scripts
rm "Compress PDF" #in case you're using an older version
wget http://launchpad.net/compress-pdf/1.x/1.4/+download/Compress-PDF-1.4.tar.gz
tar zxvf Compress-PDF-1.4.tar.gz && rm Compress-PDF-1.4.tar.gz


Cet utilitaire est disponible dans le menu contextuel du Nautilus.
Simple d'emploi donc :-)

Credits for this script (and many thanks!): Ricardo Ferreira
 
Source:

mardi 12 juin 2012

Clipper: Définition des classes en Harbour

La documentation Harbour reprend bien des informations relative à la définition des classes.
Si vous trouverez des exemples dans le guide de référence Harbour, ce dernier ne contient pas d'exemple d'implémentation (Erreur HTTP 404).

Références de base
Voici un petit récapitulatif d'information:
  • CLASS - Définition de la classe (incluant les objets de données et les méthodes) (guide de référence)
  • DATA - Définition des données de la classe (guide de référence)
  • METHOD - Définition des méthodes de la classe (guide de référence).
Exemple d'implémentation
Voici un exemple partiel d'implémentation de classe issu des sources d'Harbour (fichier drawimg.prg)
CLASS wPaintObj FROM wGUIObj
   * image like wvtimage
   DATA cImage
   DATA lTransp

   METHOD New()
   METHOD Draw()
   METHOD Undraw()
   METHOD Hide()
   METHOD Show()
ENDCLASS //wPaintOBJ

METHOD New(nWinNum, nType, cId, nRow1, nCol1, nRow2, nCol2, aOffTLBR, lTransp) CLASS wPaintObj
   default aOffTLBR to {0,0,0,0}
   default lTransp to .f.

   ::nWinNum := nWinNum
   ::lVisible := .t.

   ::nType := nType
   ::cId := cId
   ::nRow1 := nRow1
   ::nCol1 := nCol1
   ::nRow2 := nRow2
   ::nCol2 := nCol2

   if !(valtype(aOffTLBR)=="A")
      aOffTLBR := {0,0,0,0}
   endif

   ::aOffTLBR := aclone(aOffTLBR)

   ::lTransp := lTransp
RETURN Self

METHOD Draw() CLASS wPaintObj
   if !::lVisible
      return NIL
   endif

   do case
      case ::nType==WPAINTOBJ_IMAGE
         if !empty(::cImage)
            WVW_DRAWIMAGE( ::nWinNum, ::nRow1, ::nCol1, ::nRow2, ::nCol2, ;
                           ::cImage, ::aOffTLBR, ::lTransp )
         endif

      otherwise
         * lBoxErrMessage()
   endcase

RETURN NIL  //DRAW()


Et cet exemple est accompagné du code utilisant cette classe

oWPaint := wPaintObj():New(0, WPAINTOBJ_IMAGE, "TOPLEFT", ntop+1, nleft+1, nmidver-1, nmidhor-1, NIL, ltransp)
oWPaint:cImage := cpict


Constructeur New
Une classe contient généralement un constructeur (appelé New).
Ce dernier retourne une référence vers l'instance de la classe nommé Self

Self et ::
Dans la définition (et l’implémentation) d'une classe, Self fait référence à l'instance de la classe (un objet donc).
Self dispose aussi d'une notation raccourcie qui est ::

Classe et Héritage
Voici un autre exemple qui démontre l'utilisation de l'héritage des classes en Harbour.
Cet exemple est issus de classinh.ch (dans les sources de Harbour)

/*
 * $Id: clasinh.prg 2186 2000-02-14 08:11:56Z vszel $
 */

#include "hbclass.ch"

function main()
   local oObject, oBase
   oObject := TAnyClass():New()
   oBase := TClassBase():New()
return nil

class TClassBase
   method New()
   method Test() INLINE Alert( "Test" )
endclass

method New() class TClassBase
return Self

class TAnyClass from TClassBase
   method New()
endclass

method New() class TAnyClass
   super:New()
   super:Test()
return Self

lundi 11 juin 2012

Clipper: Réference Clipper/Harbour

Besoin de faire du clipper mais vous manquez de référence?
Voici quelques liens vraiment utiles:

Clipper: Integration de la souris sous Harbour

Aussi simple que:

  // enable mouse events in CL53/Harbour
  set( _SET_EVENTMASK, INKEY_ALL )
  mSetCursor( .t. ) 

Pour avoir un exemple plus complet sur le test souris, je vous propose la lecture de:
Source:

Clipper: Comprendre les CodePage & Unicode en Harbour

Voici un excellent Article sur le sujet:
J'y ai trouvé de nombreuses réponses.

jeudi 7 juin 2012

Clipper: Conversion Dos-Windows avec Harbour

Introduction
Porter et maintenir un ancien soft Clipper sous Harbour c'est aussi faire face à quelques problèmes de conversions. Argf.

En effet, votre vieux logiciel fonctionne sous un environnement "Dos" (même si c'est Compiler avec Harbour pour être compatible avec Win7) et répond donc à la codification DOS.

Nous avons par exemple un produit qui est du "2.5 mm²"... il s'affiche très bien dans l'application Clipper... mais une fois exporté vers Excel ou imprimé sur une étiquette code barre (vie OleAutomation avec Harbour) notre beau "2.5 mm²" (sous Dos) devient "2.5mmÿ" (sous Windows).

Il faut avouer que c'est un peu "vilain".
Ce qu'il faudrait, c'est convertir notre  "2.5 mm²" Dos en "2.5 mm²" Windows!

Conversion de chaine de caractère entre Dos-Windows
C'est en fouillant sur le net que je découvre l'existence de OemToCharA et CharToEomA dans la bibliothèque User32.
OemToCharA est utilisé pour convertir une chaine de caractère Dos -> Windows.
CharToOemA est utilisé pour convertie une chaine de caractère Windows -> Dos.
Ces deux articles suivants furent une source d'inspiration salvatrice
Conversion Dos-Windows en Clipper (Harbour Project)
Armé de ces information je fais des recherches dans le répertoire de Harbour Project et je trouve une relation entre "CharToEom" et "OemToAnsi" (humm intéressant).
En faisant une nouvelle rechercher sur "OemToAnsi" dans les source d'Harbour je trouve alors l'exemple suivant dans DbfToPg.PRG:
oRecord:FieldPut( i, hb_oemtoansi( cValue ) )

HOURRA!!!!!!

La mise en pratique de la fonction hb_oemtoansi() me permet d'imprimer immédiatement mes étiquettes code-barre (sous imprimante Windows) avec une conversion correcte de mon "²" de Dos vers Windows :-)
Pour résumer donc:
  • HB_OEMTOANSI() conversion Dos -> Windows
  • HB_ANSITOOEM() conversion Windows -> Dos