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

Langage Delphi Discussion :

EAccessViolation


Sujet :

Langage Delphi

  1. #1
    Membre régulier

    Étudiant
    Inscrit en
    Août 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 108
    Points : 124
    Points
    124
    Par défaut EAccessViolation
    Bonjour à tous, et a toutes

    Dans mon projet j'ai une application client et une serveur qui communique via les composants IdTCPServer et IdTCPClient de Indy 10.

    Dans une Unit commune j'ai déclarer un enregistrement que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      TServerInfos = packed record
        Name, Language: String[32];
        PwdStr: String[8];
        HasPwd: Boolean;
        Players: TPlayersArray;
        NbPlayers, MaxPlayers: Shortint;
        Comments: String[255];
        Logo: TPicture;
      end;

    Ici c'est le code du serveur qui envoi au client cette enregistrement

    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
     
      with SrvInfos do begin
        Name := edit_ServerName.Text;
        Language := cbx_language.Text;
         ....
        Logo := TPicture.Create;
        Logo.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Logos\logo.bmp'); //pas de pb, j'ai meme vérifier avec un TImage (Image1.Picture := Logo, ca marche bien
      end;
      { Envoi des données au client }
      with TCPClient_SrvInfos do
      begin
        try
          try
            Host := '127.0.0.1';
            Connect;
            IOHandler.Write(RawToBytes(SrvInfos, SizeOf(TServerInfos)));
          except
            ShowMessage('Err de communication...');
          end;
        finally
          Disconnect;
        end;
      end;
    Du coté de l'application client je récupère les données....
    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
     
    procedure TClientMainForm.TCPServer_SrvInfosExecute(AContext: TIdContext);
    var
      ABuffer: TIdBytes;
      s: Smallint;
     
    begin
      { Récupération des infos du serveur }
      s := SizeOf(TServerInfos);
      SetLength(ABuffer, s);
      AContext.Connection.IOHandler.ReadBytes(ABuffer, s, False);
      Move(ABuffer[0], SrvInfos, s);
     
      { Affichage des données }
      with SrvInfos do begin
        lbl_ServerName.Caption := Name;
        lbl_Language.Caption := Language;
        lbl_Capacity.Caption := IntToStr(NbPlayers)  + ' sur ' + IntToStr(MaxPlayers);
        try
          image_Logo.Picture := Logo; { c'est ici que ca bug }
        except
          image_Logo.Picture.Bitmap.Empty;
        end;
      end;
    end;
    J'arive à récupérer toutes les données (String, Integer, Bool...) mais qd je veux utilisé l'objet Logo j'ai une erreur EAccessViolation.
    J'ai fait un projet vierge en utilisant la meme syntaxe mais avec juste l'envoi d'un TPicture et ca marche nikel mais dans mon projet si je remplace TServerInfos par TPicture et donc que j'envoi uniquement l'image ca ne fonctionne pas non plus! Ca fait plusieurs jours que je bloque et je vois pas d'où viens le pb.

    HELP !!!!

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Le problème vient de ce que, contrairement aux autres éléments du record TserverInfo, un Logo est la référence à un objet Tpicture (c'est à dire en interne un simple pointeur vers l'instance de l'objet).

    Donc, ce qui est passé d'une appli à l'autre est un pointeur inutilisable et non pas le contenu de l'objet et il est impossible de "cloner" aussi simplement des objets d'une application à une autre.

    Une solution consisterait :
    - à sauvegarder l'image par une instruction "logo.saveto" dans un "tstringstream",
    - passer via la liaison IP le contenu "datastring" de la tstringstream
    - le récupérer le contenu dans l'appli2,
    - l'affecter à un tstringstream (ne pas oublier le create),
    - créer le Tpicture Logo dans l'appli 2,
    - charger l'image depuis le tstreamgrid via une instruction "Logo.loadfrom"

  3. #3
    Membre régulier

    Étudiant
    Inscrit en
    Août 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 108
    Points : 124
    Points
    124
    Par défaut
    Arf, ca m'arange pas de faire comme ça... De plus c'est bizare car voici le source d'un test ou je fait passer mon TPicture et là ca marche nickel
    meme qd je lance deux instance de l'application avec une qui envoi et l'autre qui recoi ( ds le cas présent l'application s'envoi l'image à elle meme mais passe par des variables locales)

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IdCustomTCPServer, IdTCPServer, IdBaseComponent,
      IdComponent, IdTCPConnection, IdTCPClient, IdGlobal, IdContext, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        IdTCPClient1: TIdTCPClient;
        IdTCPServer1: TIdTCPServer;
        Button1: TButton;
        Image1: TImage;
        procedure IdTCPServer1Execute(AContext: TIdContext);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      B: TPicture;
    begin
      B := TPicture.Create;
      B.LoadFromFile('C:\logo.bmp');
      with IdTCPClient1 do begin
        Host := '127.0.0.1';
        Connect;
        IOHandler.Write(RawToBytes(B, SizeOf(TPicture)));
        Disconnect;
      end;
    end;
     
    procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
    var
      Buffer: TIdBytes;
      P: TPicture;
    begin
      SetLength(Buffer, SizeOf(TPicture));
      AContext.Connection.IOHandler.ReadBytes(Buffer, SizeOf(TPicture), False);
      Move(Buffer[0], P, SizeOf(TPicture));
      image1.picture := P;
    end;
     
    end.
    Allez comprendre...

  4. #4
    Membre régulier

    Étudiant
    Inscrit en
    Août 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 108
    Points : 124
    Points
    124
    Par défaut
    Hum en faite non ca marche pas si bien que ca quand je sépare complétement les 2 appli... Bon je vais donc me résilier à essayer ta solution. Merci beaucoup !

Discussions similaires

  1. Destruction d'objet (.free) >> EAccessViolation
    Par monstroplante dans le forum Langage
    Réponses: 7
    Dernier message: 08/11/2005, 20h19
  2. Message d'erreur Eaccessviolation
    Par Oluha dans le forum Bases de données
    Réponses: 2
    Dernier message: 04/11/2005, 13h59
  3. Traquer une EAccessViolation
    Par cedricgirard dans le forum Langage
    Réponses: 4
    Dernier message: 03/11/2005, 17h27
  4. EAccessViolation à l'affichage d'une fiche
    Par chleuh dans le forum Langage
    Réponses: 6
    Dernier message: 20/06/2005, 16h44
  5. Erreur EACCESSVIOLATION avec des compsts créés dynamiquement
    Par tsikpemoise dans le forum Bases de données
    Réponses: 4
    Dernier message: 28/02/2004, 19h05

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