Lost in the matrix

C/C++/C#/Java, Multithreading


1) Lancer Crystal Reports XI

2) Créer un nouveau rapport vide

3) Cliquer sur l'icône "Insérer une image"

4) Sélectionner une image arbitraire

5) Placer l'image

6) Ajouter un nouveau paramètre correspondant au chemin du fichier image

7) Ajouter un paramètre de type de "Chaîne", ici nommé "Image"

8) Clique droit sur l'image, puis cliquer sur "Mettre en forme le graphique"

9) Cliquer sur le bouton "formule" (X+2)


10) Mettre la formule "{?Image}" ou "Image" est le nom du paramètre

---
Il ne reste plus qu'a tester le modèle.

Ceci est une version très basique de la fonction Ping.
Elle ne gère pas tous les cas, mais je vais poster une version améliorée bientôt.

#include <winsock2.h>
#include <Ipexport.h>
#include <icmpapi.h>

#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")

int IsPingable(const char *host, int timeout)
{
 IP_OPTION_INFORMATION ioi;
 ICMP_ECHO_REPLY       ier;
 LPHOSTENT             Host;
 WSADATA               wsaData;
 IN_ADDR               iaAddr;
 HANDLE                hIcmp;

 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
 {
  WSACleanup();
  return (0);
 }
 iaAddr.s_addr = inet_addr(host);
 if (iaAddr.s_addr == INADDR_NONE)
  Host = gethostbyname(host);
 else
  Host = gethostbyaddr((char *)&iaAddr, sizeof(IN_ADDR), AF_INET);
 if (Host == NULL)
 {
  WSACleanup();
  return (0);
 }
 hIcmp = IcmpCreateFile();
 ioi.Ttl = 255;
 ioi.Tos = 0;
 ioi.Flags = 0;
 ioi.OptionsSize = 0;
 ioi.OptionsData = NULL;
 IcmpSendEcho(hIcmp, *(DWORD *)(*Host->h_addr_list), NULL, 0, &ioi, &ier, sizeof(ICMP_ECHO_REPLY), timeout);
 IcmpCloseHandle(hIcmp);
 WSACleanup();
 return (ier.Status == 0);
}
Exemple:
int main(int argc, char **argv)
{
 printf("IsPingable : %d\n", IsPingable("clustrmaps.com", 5000));
 getchar();
 return (EXIT_SUCCESS);
}

Aujourd'hui, je suis tombé sur un problème avec le contrôle PropertyGrid, car je voulais éditer les propriétés d'un objet ainsi que ses sous-objets. Toutefois, j'ai eu quelques soucis, car la PropertyGrid ne permet pas (de base) d'éditer les sous-objets et ceux-ci apparaissent grisés.

Voici mon code:

using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication
{
    public partial class PropertyGridTest : Form
    {
        public PropertyGridTest()
        {
            InitializeComponent();
            this.propertyGrid1.SelectedObject = new Car();
        }
    }

    public class Driver
    {
        public string Name { get; set; }
        public bool HasDriverLicence { get; set; }
    }

    public class Car
    {
        public Car()
        {
            this.Driver = new Driver()
            {
                Name = "Johannes Fetz",
                HasDriverLicence = false
            };
            this.Color = Color.Red;
            this.Kind = "Sedan";
        }

        public string Kind { get; set; }
        public Color Color { get; set; }
        public Driver Driver { get; set; }
    }
}
qui donne le résultat suivant:
Après quelques recherches, j'ai trouvé comment résoudre ce problème. En effet, il suffit d'indiquer à la PropertyGrid que "Driver" est un objet "Expandable". Pour cela, il faut ajouter un using :
using System.ComponentModel;
et un attribut au dessus de la classe "Driver" :
[TypeConverterAttribute(typeof(ExpandableObjectConverter))]
public class Driver
{
Ce qui donne le résultat suivant:

Voici une petite démonstration d'une implémentation des delegates que j'ai fait en langage C :)
Dans ce code, une fonction est déclarée en locale avec un nom unique, composé du mot
"__delegate__" et du numéro de la ligne courrante (__LINE__). Puis, l'adresse est stockée
dans la variable de l'utilisateur sous forme d'un pointeur sur fonction de type "Delegate".

#include <stdio.h>

#define CONCAT2(s1, s2) s1##s2
#define CONCAT(s1, s2) CONCAT2(s1, s2)
#define NewDelegate(Ptr, Expr) void \
        CONCAT(__delegate__, __LINE__)() Expr \
        Ptr = (Delegate)&CONCAT(__delegate__, __LINE__)

typedef void (*Delegate)(void);

void    PseudoDelegateTest()
{       
        int  i;
        Delegate my_delegate;

        NewDelegate(my_delegate,
        {
           printf("i = %d\n", i);
        });

        for (i = 0; i < 5; ++i)
            my_delegate();
}

int main(int argc, char **argv)
{
  PseudoDelegateTest();
  getchar();
  return (0);
}


Cela fait pas mal de temps que je m'intéresse à cet éditeur dont les possibilités sont infinies. En effet, j'ai eu l'occasion grâce à un ami, de le voir à l'oeuvre. Toutefois, il n'est pas toujours évident d'utiliser un autre éditeur quand on est habitué à un autre (personnellement j'utilise Emacs). Cet éditeur offre réellement une plus-value pour celui qui le maîtrise. Notamment grâce à son système de macros très bien pensé. Ainsi, j'ai appris les commandes de base et j'ai rédigé un document avec la liste des commandes élémentaires pour commencer avec Vim.


Voici le lien vers le document complet (pdf ou txt) : Commandes élémentaires de Vim


Lien vers le site officiel de Vim : www.vim.org

A la place de :

ConnectionInfo crConnectionInfo = new ConnectionInfo();
crConnectionInfo.Type = ConnectionInfoType.SQL;
crConnectionInfo.ServerName = "ODBCsource";
crConnectionInfo.DatabaseName = "DataBase";
crConnectionInfo.UserID = "Login";
crConnectionInfo.Password = "Password";
foreach (CrystalDecisions.CrystalReports.Engine.Table tmpTable in doc.Database.Tables)
{
     tmpTable.LogOnInfo.ConnectionInfo = crConnectionInfo;
     tmpTable.ApplyLogOnInfo(tmpTable.LogOnInfo);
     tmpTable.Location = tmpTable.Name;
}
Il suffit de faire :
doc.DataSourceConnections[0].SetConnection("ODBCsource", "DataBase", "Login", "Password");
doc.Refresh();
Où la variable "doc" est du type "ReportDocument".
Attention j'ai pris l'index 0 dans "DataSourceConnections" à titre d'exemple.
La valeur peut changer en fonction du modèle.

Voici une petite astuce dont je ne vois pas l'utilité immédiate, mais qui peut intéresser certain.

public int this[string val1, string val2]
{
    set
    {
       Console.WriteLine("{0} - {1}", val1, val2);
    }
}