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 :

'USES' un dpr ?


Sujet :

Delphi

  1. #1
    Membre régulier
    Profil pro
    Directeur
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    Points : 87
    Points
    87
    Par défaut 'USES' un dpr ?
    Bonjour à tous,

    J'ai développé une application en GUI utilisant un thread (unit2). Pour la synchronisation et l'échange de données, j'ai utilisé une "critical section" dans unit1. Unit1 utilise (uses) unit2 et inversement. Jusque là, pas de problème.

    J'ai voulu adapté ce programme en application console.
    Dans le main.dpr:
    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
    type
      TMyClass = class(TComponent)
        procedure createthread;
      private
        fHWnd: HWND;
        Closing: boolean;
        FStringSectInit: boolean;
        FScanThread: TScan;
        FStringBuf: TStringList;
        procedure HandleNewData(var Message: TMessage); message WM_DATA_IN_BUF;
      public
        StringSection: TRTLCriticalSection; // -----> Critical section qui était dans unit1 dans le GUI et qui est maintenant dans main.dpr
        property StringBuf: TStringList read FStringBuf write FStringBuf;
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
        procedure run;
    end;
     
    var Application: TMyClass;
    Dans unit2, j'utilise cette critical section:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EnterCriticalSection(Application.StringSection);
    A la compil:
    [Error] Unit2.pas(126): Undeclared identifier: 'Application'

    Logique, unit2 n'utilise (uses) pas main.dpr où est déclaré Application.

    Quelqu'un pourrait me dire comment faire pour régler ce problème ?

  2. #2
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Déclarer TMyClass et tous ses membres dans une troisième unité unit3, référencée dans unit1 et unit2 ? Non ?

  3. #3
    Membre régulier
    Profil pro
    Directeur
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    Points : 87
    Points
    87
    Par défaut
    (unit1 n'existe pas dans le prog en console, c'est main.dpr.)

    J'y ai pensé mais j'ai aussi pensé à un problème: disons que je déclare toute ma classe et ses fct/proc dans myclass.pas, "var Application: TMyClass" reste dans main.dpr et donc non-accessible par unit2, non?


    //edit: j'ai testé, avec et sans la déclaration de Application dans myclass.pas, ca fonctionne toujours pas.

    Main.dpr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    program TEST;
     
    {$APPTYPE CONSOLE}
     
    uses
      SysUtils,
      Unit2,
      Unit1;
     
    begin
      Unit1.Main;
    end.

    Unit1.pas (MyClass.pas dans l'exemple que je prends plus haut)
    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
    unit Unit1;
    
    interface
    
    uses Messages, Windows, SysUtils, Classes, Erazerz, unit2;
    
    const  WM_DATA_IN_BUF = WM_APP + 1000;
            NbThreads = 50;
    
    type
      TMyClass = class(TComponent)
      private
        fHWnd: HWND;
        Closing: boolean;
        FStringSectInit: boolean;
        FScanThread: TScan;
        FStringBuf: TStringList;
        procedure HandleNewData(var Message: TMessage); message WM_DATA_IN_BUF;
      public
        StringSection: TRTLCriticalSection;
        property StringBuf: TStringList read FStringBuf write FStringBuf;
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
        procedure run;
        procedure GetIpList(filename: string);
        procedure createthread;
    end;
    
    implementation
    
    var Application: TMyClass;
        IpList: TStringList;
    
    ...BLABLA des fonctions...
    
    procedure Main;
    begin
      Application := TMyClass.Create(nil);
      Application.run;
      If ParamCount <> 0 then Application.GetIpList(ParamStr(1)) else writeln('No ip list specified');
      Application.createthread;
      Application.Free;
    end;
    
    end.

    Unit2.pas (celle du thread):
    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
    
    unit Unit2;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Classes, winsock, shellapi;
    
    type
      TScan = class(TThread)
      private
        { Private declarations }
        FStartIP:string;
        function isVuln(IP: string; var vuln: string): boolean;
        function INetAddr(const Host:string):integer;
      protected
        procedure Execute; override;
      public
        property StartIP: string read FStartIP write FStartIP;
      end;
    
    ... BLABLA des const...
    
    implementation
    
    uses unit1;
    
    ... BLABLA mes fonctions...
    
    procedure TScan.Execute;
    var
      CurrentIP, Vulnurl: string;
    begin
      CurrentIP := FStartIP;
        if isVuln(CurrentIP, VulnURL) then
        begin
          EnterCriticalSection(Application.StringSection); //<< PROBLEME !!!
          Application.StringBuf.Add(VulnURL);
          LeaveCriticalSection(Application.StringSection);
          PostMessage(Application.Handle, WM_DATA_IN_BUF, 0, 0);
        end;
    end;
    end.
    Et toujours: [Error] Unit2.pas(128): Undeclared identifier: 'Application'

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 857
    Points : 11 291
    Points
    11 291
    Billets dans le blog
    6
    Par défaut
    TApplication est déclarée dans l'Unit Forms...
    pas de fiche, pas d'appli !

    il y a d'autres types de variables Application, pê l'un adapté aux applis console : regarde avec F1
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre régulier
    Profil pro
    Directeur
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    Points : 87
    Points
    87
    Par défaut
    Application n'est pas un TApplication, c'est un TMyClass que j'ai déclaré à la main.

  6. #6
    Membre habitué Avatar de neodelphi2007
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 202
    Points : 179
    Points
    179
    Par défaut
    Je pense qu'il y a trois problèmes:

    1. tu déclare Application dans l'implementation de ton unité Unit1, donc inaccessible aux autres unités;
    2. La variable Application doit être réservée par Delphi ; pourquoi pas AppConsole ?
    3. Mettre ta variable Application (AppConsole) dans l'interface de ton unité Unit1;

  7. #7
    Membre régulier
    Profil pro
    Directeur
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    Points : 87
    Points
    87
    Par défaut
    J'ai changé Application de place (interface) et renommé, en effet ça fonctionne.
    Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de compilation après modification du Uses
    Par DevelOpeR13 dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 14h23
  2. [langage] pb avec use strict ;
    Par la bille dans le forum Langage
    Réponses: 5
    Dernier message: 22/12/2003, 16h44
  3. [web] use CGI.pm
    Par martijan dans le forum Web
    Réponses: 18
    Dernier message: 09/09/2003, 14h11
  4. "use may clash"
    Par Jibees dans le forum Modules
    Réponses: 4
    Dernier message: 15/05/2003, 16h27
  5. Connaitre l'unitée à ajouter dans USES
    Par DelphiCool dans le forum Langage
    Réponses: 7
    Dernier message: 01/08/2002, 13h48

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