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 :

Procedure et procedure (TObjet) Aide svp


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Procedure et procedure (TObjet) Aide svp
    Bonjour,

    Mon problème est le suivant: j'ai une procédure simple non "objet" qui doit faire appel à une procédure (ASender: TObject). J'ai ajouté le nom de la "form"suivi d'un point, D7 ne détecte pas d'erreur à la compilation, mais donne une erreur lors de l’exécution. voici une partie du code:

    Merci d'avance pour votre aide.

    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
     var
      FormPhidget: TFormPhidget;
     
     //AdressIp : string[16];
      //portChar : integer;
      IO        : ARRAY[1..MaxIOchannel] OF Boolean;
      DAC       : ARRAY[1..MaxDACchannel] OF Integer;
      AD        : ARRAY[1..MaxADchannel] OF Integer;
      DA        : ARRAY[1..MaxDAchannel] OF Integer;
      InputDevice :ARRAY[1..MaxIOchannel] OF TIOdevice;
      OutputDevice:ARRAY[1..MaxIOchannel] OF TIOdevice;
      NumPhidgetInterfaceKit: byte;
     
      PROCEDURE SetIOchannel(Channel_no: TIOchannel);
      PROCEDURE ClearIOchannel(Channel_no: TIOchannel);
       {6 BIT DAC CONVERTER PROCEDURES}
      PROCEDURE OutputDACchannel(Channel_no: TDACchannel ; Data: Integer);
      PROCEDURE ClearDACchannel(Channel_no: TDACchannel);
      PROCEDURE SetDACchannel(Channel_no: TDACchannel);
     
     
    implementation
     
    {$R *.dfm}
     
    {	Set one IO channel and update the 'IOdata' & 'IO' array.
    	--------------------------------------------------------
    }
    procedure TFormPhidget.SetIoChanelClick(Sender: TObject);
    begin
    SetIOchannel(10);
     
    end;
     
     
    PROCEDURE SetIOchannel(Channel_no: TIOchannel);
    var
    I, X, Y: byte;
    BEGIN
    	{Calculate module no}
     for I:=1 to 6 do begin
      if (OutputDevice[I].Actif) and (Channel_no >= OutputDevice[I].StartIO)
          and (Channel_no >= OutputDevice[I].EndIO) then
           begin
            X:=OutputDevice[I].Module;
            Y:=Channel_no-OutputDevice[I].StartIO-1;
     :fleche:   TPhidgetInterfaceKit(FormPhidget.findComponent('PhidgetInterfaceKit'
            +IntToStr(X))).OutputState[Y]:=true;
          	{Data for correct IOchannel to set}
            IO[Channel_no]:=true;
      :fleche:   FormPhidget.Memo1.Lines.Add('IO['+IntToStr(Channel_no)+'] = true');
          end;
      end;
     
    	{Set IOchannel}
    END;

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    FormPhidget n'est pas assigné.
    Regarde où et comment est créé cette instance de TFormPhidget.

  3. #3
    Candidat au Club
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Merci Andnotor,

    Je suis débutant, je ne comprends pas bien ta réponse, ;-( Ce que je détecte lors de l'arrêt du programme c'est FormPhiget=nil et FormPhidget.Memo1= valeur inaccessible
    FormPhidget: TFormPhidget; est déclaré dans VAR en premier, et TFormPhidget = class(TForm), Memo1: TMemo sont déclarés un peu plus haut dans TYPE.

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Tu devrais retrouver quelque part FormPhidget := TFormPhidget.Create() ou Application.CreateForm(TFormPhidget, FormPhidget).

  5. #5
    Candidat au Club
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    En effet, je trouve : dans la partie "Program", mais je ne comprends pas le problème.

    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
    program DjSys2014;
     
    uses
      Forms,
      UnitMain in 'Units\UnitMain.pas' {MainForm},
     ....
      PhidgetUnit in 'Units\PhidgetUnit.pas' {FormPhidget};
     
    {$R *.res}
     
    begin
      Application.Initialize;
      Application.Title := 'DjSys2014';
      Application.CreateForm(TMainForm, MainForm);
      Application.CreateForm(TFormPhidget, FormPhidget);
     ...
      Application.Run;
    end.

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    La création est là

    Est-ce que MainForm fait appel à SetIOchannel depuis son événement OnCreate ?

  7. #7
    Candidat au Club
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Pas dans le OnCreate, mais dans un Timer (300 msec) actif dès le démarrage, SetIOchannel n'est nécessairement appelé.

    PhiGetUnit est dans le Uses de MainForm juste après "implementation"

    Merci pour ton aide.

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Ajoute cette ligne au tout début de SetIOchannel, ça devrait suffire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure SetIOchannel(Channel_no: TIOchannel);
    begin
      if not Assigned(FormPhidget) then Exit;
      ...

  9. #9
    Candidat au Club
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Ceci fonctionne, mais n'est pas conviviale pour mon application:

    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
    procedure TFormPhidget.SetIoChanelClick(Sender: TObject);
    begin
    //SetIOchannel(7);
    
    PhidgetInterfaceKit1.OutputState[7]:=true; { OK ça fonctionne !! mais pas ergonomique !} 
    
    end;
    
    
    PROCEDURE SetIOchannel(Channel_no: TIOchannel);
    var
    I, X, Y: byte;
    BEGIN
    	{Calculate module no}
     for I:=1 to 6 do begin
      if (OutputDevice[I].Actif) and (Channel_no >= OutputDevice[I].StartIO)
          and (Channel_no >= OutputDevice[I].EndIO) then
           begin
            X:=OutputDevice[I].Module;
            Y:=Channel_no-OutputDevice[I].StartIO-1;
            FormPhidget.PhidgetInterfaceKit1.OutputState[7]:=true;
            //TPhidgetInterfaceKit(FormPhidget.findComponent('PhidgetInterfaceKit'
            // +IntToStr(X))).OutputState[Y]:=true;
          	{Data for correct IOchannel to set}
            IO[Channel_no]:=true;
            //FormPhidget.Memo1.Lines.Add('IO['+IntToStr(Channel_no)+'] = true');
          end;
      end;
    
    	{Set IOchannel}
    END;

  10. #10
    Candidat au Club
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    désolé , la ligne " if not Assigned(FormPhidget) then Exit;" évite le "plantage", mais ne poursuit pas la procédure...

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Citation Envoyé par djsys Voir le message
    désolé , la ligne " if not Assigned(FormPhidget) then Exit;" évite le "plantage", mais ne poursuit pas la procédure...
    Ben c'est le but jusqu'à ce que FormPhidget soit disponible !

    Sinon, c'est déplacer la création de cette fiche depuis la source du projet (dpr) dans l'événement MainForm.OnCreate, mettre par défaut le timer à FALSE et ne le démarrer qu'après FormPhidget := TFormPhidget.Create().

  12. #12
    Candidat au Club
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    J'ai désactivé le Timer, mis en commentaire tous les appels SetIOChannel dans MainForm et ajouté un bouton sur la FormPhidget qui permet l'appel manuellement par OnClick la procédure SetIOChannel
    Depuis la fenêtre FormPhidget ouverte si je click sur le bouton, le résultat reste inchangé ...

  13. #13
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Bon, dans ta procédure des problèmes peuvent survenir avec : OutputDevice[I] ou FormPhidget.

    Peut-être que si tu étais un peu plus explicite sur l'erreur renvoyée, ça aiderait...

  14. #14
    Candidat au Club
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Extrêmement désolé l'erreur venait d'un record (OutputDevice[I].StartIO) qui était supérieur à TIOchannel

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

Discussions similaires

  1. Procedure TsqL Besoin d'aide
    Par ggcourtois dans le forum ASP
    Réponses: 1
    Dernier message: 30/04/2008, 00h36
  2. procedure de procedure de procedure
    Par edenyorke dans le forum C
    Réponses: 6
    Dernier message: 18/10/2006, 11h36
  3. Procédure dans procédure
    Par molesqualeux dans le forum Langage
    Réponses: 4
    Dernier message: 05/01/2005, 23h54

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