IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Comment récupérer un nombre codé en binaire


Sujet :

Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Comment récupérer un nombre codé en binaire
    Salut tout le monde
    J'essaye de lire un fichier contenant des valeurs numériques codées en binaire.
    Pour le faire j'ai choisi d'utiliser TfileStream pour pouvoir naviguer facilement dans le fichier.
    Le problème est que avec mes conaissances actuelles en programmation Delphi je suis incapable de transcrire dans une variable integer un nombre entier codé en deux bytes

    Voila ce que j'ai bricole


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Procédure TForm1.Button2Click(Sender: TObject);
     var
         Fichier_Stream : TFileStream;
         x_Bytes :Array of Byte;
     begin
    if opendialog1.Execute then begin
    Edit1.Text:=opendialog1.FileName;
    if not FileExists(Edit1.Text) then exit;
    memo1.clear;
    Application.ProcessMessages;
    Fichier_Stream := TFileStream.Create(Edit1.Text,fmOpenRead);
    SetLength(x_Bytes, 2);
    Fichier_Stream.Seek(0,soFromBeginning) ;
    Fichier_Stream.Read(x_Bytes[0],2);
    ///
    ///          Je bloque ici
    ///   Je souhaiterais, en faite, afficher dans ma memo1 la valeur en décimal de du nombre codée en 2 bytes  x_Bytes
    ///
     
    end;
    end;

    Quelqu’un aurait il un idée pour me débloquer



    Merci

  2. #2
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    en fait, je ne crois pas que les entiers codés sur 2 bits existent sous delphi,mais je ne suis pas un connaisseur en la matiere.
    On a les short sur 1 bits et les integer dont le conage depends du systeme (4 sous windows).

    Tu ne peux donc pas te baser sur la lecture d'un type predefini.
    Par contre, sans que cela soit trop complexe, tu peux lire 2 short de 1 bits que tu combone avec : N := S1*1024+S2.
    Verifie quand meme l'ordre dans lequel sont ecrit les bits dans le fichier (gauche a droite ou droite a gauche)

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 451
    Points
    28 451
    Par défaut
    oula ! c'est quoi ce mélange

    l'octet comprend 8 bits et prend les valeurs de 0 à 255

    sous Delphi c'est le "byte" (ou le CHAR pour les caractères)

    2 octets, 16 bits de 0 à 65535 c'est le "word"

    4 octets, 32 bits de 0 à $FFFFFFFF c'est le "cardinal"

    dans les versions signées nous avons respectivement shortint, smallint et integer (depuis Delphi 2, longint et integer sont équivalents)

    et finalement l'entier signé sur 64 bits : int64

    pour en revenir à la question initiale, il faut lire un WORD, qu'éventuellement il faut swapper (fonction SWAP) pour inverser l'ordre des deux octets (petit et grand indien)

  4. #4
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Oups !
    Desolé Grand maitre ... je m'incline devant votre savoir ....
    Le petit vermiseau que je suis a encore trop parlé


    Oui j'ai confondu Byte/bits/octets .... surement un reveil un peu trop brutal :p

    Smallint (2 octets c'est ca ?) : j'ai oublié
    Byte (1octet) Word (2octet) et DWord (4cotets) sont des types windows et la j'ai pas encore le reflex

    Donc je corrige mon post :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Var 
      FS : TFileStream;
      w : Word;
      smi : SmallInt;
    [..]
    FS.Read(w, SizeOf(DWORD));
    FS.Read(smi, SizeOf(SmallInt));
    Voila 2 solutions pour recuperer un entier codé sur 2 octets/Bytes (et non pas bits )

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Salut,
    Je viens de lire ces trois postes en réponse a ma question Merci pour toute ces précisions.

    Le retard de ma rection est expliqué par le décalage horaire. Je me connecte, enfaîte depuis Geoje Island en curée du sud.

  6. #6
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Voilà plus d'informations sur les types entier standarts que tu ne peux en imaginer :
    (ne faites pas attention au "native", ils le sont tous )
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Integer: TSepiIntegerType
      tkInteger;    native;     4 bytes-wide;    alignment: 4
    From -2147483648 to 2147483647 (signed)
    
    Cardinal: TSepiIntegerType
      tkInteger;    native;     4 bytes-wide;    alignment: 4
    From 0 to -1 (unsigned)
    
    Shortint: TSepiIntegerType
      tkInteger;    native;     1 bytes-wide;    alignment: 1
    From -128 to 127 (signed)
    
    Smallint: TSepiIntegerType
      tkInteger;    native;     2 bytes-wide;    alignment: 2
    From -32768 to 32767 (signed)
    
    Longint: TSepiTypeAlias
    -> Integer
    
    Int64: TSepiInt64Type
      tkInt64;    native;     8 bytes-wide;    alignment: 8
    From -9223372036854775808 to 9223372036854775807
    
    Byte: TSepiIntegerType
      tkInteger;    native;     1 bytes-wide;    alignment: 1
    From 0 to 255 (unsigned)
    
    Word: TSepiIntegerType
      tkInteger;    native;     2 bytes-wide;    alignment: 2
    From 0 to 65535 (unsigned)
    
    Longword: TSepiTypeAlias
    -> Cardinal

  7. #7
    Candidat au Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Clorish, sjrd,Paul TOTH, Grand merci pour le coup de posse, la solution proposee par Clorish a l'air de marcher.

    Thnx

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 581
    Points : 25 239
    Points
    25 239
    Par défaut
    Que contient ton fichier ? Que des Entiers non signé sur 2 Octet ?
    Si oui, ceci est possible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    var
       Fichier: file of Word;
       TmpWord: Word;
       i: Integer;
    begin
          AssignFile(Fichier, '...');
          Reset(Fichier); //
          try
             while not Eof(Fichier) do begin
                Read(Fichier, TmpWord);
                Working(TmpWord);
             end;
          finally
            CloseFile(Fichier);
          end;
       end;
    end;

  9. #9
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    plutot que de passer par une variable de type "File" il est preferable de le gerer par Stream dont le systeme de lecture/ecriture est plus puissant (sans etre forcemetn plus complexe )

  10. #10
    Candidat au Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Salut ShaiLeTroll,
    en faite mon fichier est compose d'une succession de messages. chaque message est compose d'un byte donnant la longeur du message en bytes et une sucession de nombres entiers codes en 2 bytes.

    enfaite j'arrive a mettre un byte dans buffer mais ce que je souhaite faire c'est de recuperer la valeur decimale de la representation binaire du nombre stockee dans les 2 bytes. c'est le contenue de ta procedure Working ().

  11. #11
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par amamisou
    en faite mon fichier est compose d'une succession de messages. chaque message est compose d'un byte donnant la longeur du message en bytes et une sucession de nombres entiers codes en 2 bytes.
    Donc Stream .....
    Les variables type file sont interessant pour les fichier a structrue redondante. Generalement File of <Type>

    Citation Envoyé par amamisou
    enfaite j'arrive a mettre un byte dans buffer mais ce que je souhaite faire c'est de recuperer la valeur decimale de la representation binaire du nombre stockee dans les 2 bytes. c'est le contenue de ta procedure Working ().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Var 
      FS : TFileStream;
      b : byte;  // 1 octet
      w : Word;  // 2 octets
    FS := TFileStream.Create(Filename, fmOpenRead);
    FS.Read(b, SizeOf(Byte));   
    For i := 0 to b div 2 do
      Begin
      FS.Read(w, SizeOf(Word)); 
      <Traitement>
      End;
    Apres delphi doit faire la conversion directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    i := w;  // i : Integer

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 581
    Points : 25 239
    Points
    25 239
    Par défaut
    Ah nombre variable ... Tu pourras voir ICI une unité qui permet de gérer un fichier d'un pseudo tableur, il lit l'entete (position axe XY, longueur donnée) puis lit la donnée ...

    Citation Envoyé par Clorish
    plutot que de passer par une variable de type "File" il est preferable de le gerer par Stream dont le systeme de lecture/ecriture est plus puissant (sans etre forcemetn plus complexe )
    Juste pour info, le THandleStream utilise la fonction FileRead qui utilise l'API ReadFile, le File of, utilise BlockIO qui par défaut utilise l'API ReadFile, mais il est vrai qu'il peut être pratique et "plus objet" de manipuler des Stream entre des fichiers et des sockets par exemple ... mais en terme de "puissance", la seule différence c'est les fichiers de plus de 4Go ... mais la vrai puissance est d'allié un TFileStream avec un TReader/TWriter pour avoir directement les Fonctions ReadInteger mais le fichier doit contenir le typage du champ à lire en entete de celui-ci, ce qui n'est pas ton cas pour ton fichier ... mais tu devrais songer à cela ...

  13. #13
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 451
    Points
    28 451
    Par défaut
    Citation Envoyé par amamisou
    Salut ShaiLeTroll,
    en faite mon fichier est compose d'une succession de messages. chaque message est compose d'un byte donnant la longeur du message en bytes et une sucession de nombres entiers codes en 2 bytes.

    enfaite j'arrive a mettre un byte dans buffer mais ce que je souhaite faire c'est de recuperer la valeur decimale de la representation binaire du nombre stockee dans les 2 bytes. c'est le contenue de ta procedure Working ().
    dans ce cas je ferais une fonction ReadValues...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    type
     TValues=array of word;
     
    function ReadValues(Stream:TStream; var Values:TValues):byte;
    begin
     Stream.ReadBuffer(Result,SizeOf(Result));
     if Result>0 then begin
      SetLength(Values,Result);
      Stream.ReadBuffer(Values[0],Result*SizeOf(word));
     end;
    end;
    efin en supposant que les valeurs sont traitées par la suite...

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 581
    Points : 25 239
    Points
    25 239
    Par défaut
    Entièrement d'accord avec Paul TOTH, une fonction clairement limité à la lecture d'un ensemble cohérent de données ... j'allais écrire la même chose mais comme ceci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    type
      TXXXSeries = Types.TWordDynArray;
      TXXXFileStream = class(TFileStream)
         function ReadSeries(var Series: TXXXSeries): Byte;
      end;
     
    function TXXXFileStream.ReadSeries(var Series: TXXXSeries): Byte;
    begin
      if Read(Result, SizeOf(Result)) = SizeOf(Result) then
      begin
        SetLength(Series, Result);
        if Result > 0 then
          if Read(Series[0], Result * SizeOf(Word)) <> Result then
            raise EReadError.Create('...');
      end
      else
        raise EReadError.Create('...');
    end;
     
    procedure TFrmTestFichier.BtnReadByStreamClick(Sender: TObject);
    var
      Series: TXXXSeries;
    begin
      with TXXXFileStream.Create('...', fmOpenRead	) do
        try
          ReadSeries(Series);
        finally
          Free();
        end;
    end;
    avec XXX le nom/version du type de Fichier, genre ExcelV7, WordV9, PDFV8, JPGV1, ...

  15. #15
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Hum..... bien vu
    Et je suppose que cela marche aussi sur des Packed Record ....

  16. #16
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 581
    Points : 25 239
    Points
    25 239
    Par défaut
    Pour un fichier, il est vivement conseillé d'utiliser un Packed Record, pour éviter toute "erreur" d'optimisation ... de plus un Packed Record est plus condensé qu'un record aligné sur 2,4 ou 8 octet, ce qui fait donc moins de données à lire/écrire sachant que les spares d'alignement sont des bytes inutiles ...

  17. #17
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par ShaiLeTroll
    Pour un fichier, il est vivement conseillé d'utiliser un Packed Record, pour éviter toute "erreur" d'optimisation ... de plus un Packed Record est plus condensé qu'un record aligné sur 2,4 ou 8 octet, ce qui fait donc moins de données à lire/écrire sachant que les spares d'alignement sont des bytes inutiles ...
    Oui ca je sais
    Mais je parlais des packed record pour ecrire en bloc une serie de données heterogenes.
    Jusqu'a present, je lit les donnees une a une pour les stocker dans des variable record et vice versa.

  18. #18
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 581
    Points : 25 239
    Points
    25 239
    Par défaut
    ah oui, effectivement, tu connais à l'avance le nombre d'item grace à l'entête donc aucun soucis pour tout lire d'un coup, ... tient par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    type
      TPageParams = record // j'aurais pu mettre packed mais comme 8+8+4+4 ça s'aligne toujours pareil sur 2, 4 ou 8, je ne l'ai pas mis ... 
        PageWidthcm: Double;
        PageHeightcm: Double;
        PageWidthPixel: Integer;
        PageHeightPixel: Integer;
      end;
     
    procedure TfParametres.WriteParams(AStream: TStream);
    var
      Params: TPageParams;
    begin
      if Assigned(AStream) then
      begin
        Params.PageWidthcm := EdPageWidthcm.FloatValue;
        Params.PageHeightcm := EdPageHeightcm.FloatValue;
        Params.PageWidthPixel := EdPageWidthPixel.Value;
        Params.PageHeightPixel := EdPageHeightPixel.Value;
        AStream.Size := SizeOf(Params);
        AStream.Seek(0, soFromBeginning);
        AStream.WriteBuffer(Params, SizeOf(Params));
      end;
    end;
     
    procedure TfParametres.ReadParams(AStream: TStream);
    var
      Params: TPageParams;
    begin
      if Assigned(AStream) then
      begin
        if AStream.Size = SizeOf(Params) then
        begin
          AStream.Seek(0, soFromBeginning);
          AStream.ReadBuffer(Params, SizeOf(Params));
        end else
          ZeroMemory(@Params, SizeOf(Params));
     
        EdPageWidthcm.FloatValue := Params.PageWidthcm;
        EdPageHeightcm.FloatValue := Params.PageHeightcm;
        EdPageWidthPixel.Value := Params.PageWidthPixel;
        EdPageHeightPixel.Value := Params.PageHeightPixel;
      end;
    end;

  19. #19
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Attention tout de même à ne surtout pas faire cela pour les types qui requièrent une initialisation. A savoir les AnsiString, WideString, types interface, types tableau dynamique, types record dont au moins un champ requiert une initialisation, et types tableau statique dont les éléments requièrent une initialisation.

    Edit : et types Variant aussi

  20. #20
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par sjrd
    Attention tout de même à ne surtout pas faire cela pour les types qui requièrent une initialisation. A savoir les AnsiString, WideString, types interface, types tableau dynamique, types record dont au moins un champ requiert une initialisation, et types tableau statique dont les éléments requièrent une initialisation.

    Edit : et types Variant aussi
    Je generaliserais en fait a tous types a base d'adresses
    Tu sauvegarde l'adresse memoire ou est stocké la donnée et non le contenu de la variable .....

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/12/2006, 09h39
  2. Comment récupérer le nombre d'enregistrements effacés ?
    Par Jérôme Lambert dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/10/2006, 09h22
  3. Réponses: 3
    Dernier message: 17/08/2006, 12h03
  4. Réponses: 6
    Dernier message: 14/06/2006, 16h55
  5. Réponses: 1
    Dernier message: 08/11/2005, 14h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo