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

Lazarus Pascal Discussion :

Procédure non trouvée, dans la section interface de l'unité 2, qui est en uses de l'unité 1


Sujet :

Lazarus Pascal

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 949
    Billets dans le blog
    6
    Par défaut Procédure non trouvée, dans la section interface de l'unité 2, qui est en uses de l'unité 1
    Bonjour,

    Je déclare une procédure dans la section interface de l'unité 2, qui est en uses de l'unité 1.

    Sur la ligne d'un appel de cette procédure, l'IDE montre bien qu'elle est reconnue (procédure machin, unité 2), mais le compilateur bute avec le message "Error : identifier not found (nom de la procédure)"

    Mais qu'est-ce que j'ai fait de mal ? Qui m'en veut ?
    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 !

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    difficile à dire sans voir le code
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 949
    Billets dans le blog
    6
    Par défaut
    Certes !

    Mais Lazarus réserve quelques difficultés qui laissent pantois...

    J'ai par exemple eu un souci -non résolu- avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    constructor TDepasseLabel.Create(var aLabel: TLabel; ALongColor: TColor; ADepasseMode: TDepasseMode);
    begin
     inherited Create(ALabel.Owner);  
      //...
     aLabel:=self;
    end;
    qui plante ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function TControl.GetText: TCaption;
    var
      len: Integer;
    begin
      // Check if GetTextBuf is overridden, otherwise
      // we can call RealGetText directly
      if TMethod(@Self.GetTextBuf).Code = Pointer(@TControl.GetTextBuf) // self = ????
    Mais pour en revenir à nos moutons, voici le code déviant :

    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
    unit Unit1; 
     
    {$Mode Delphi} // {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, sqldb, db, BufDataset, memds, sqlite3conn, FileUtil, Forms,
      Controls, Graphics, Dialogs, StdCtrls, DBGrids,
      lyDepasseLabel in 'C:\Users\...\lyDepasseLabel.pas'; 
     
    type
      TForm1 = class(TForm)  
        //....
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}       
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      ModifieLabelPourDepassement(Label1, clRed, dmEndPoints);
      // avec le curseur, l'IDE montre l'unité qui l'héberge
      // le compilo dit "identifier not found : ModifieLabelPourDepassement"
    end;
    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
    unit lyDepasseLabel;
     
    {$Mode Delphi}
     
    interface
     
    uses
      StdCtrls, Graphics, Dialogs; 
     
    type
     TDepasseMode=(dmBeginPoints, dmMiddlePoints, dmEndPoints);
     
    procedure ModifieLabelPourDepassement(var aLabel: TLabel; aLongColor: TColor; aDepasseMode: TDepasseMode);
     
    implementation             
     
    //...
    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 !

  4. #4
    Membre émérite
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Par défaut
    Bonjour,

    As tu essayé de déclarer simplement lyDepasseLabel dans ta ligne de USES et d'ajouter 'C:\Users\...\lyDepasseLabel.pas' dans les options de compilation de ton projet ?

    Cordialement,
    Chris

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 949
    Billets dans le blog
    6
    Par défaut
    Merci pour ton idée ; je viens de tester : c'est sans effet, sinon que l'IDE ne reconnaît plus la procédure...

    Lazarus supporte-t-il les noms de répertoires avec des espaces ?
    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 !

  6. #6
    Membre émérite
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Par défaut
    Hum

    Essaye avec cette directive de compilation
    {$mode objfpc}{$M+}
    J'ai du modifier mes unités avec la dernière version de Lazarus

    Toutes mes unités perso sont dans des dossiers autres que ceux de mes projets et j'ajoute uniquement le chemin dans les options de compilation du projet.

    Si tu es sous Vista ou Seven ! il te faut les droits d'admin sur ces dossiers car il arrive que cela bloque notre guépard

    Cordialement,
    Chris

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Jai,

    D'autre part, j'ai un doute sur la validité de ton chemin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      lyDepasseLabel in 'C:\Users\...\lyDepasseLabel.pas';
    qui est un affichage "résumé", généralement pour éviter de déborder de l'affichage d'une fenêtre, MAIS, pour ton compilateur, il serait assez étonnant qu'il devine ce que \...\ signifie.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 949
    Billets dans le blog
    6
    Par défaut
    Le changement de directive entraîne un mieux, et pour le chemin, c'est moi qui l'ai raccourci pour vous éviter une lecture indigeste !

    Merci à tous deux.

    Je continue d'avoir l'autre problème(de VA) avec mon descendant de TLabel. Je ne suis pas sûr de continuer à caresser le guépard : je vais pê retourner dans le Grand Bleu, avec les dauphins...
    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 !

  9. #9
    Membre émérite
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Par défaut
    De rien

    Passe moi ton code de TLabel stp, je vais regarder ça !

    J'ai lu ton autre post ! pourquoi ne recrees tu pas une classe dérivée pour cela ?

    Cordialement,
    Chris

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 949
    Billets dans le blog
    6
    Par défaut
    Merci pour ton aide !

    A la base, j'ai créé ce TDepasseLabel pour remplacer à l'exécution des TLabel posés sur une fiche, mais dont la longueur ne devait pas dépasser celle du design time.

    D'où l'idée de créer ce descendant, qui affiche le texte incomplet suivi de '...' et le texte complet en hint.

    Et pour faire plus "fun", de "remplacer" le Label par son descendant... au Free du Label initial, c'est son descendant qui est libéré et le libère lui-même (il est conservé pour la cuisine interne).

    Certes, il y a d'autres méthodes pour gérer ça, mais ce code fonctionne parfaitement en Delphi 5, et son adaptation n'est malheureusement pas si évidente en FPC.

    Voici donc l'unité :
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    unit lyDepasseLabel;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      StdCtrls, Graphics;
     
    type
     TDepasseMode=(dmBeginPoints, dmMiddlePoints, dmEndPoints);
     
    type
     TDepasseLabel=class(TLabel)
     private
      FLabel: Tlabel;
      FMaxWidth: integer;
      FLongColor: TColor;
      FDepasseMode: TDepasseMode;
     public
      constructor Create(var ALabel: TLabel; ALongColor: TColor; ADepasseMode: TDepasseMode); overload;
      destructor Destroy; override;
      function GetLabelText: string; override;
     end;
     
    implementation
     
    // constructeur/remplaceur de l'objet ALabel passé en variable
    constructor TDepasseLabel.Create(var ALabel: TLabel; ALongColor: TColor; ADepasseMode: TDepasseMode);
    begin
     inherited Create(ALabel.Owner);           // crée un Tabel
     Parent:=ALabel.Parent;               // copie ses propriétés
     Top:=ALabel.Top;
     Left:=ALabel.Left;
     // on peut toutes les ajouter, selon besoins....
     Font.Name:=ALabel.Font.Name;
     Font.Size:=ALabel.Font.Size;
     Font.Pitch:=ALabel.Font.Pitch;
     Font.Style:=ALabel.Font.Style;
     FLabel:=ALabel;                           // garde le label en propriété et le cache
     Flabel.Visible:=False;                    // ajuste ses propriétés pour s'en servir
     FLabel.AutoSize:=True;
     FLongColor:=ALongColor;                   // ajuste ses propriétés propres
     FDepasseMode:=ADepasseMode;
     FMaxWidth:=FLabel.Width;
     Width:=ALabel.Width;
     ShowHint:=True;
     Caption:=ALabel.Caption;
     ALabel:=self;                             // remplace le label en renvoyant son adresse
    end;
     
    destructor TDepasseLabel.Destroy;
    begin
     FLabel.Free;                              // supprime le label remplacé
     inherited;                                // libère l'objet
    end;
     
    // cette fonction est appelée lors de l'affichage du label
    // c'est sa redéfinition qui permet l'effet voulu
    function TDepasseLabel.GetLabelText: string;
    var
     S: string;
    begin
     FLabel.Caption:=Caption;             // colle le Caption dans le label initial (autosize)
     if FLabel.Width>FMaxWidth then begin      // selon la taille nécessaire,
      Hint:=Caption;                 // pour voir le texte entier en Hint
      Font.Color:=FLongColor;             // la couleur signale le dépassement
      case FDepasseMode of
       // à finir...
       dmBeginPoints  : begin end;
       dmMiddlePoints : begin end;
       dmEndPoints    : begin
                         while FLabel.Width>FMaxWidth do
                          FLabel.Caption:=Copy(FLabel.Caption,1,Length(FLabel.Caption)-1);
                          S:=Copy(FLabel.Caption,1,Length(FLabel.Caption)-3)+'...';
                        end;
     
      end;
      Result:=S;
     end
     else begin
      Font.Color:=FLabel.Font.Color;      // couleur d'origine
      Hint:='';                           // pas de Hint
      Result:=FLabel.Caption;                  // puisque le texte entier tient
     end;
    end;
     
    end.
    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 !

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    c'est très surprenant comme façon de faire.

    voici deux astuces qui peuvent te servir

    1) surcharger un composant standard :

    si dans ta fiche tu déclares un nouvelle classe TLabel, elle sera utilisée en lieu est place du TLabel standard, tu peux même dérivé de l'original

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    unit unit1;
    ...
    type
      TLabel = class(StdCtrls.TLabel)
       ...
      end;
     
      TForm1 = class(TForm)
      ...
       Label1: TLabel; // la classe ci-dessus
      ...
      end;
    tu peux aussi mettre cette déclaration dans une unité pour peu qu'elle soit placée APRES StdCtrls dans le uses de la fiche.

    2) la fonction DrawText de l'API Windows propose l'ajout automatique des "..." avec le flag DT_END_ELLIPSIS.

    Avec ces deux éléments, il te suffit donc de surcharger le Paint ou DoDrawText de TLabel pour obtenir l'effet désiré.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 949
    Billets dans le blog
    6
    Par défaut
    @Paul Toth : cette façon de faire m'amusait (on s'amuse comme on peut !) et je ne savais pê pas faire autrement au moment où j'ai commis ça...

    D'accord pour la solution avec DrawText, mais ce qui me chagrine aujourd'hui n'est pas tant la manière que la difficulté de porter un code sous FPC. J'ai commencé à porter qq unités d'un projet sur lequel je suis bloqué par un Delphi 5 sous W98, espérant que Lazarus me permettrait de lever les limitations. Mais je ne m'attendais pas à tant de difficultés, en butant sur des détails, alors que je pensais seulement me faire la main en adaptant ces codes, et non les refondre (même si on peut faire mieux...) Ca fait un peu peur avant de s'attaquer au vif du sujet !

    NB : j'aime beaucoup la redéclaration de type, que tu as déjà proposée dans des cas similaires.
    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 !

Discussions similaires

  1. bdd : erreur 3265 élément non trouvé dans cette collection
    Par morgan47 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 10/07/2006, 10h52
  2. Erreur de "Élément non trouvé dans cette collection"
    Par charleshbo dans le forum Access
    Réponses: 4
    Dernier message: 04/05/2006, 19h42
  3. Variable générale non trouvée dans une fonction
    Par mickael.be dans le forum Langage
    Réponses: 10
    Dernier message: 21/02/2006, 20h18
  4. [PHP-JS] Formulaire non trouvé dans une fonction
    Par philippe30 dans le forum Langage
    Réponses: 4
    Dernier message: 11/12/2005, 22h53

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