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 :

Améliorations à apporter à l'EDI Lazarus


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut Améliorations à apporter à l'EDI Lazarus
    Citation Envoyé par e-ric Voir le message
    Une idée pourrait être de centraliser les manques constatés dans un fil de discussion de DVP.com, peut-être que cela pourra inspirer d'autres personnes.

    Cdlt
    Bonne idée !

    Je vote pour la finalisation de la ListView, qu'on ait enfin sous Linux quelque chose d'opérationnel.

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Yep !

    Mettre en place une fenêtre permettant de choisir à l'install les compos qu'on voudrait parmi ceux qui sont matures et "indispensables", je dirais.

  3. #3
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Par défaut
    Bonjour,

    Pour ma part je crois qu'il faut améliorer:

    1. SqlQuery:
    -la création explicite des indexes
    -la manipulation des filtres de types 'Float'.
    -la manipulation efficace des champs persistants.
    -L'ajout de champ ou composant type 'agrégate' pour sommer un autre champ.

    2. Mplayer:
    -Integrer Mplayer dans l'IDE et lui ajouter un Navigator.

    3. Transaction:
    Ajouter,par défaut le paramètre 'Read committed' à la transaction.

    4. DBGrid:
    L'ajout sur les entêtes des colonnes deux minuscules triangles pour la manipulation des tris (A-Z / Z-A).

    merci bien.

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 229
    Par défaut
    hello,
    alberich, pour le composant TadvLed ce n'est pas si simple que cela de rajouter des couleurs car en fait les couleurs correspondent à des bitmaps stockés en ressource. Par contre tu peux personnaliser et créer une nouvelle couleur en mettant lkCustom dans la propriété Kind et en chargeant un bitmap personnalisé dans la propriété GlyphOn (charger un png qui correspond au bitmap dans TPicture). Tu peux prendre par exemple le bitmap yellow.png qui se trouve dans le répertoire IndustrialStuff/resources, modifier la couleur en bleu et le sauvegarder en bleu.png et c'est le bitmap alors que tu utilises dans GlyphOn.
    Ami calmant, J.P

  5. #5
    Invité
    Invité(e)
    Par défaut Réponse à Jurassic Pork
    Merci, ton tuyau est séduisant, mais il y a un seul hic : mon logiciel de dessin sait lire, mais pas enregistrer du png ! J'ignore si ton composant accepterait du bmp ? J'ai trouvé une autre solution (bancale, mais qui a marché par le passé, avant que je ne trouve le composant pour Delphi) : j'ai maintenant une collection de captures de ma Led Delphi en différentes couleurs, et au format ico 16 couleurs avec bord transparent ; il suffit alors de créer un composant-image par couleur utilisée, de les superposer et ne n'en rendre qu'un visible suivant le cas.
    Ta Led utilise des dégradés, c'est pourquoi elle me paraît plus jolie ... Celle de Delphi n'a qu'une plage de la couleur concernée et un arc de cercle blanc, et est apparemment redessinée à chaque changement de couleur (canvas ? ) : avantage on a toutes les couleurs possibles, inconvénient il faut obligatoirement mettre doublebuffered, sinon traits dans l'image !

  6. #6
    Invité
    Invité(e)
    Par défaut Impression du texte des unités.
    Bonjour.

    1) Une numérotation des pages serait la bienvenue, comme dans Delphi, même si celle-ci est parfois un déclencheur de fou-rire : page 5/4 ...
    2) Et si les programmeurs ont estimé que les couleurs apportent quelque chose au niveau de la fenêtre de code, il y aurait peut-être moyen de les faire ressortir aussi à l'impression (sur une imprimante couleur bien sûr ... ) ?
    Dernière modification par Invité ; 10/07/2016 à 23h36.

  7. #7
    Invité
    Invité(e)
    Par défaut Structure des menus
    Si possible, ajouter la commande "Enregistrer le projet sous" également dans "Fichier", là où les utilisateurs venus de Delphi s'attendent à le trouver ! Cela leur évitera (comme pour moi) d'embêter inutilement les autres sur des forums ...

    Et encore autre chose, mais là je ne me fais pas d'illusions : un des points forts des logiciels de M$ (si, si, il y en a !) est la possibilité de personnaliser complètement la barre des menus TEXTUELS (ce qui résoudrait peut-être au passage le problème précédent). Mon problème (mais je dois être l'un des rares dans ce cas ! ) est que, comme ma machine principale n'est pas connectée à Internet, quand je clique par mégarde dans un point de menu (Aide) qui s'y rapporte, je pars à la chasse au Dahu !
    Dernière modification par Invité ; 14/07/2016 à 08h20.

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Bonjour,

    erreur de traduc' :

    Nom : fichierschangés.png
Affichages : 753
Taille : 19,7 Ko

    Moi, quand on me dit de chercher "dessous", je cherche dessous et bien sûr je ne trouve rien et ça me met la haine...

    Des mois ça m'a pris pour réaliser que c'était dessus qu'il fallait chercher, des mois ! Parce qu'en regardant dessous je ne voyais pas la ligne tout en haut...

    Et pendant que j'y suis et puisque la dernière ligne ne rentre pas, elle pourrait être simplifiée en "Vérifier selon le contenu plutôt que par l'horodatage"

  9. #9
    Rédacteur

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Bonjour,

    erreur de traduc' :

    Moi, quand on me dit de chercher "dessous", je cherche dessous et bien sûr je ne trouve rien et ça me met la haine...

    Des mois ça m'a pris pour réaliser que c'était dessus qu'il fallait chercher, des mois ! Parce qu'en regardant dessous je ne voyais pas la ligne tout en haut...

    Et pendant que j'y suis et puisque la dernière ligne ne rentre pas, elle pourrait être simplifiée en "Vérifier selon le contenu plutôt que par l'horodatage"
    Bonjour Jipété,

    Désolé pour les mois, mais l'erreur est passée inaperçue jusqu'à présent . Un petit "o" de trop et vlan... La correction sera incluse dans la prochaine mise à jour et la suggestion d'un message plus court a été retenue.

    @+

    Gilles
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  10. #10
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Bonjour,

    pour une fois que j'ai ma fenêtre de messages toute vide d'insultes et de lignes agressives, ben, je me demande s'il ne manque pas une séparation (espace ou autre) entre "...projet" et "Cible..." :

    Nom : messages_sans_espace.jpg
Affichages : 914
Taille : 10,6 Ko

    Fait pour servir et valoir ce que de droit,

  11. #11
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Complètement dans l'EDI cette fois :

    Si on pouvait avoir des dialogues sensés (= avec du sens), exemple de truc à vomir :

    Nom : oui_non_annuler.png
Affichages : 792
Taille : 17,4 Ko

    Ça serait tellement plus simple de répondre par Oui, Non ou Annuler à la question posée mais non, ça devait être trop simple et moi, quand je me prends cette boîte de dialogue, à chaque fois je la lis et la relis encore, et me pose bien la question de savoir si je suis sûr de là où je vais cliquer.

    C'est quand même terrible, des trucs pareils...

  12. #12
    Membre prolifique Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 740
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 740
    Par défaut
    Bonjour,

    Un autre truc avec l'éditeur de fiche. Quand on veut sélectionner plusieurs composants, on doit appuyer sur une touche (CTRL ou MAJ, je ne sais plus) et cliquer, il m'arrive très souvent, quand j'ai plusieurs composants à sélectionner, que lors du clic, il sélectionne le parent (panel, groupebox, ...) plutôt que le composant.
    A ce moment, je suis obligé de recommencer. Quand il y a 2/3 composants, c'est chiant mais ça le fait, mais quand il y en a une dizaine, voire plus...
    Surtout que les autres essais peuvent rater de la même manière. Il m'est arrivé d'abandonné et de traiter les composants un à un tellement ça me gavait !

    Voilà, si ça pouvait être amélioré...

    A+
    JS

  13. #13
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Juste pour bien enfoncer le clou, je réponds plutôt qu'éditer mon précédent message, même si celui-ci est dans la droite continuité de celui-là.

    Et donc ce matin je misérais avec FloodFill sous Laz 1.6 dans une machine virtuelle XP et comme je trouvais que ça commençait à bien faire, à me prendre la tête sérieux et à me les gonfler grave, j'ai démarré la vieille machine virtuelle w2k qui embarque un... D7 perso, et oui !

    Et là, en trois clics le FloodFill obéissait aux ordres, c'est reposant.

    Alors, à titre de comparaison, voici la partie textuelle de l'aide de Lazarus concernant cette fonction
    FloodFill flood-fills an area with the given colour, starting from the specified point; uses the FloodFill method for the current interface or widget set
    et ensuite celle de D7 :
    Utilisez la méthode FloodFill pour remplir une zone, pas nécessairement rectangulaire, de l'image avec la valeur de Brush. Les limites de la région à remplir sont déterminées en se déplaçant dans toutes les directions à partir du point (X,Y) jusqu'à ce qu'une limite de couleur impliquant le paramètre Color soit rencontrée.

    X et Y sont les coordonnées du canevas qui marquent le début du remplissage.

    Color est la couleur qui définit la limite de la zone à remplir. Son interprétation dépend de la valeur de FillStyle.

    FillStyle spécifie si la zone est définie par tous les pixels de même valeur que Color, ou tous les points de valeur différente.

    Conseil : Quand vous utilisez le style de remplissage fsSurface, utilisez la propriété Pixels pour connaître la valeur exacte de la couleur au point (X,Y). De même, si FillStyle a la valeur fsBorder, utilisez Pixels pour connaître la valeur exacte de la couleur de délimitation si vous connaissez un point de la limite.
    Y a pas photo, hein ! Ni dans la quantité, ni dans la qualité : là où Lazarus explique rien ou n'importe quoi, Delphi explique la vraie vie.
    Et j'ai enfin compris pourquoi certains codes trouvés sur le web m'étaient restés jusqu'à présent hermétiques :Lazarus ne me donnait pas la clé !

    Autre chose : il faut absolument que les gars qui vont se pencher sur l'aide toutes affaires cessantes pensent à rajouter des exemples, et des exemples qui fonctionnent !, et qu'ils n'oublient pas d'indiquer les résultats attendus (on trouve des exemples nous disant faut faire comme ci faut faire comme ça, mais comme on ne sait pas ce qui va en résulter, si on se trompe on ne le verra pas...)
    Genre, j'ai encore perdu une heure ce matin jusqu'à ce que je trouve la ligne qui m'a rendu le sourire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      with Image1.Canvas do begin
        // ça ne peut pas s'inventer un truc pareil :
        Clear; // ! \\ // ! \\ MANDATORY sinon image noire // ! \\ // ! \\ mais inconnu en D7
        // http://forum.lazarus.freepascal.org/index.php?topic=12558.0
        Brush.Style := bsSolid;
        Brush.Color := clRed;
        FillRect(0, 0, Width, Height);    // ok
        //FloodFill(0, 0, clRed, fsSurface);  // noir jusqu'à trouver la soluce dans D7, gardé pour les copains du forum -- rappel : aide Laz :
        // FloodFill flood-fills an area with the given colour, starting from the specified point;
        // c'est bien ce que j'ai écrit, non ?
      end;
    end;

  14. #14
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut Améliorations à apporter à l'EDI Lazarus
    Avoir des outils qui fonctionnent vraiment ?

    Exemple avec la recherche dans les fichiers, que j'utilise beaucoup, mais hélas...

    Ce que je veux chercher ;
    Nom : recherche_kc.png
Affichages : 731
Taille : 41,8 Ko

    Ce que le bazar me trouve :
    Nom : resultat_recherche.png
Affichages : 423
Taille : 10,7 Ko



    Linux Debian FPC 3.0.4 / Laz 1.8.2

  15. #15
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Bonsoir,

    vécu ce matin une vraie catastrophe en termes de perte de temps, et je considère que c'est du ressort de l'EDI, d'où ce post.

    J'avais dans l'idée de remplir un TImage avec une couleur, et Canvas.FloodFill était la fonction toute désignée : l'aide était d'accord et la complétion de code aussi, alors roule.

    Sauf que ça n'a pas fonctionné. Alors là, je ne comprends pas : je regarde mon code à la loupe (une ligne !) à m'en péter les yeux mais non, aucun défaut et pourtant, image noire, ou vide, selon les essais...
    Parce que oui, quand ça ne fonctionne pas du premier coup, on part dans toutes les directions, pour essayer de faire fonctionner ce truc tout simple.

    Sans connexion internet c'était la mort assurée, heureusement quelqu'un avait posté qu'il y avait toutes les chances pour que ça ne soit pas implémenté sous Linux avec gtk2, ce qui est hélas exactement mon cas.
    Et le quelqu'un en question avait dû y passer du temps, lui aussi, car il fournissait même un lien vers un forum teuton où s'y trouve une solution de contournement, un FloodFill2 perso et à la mano, mais qui fonctionne, ouf !

    Alors ce que je ne comprends pas, c'est que les gens qui codent Lazarus se permettent de publier une solution prévue pour être multi-plateformes mais ce n'est pas vrai, loin de là en ce qui concerne Linux, et il n'y a rien pour informer les utilisateurs. On marche sur la tête !

    Je crois vraiment que la priorité absolue des développeurs devrait être de prendre ce point en compte, sinon Lazarus restera un gadget pour amateurs ! Il faut que lorsque quelque chose n'est pas implémenté l'utilisateur en soit informé depuis le cœur de l'outil et pas en faisant des recherches externes, dépendantes d'une connexion qui peut ne pas être opérationnelle, et aussi du fait que quelqu'un a déjà eu le problème et a une solution.
    Sinon je serais encore à c't'heure en train d'essayer de faire fonctionner un machin qui me fait des sourires et rien d'autres -- Nul !

  16. #16
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Salut, je suis tombé sur un bug de très très bas niveau à mon avis. Pourquoi ? tout simplement car aucun message d'erreur n'apparait.
    Comment je l'ai découvert en mode debug avec un point de suivi sur une de mes variables qui ne s'affiche pas dans un "TLabel.Caption". Celle-ci est vidée, remise à zero à un moment X.

    En gros, j'ai plusieurs classes parents/enfants (sur 6 niveaux). Ma variable est de type string et est déclarée dans la classe de niveau 2. Durant le processus ma variable est bien mise à jour et son contenu conservé jusqu'au Niveau 6 lors de l'appel à une des procedure qui est déclarée "Virtual" dans la classe de niveau 2. Cette procedure est surchargée qu'a partir de la classe de niveau 6. (Vous suivez ?)

    La structure pour vous donner une idée :

    0 -TPersistent
    1 - TGLZUpdateAbleObject
    2 - TGLZCustomDataFile
    3 - TGLZCustomBitmap
    4 - TGLZBitmap
    5 - TGLZCustomImageFileIO
    6 - TGLZBitmapXPMImage

    Voila une capture d'écran avec le message de "dbg"

    Nom : capture_08242017_013421.jpg
Affichages : 795
Taille : 31,0 Ko

    Et la la variable est vidée au moment précis ou cette fameuse procedure surchargé est appelée par la classe de niveau 2.
    Petite précision je ne touche pas à cette variable une fois son contenu mise à jour la seule et unique fois par la classe de niveau 2
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  17. #17
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    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 931
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Une question à la Papy Mougeot :
    Cette propriété est-elle mise à jour et lue directement à partir du champ, ou fait-elle appel à un getter/setter ?
    Oui - ou Non - mais vous pensiez à quoi ?
    A rien, c'était seulement pour faire avancer le schmilblick !

    Cette procédure virtuelle est-elle aussi déclarée abstraite ?

    Ce que je ne comprends pas bien :
    Et la la variable est vidée au moment précis ou cette fameuse procedure surchargé est appelée par la classe de niveau 2.
    Une classe de niveau 2 ne peut exécuter cette méthode de niveau 6. Sauf s'il s'agit d'une variable de type TGLZCustomDataFile (niveau 2) contenant un descendant de type TGLZBitmapXPMImage (niveau 6) qui définit bien cette méthode. D'ailleurs, l'appel d'une méthode abstraite non définie devrait entraîner une exception à l'exécution, non ?

    Avec ce schéma :
    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
      TAncestor = class(TPersistent)
     
      end;
     
      TDescendantLevel2 = class(TAncestor)
      private
        FName: string;
      public
        procedure JustSetName(aName: string);
        procedure DoSomething(aName: string); virtual; abstract;
      property
        FieldName: string read FName; // write FName;
      end;
     
      TDescendantLevel3 = class(TDescendantLevel2)
     
      end;
     
      TDescendantLevel4 = class(TDescendantLevel3)
     
      end;
      TDescendantLevel5 = class(TDescendantLevel4)
     
      end;
     
      TDescendantLevel6 = class(TDescendantLevel5)
      public
        constructor Create(aParam: string); overload;
        procedure DoSomething(aName: string); override;
      end;
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.frm}
     
    { TForm1 }
     
    procedure TDescendantLevel2.JustSetName(aName: string);
    begin
      FName := aName + ' ajouté par méthode level2';
    end;
     
    procedure TDescendantLevel6.DoSomething(aName: string);
    begin
      FName := aName + ' = Nom modifié par méthode abstraite level6';
    end;
     
    constructor TDescendantLevel6.Create(aParam: string);
    begin
      inherited Create;
      JustSetName(aParam + ' = Nom au create du level 6');
    end;
    le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Button1Click(Sender: TObject);
    var
      MyDescendant: TDescendantLevel2;
    begin
      MyDescendant:=TDescendantLevel2.Create;
      MyDescendant.JustSetName('Début');
      Memo1.Clear;
      Memo1.Append(MyDescendant.FieldName);
      MyDescendant.DoSomething('Nouveau nom');
      Memo1.Append(MyDescendant.FieldName);
      MyDescendant.Free;
    end;
    provoque un EAstractError
    alors que celui-ci passe (mais c'est sûrement un maigre squelette du tien) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.Button1Click(Sender: TObject);
    var
      MyDescendant: TDescendantLevel6;
    begin
      MyDescendant:=TDescendantLevel6.Create('Début');
      Memo1.Clear;
      Memo1.Append(MyDescendant.FieldName);
      MyDescendant.DoSomething('Nouveau nom');
      Memo1.Append(MyDescendant.FieldName);
      MyDescendant.Free;
    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 !

  18. #18
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Bonjour,
    Une question à la Papy Mougeot :
    Cette propriété est-elle mise à jour et lue directement à partir du champ, ou fait-elle appel à un getter/setter ?
    Oui - ou Non - mais vous pensiez à quoi ?
    A rien, c'était seulement pour faire avancer le schmilblick !
    Bonjour,

    Citation Envoyé par tourlourou Voir le message
    Cette procédure virtuelle est-elle aussi déclarée abstraite ?

    Ce que je ne comprends pas bien :

    Une classe de niveau 2 ne peut exécuter cette méthode de niveau 6. Sauf s'il s'agit d'une variable de type TGLZCustomDataFile (niveau 2) contenant un descendant de type TGLZBitmapXPMImage (niveau 6) qui définit bien cette méthode. D'ailleurs, l'appel d'une méthode abstraite non définie devrait entraîner une exception à l'exécution, non ?
    Oui je comprend que tu ne comprenne pas bien c'est un peu dur sans code. J'aurais tenté d'expliqué au mieux. Car en fait il y'a un peu plus de niveaux Il faut mieux un bon bout de code alors :
    Voila partiellement à quoi ça ressemble :

    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
     
    Interface
     
    Type
      TGLZInterfacedPersistent = class(TPersistent, IInterface) 
      TGLZUpdateAbleObject = Class(TGLZInterfacedPersistent, IGLZNotifyAble) 
     
      TGLZCustomDataFile = Class(TGLZUpdateAbleObject)
      Private
         FFullFileName: String;   
      Protected
         Function CheckFormat(): Boolean; Virtual;
         Procedure LoadFromMemory; Virtual; // ---> C'est lorsque cette procédure est appelé dans l'enfant que FFullFileName est vidée
      Public
         Procedure LoadFromStream(aStream: TStream); Virtual;   
         Procedure LoadFromFile(Const FileName: String); Virtual;  
     
         Property FullFileName: String read FFullFileName;     
      End;                                  
     
      TGLZCustomBitmap = class(TGLZCustomDataFile)
     
      TGLZCustomImageFileIO = Class(TGLZCustomBitmap)
      protected
        function ReadImageProperties:Boolean;Virtual; 
      end;
     
      TGLZBitmapXPMImage = class(TGLZCustomImageFileIO)
      protected
         procedure LoadFromMemory();override;  // ---> C'est lorsque cette procédure est appelé que FFullFileName est vidée
         function CheckFormat(): Boolean; override;
         function ReadImageProperties:Boolean;override;
      end;
     
      TGLZPicture = class(TGLZPersistentObject)
      private
        FBitmap : TGLZBitmap;
     
        procedure SetBitmap(Const aBitmap : TGLZBitmap);
      protected
      public
        Constructor Create;override;
        Destructor Destroy;override;
     
        //procedure ReadFiler
        //procedure WriteFiler
     
        procedure LoadFromFile(Const aFileName:String); overload;
        procedure SaveToFile(Const aFileName:String); overload;//aFormat : TGLZImageFileFormats; Options : Pointer);
      public
        property Bitmap : TGLZBitmap Read FBitmap Write SetBitmap;
     
      end;
     
      TGLZCustomImageView = class(TGLZCustomControl)
      protected
        FBackBuffer : TGLZBitmap;
     
        procedure Paint; override;
        procedure Resize; override;
      public
        property BackBuffer: TGLZBitmap read FBackBuffer;
     
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      end; 
      TGLZSimpleImageView = Class(TGLZCustomImageView)     
     
    Implementation
     
    Procedure TGLZCustomDataFile.LoadFromFile(Const FileName: String);
    Var
      fs: TStream;
    Begin
      ResourceName := ExtractFileName(fileName);
      FFullFileName := FileName;
      fs := CreateFileStream(fileName, fmOpenRead + fmShareDenyNone);
      Try
         LoadFromStream(fs);
      Finally
        fs.Free;
      End;
    End;
     
    Procedure TGLZCustomDataFile.InternalLoadFromStream(aStream: TStream);
    Begin
      FData := TGLZBufferedStream.Create(aStream);
      Try
        If CheckFormat Then LoadFromMemory;
      Finally
        FreeAndNil(FData);
      End;
    End;
     
    Procedure TGLZCustomDataFile.LoadFromStream(aStream: TStream);
    Begin
      InternalLoadFromStream(aStream);
    End; 
     
    Function TGLZCustomDataFile.CheckFormat(): Boolean;
    Begin
      Result := True;
    End; 
     
    Procedure TGLZCustomDataFile.LoadFromMemory();
    Begin
      Assert(False, 'Import de ' + ClassName + ' vers ' + Self.ClassName + ' non supporté.');
    End;
     
    procedure TGLZBitmap.LoadFromFile(Const FileName:String);
     var
       BaseImageClass: TGLZBitmapClass;
       tempImage: TGLZCustomBitmap;
       SrcPtr, DstPtr:PGLZColor;
     begin 
       if filename = '' then exit;
       BaseImageClass := GetGLZImageFileFormats.FindFromFileName(filename);
       TempImage:=nil;
       tempImage := BaseImageClass.Create(0,0);
       try
         tempImage.LoadFromFile(fileName);
         // Assign(TGLZBitmap(TempImage));
         SetSize(TempImage.Width, TempImage.Height);
         Clipping:=false;
         ClipRect:=TempImage.ClipRect;
         with RawImage do
         begin
           Description.Width:=TempImage.RawImage.Description.Width;
           Description.Height:=TempImage.RawImage.Description.Height;     
         end;
     
         With DataFormatDesc do
         begin
           Name :=  TempImage.DataFormatDesc.Name;
           Desc :=  TempImage.DataFormatDesc.Desc;
           Version :=  TempImage.DataFormatDesc.Version;
           FileMask :=  TempImage.DataFormatDesc.FileMask;
           Encoding :=  TempImage.DataFormatDesc.Encoding;
         end;
         SrcPtr:=PGLZColor(TempImage.getSurfaceBuffer);
         DstPtr:=PGLZColor(GetSurfaceBuffer);
         Move(SrcPtr^,DstPtr^,Size);
       finally
         FreeAndNil(tempImage);
       end;
    end;  
     
    procedure  TGLZPicture.LoadFromFile(Const aFileName:String);
    begin
      FBitmap.LoadFromFile(aFileName);
    end;
    Voila le code c'est tout. J'ai également compiler sans débogage et J'ai également placé Property FullFileName; dans chaque descendant dans la partie public, histoire de...
    Idem cela ne change rien

    Voila le code dans l'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
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
     
    Interface
     
    Type Tform1 = Class(Tform)
        Label1 : Tlabel;
        Label2 : Tlabel;
        Label3 : Tlabel;
        Label4 : Tlabel;
        lblImgFileName : Tlabel;
        lblImgFormat : Tlabel;
        lblImgSize : Tlabel;
        lblImgBPP : Tlabel;
        Panel1 : Tpanel;
        Panel2 : Tpanel;
        pnlView : Tpanel;
        Procedure Formclose(Sender : Tobject; Var Closeaction : Tcloseaction);
        Procedure Formcreate(Sender : Tobject);
        Procedure Formdropfiles(Sender : Tobject; Const Filenames : Array Of String);
        Procedure Formshow(Sender : Tobject);
      Private
      protected
        procedure UI_UpdateImageInfos;
      Public
        ImageView : TGLZSimpleImageView;
        ImageFileName : String;
      End;  
     
    Implementation
     
    Procedure Tform1.Formcreate(Sender : Tobject);
    Begin
      ImageFileName:='';
      ImageView := TGLZSimpleImageView.Create(self);
      With ImageView do
      begin
        Parent := pnlView;
        Align :=alClient;
      end;
    End;
     
    Procedure Tform1.Formclose(Sender : Tobject; Var Closeaction : Tcloseaction);
    Begin
      FreeAndNil(ImageView);
    End;
     
    Procedure Tform1.Formshow(Sender : Tobject);
    Begin
      With ImageView do
      begin
        Color:=clBlack;
        Picture.Bitmap.SetSize(Width,Height);
        Picture.Bitmap.Clear(clrBlack);
      end;
    End; 
     
    Procedure Tform1.UI_UpdateImageInfos;
    begin
      With ImageView.Picture.Bitmap Do
      begin
        lblImgFileName.Caption := FullFileName;   //ImageFileName;
        lblImgFormat.Caption := DataFormatDesc.Name + '(' + DataFormatDesc.Desc + ')';
        lblImgSize.Caption := IntToStr(Width) + ' x ' + IntToStr(Height);
        With RawImage.Description Do
        begin
          Case PixelFormat of
            pf1Bit : lblImgBPP.Caption := '1 Bit (Monochrome)';
            pf2Bits : lblImgBPP.Caption := '2 Bits (4 Couleurs)';
            pf4Bits : lblImgBPP.Caption := '4 Bits (16 Couleurs)';
            pf8Bits : lblImgBPP.Caption := '4 Bits (256 Couleurs)';
            pf15Bits : lblImgBPP.Caption := '15 Bits';
            pf16Bits : lblImgBPP.Caption := '16 Bits';
            pf24Bits : lblImgBPP.Caption := '24 Bits';
            pf32Bits : lblImgBPP.Caption := '32 Bits';
            pf48Bits : lblImgBPP.Caption := '48 Bits';
            pf64Bits : lblImgBPP.Caption := '64 Bits';
          End;
        End;
      End;
    End;
     
    Procedure Tform1.Formdropfiles(Sender : Tobject; Const Filenames : Array Of String);
    begin
       Try
         Try
           Screen.Cursor:=crHourGlass;
           ImageFileName := FileNames[0];
           ImageView.Picture.LoadFromFile(ImageFileName);
         Finally
           Screen.Cursor:=crDefault;
         End;
       Except
         On E : EInvalidImageFile do
         begin
           MessageDlg(E.Message, mtWarning, [mbOk], 0);
           Exit;
         end
         else
         begin
           MessageDlg('Erreur Inconnue : '+//E.Message+
           #13+#10+'Ok pour continuer'+#13+#10+'Abandonner pour quitter l''application', mtError, [mbOk, mbAbort], 0);
         end;
       end;
       ImageView.Invalidate;
       UI_UpdateImageInfos;
    End;
    Voila rien de bien transcendant à la base. Un problème d'héritage ? faudrait que j'essaye en passant la propriété FullFileName dans published.

    EDIT : Je tiens à préciser que les images déposées sur la fiche se chargent et s'affiche sans probleme.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  19. #19
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Bonsoir,

    ce post date de 2016 mais je n'ai pas pu m'empêcher d'y penser quand...
    Citation Envoyé par Jipété Voir le message
    Complètement dans l'EDI cette fois :

    Si on pouvait avoir des dialogues sensés (= avec du sens), exemple de truc à vomir :

    Nom : oui_non_annuler.png
Affichages : 739
Taille : 17,4 Ko

    Ça serait tellement plus simple de répondre par Oui, Non ou Annuler à la question posée mais non, ça devait être trop simple et moi, quand je me prends cette boîte de dialogue, à chaque fois je la lis et la relis encore, et me pose bien la question de savoir si je suis sûr de là où je vais cliquer.

    C'est quand même terrible, des trucs pareils...
    ... cet après-midi j'ai été obligé d'utiliser mon vieux Publisher 2000 qui doit dater de 1999 pour travailler sur un vieux fichier et à la fermeture j'ai eu ça :

    Nom : Publisher_ouinonannuler.png
Affichages : 759
Taille : 11,3 Ko

    et franchement, des boîtes de dialogues comme ça, ça change la vie !
    en bien !
    Pas besoin de perdre du temps à essayer de comprendre ce qu'ils ont voulu dire, avec Publisher on sait tout de suite.

  20. #20
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Bonjour,

    OK, je suis un peu HS, mais il est difficile, quand on a les mains dans le cambouis, de faire la part des choses entre l'EDI proprement et les fichiers de code qu'il pilote et qu'il nous permet d'utiliser.
    Alors bon, qu'est-ce que je voudrais pour Lazarus ?
    Profitons, c'est bientôt Noël : je voudrais un système muni de fonctions de base opérationnelles.
    Parce que c'est bien joli de rajouter des composants à chaque nouvelle version, mais si ceux-ci s'appuient sur des fondations en sable, on ne peut pas aller bien loin...

    J'ai mis "fonctions de base opérationnelles" en gras car on sait tous que dans ces systèmes, tout est à base de messages échangés entre composants divers et variés, routines kernel et userland, etc., et lisez donc la suite.

    Dans ce lien on trouve quelques lignes nous montrant comment fonctionne Ctrl.Perform ; j'ai récupéré et testé, je vous laisse lire mes commentaires (les deux lignes hwnd := ... et SendMessage(... c'est moi qui les ai ajoutées plus tard) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
          Ctrl := Components[Idx] as TControl;
          if AnsiSameText(Ctrl.Name, aName) then
          begin
            // found it: send message and bail out
    //        Ctrl.Perform(Msg, WParam, LParam);
    // dessus ne fonctionne ni sous XP ni sous Linux
    // dessous fonctionne seulement avec XP
    // mais pas avec le TLabel, qui n'a pas de hwnd...
            hwnd := Edit1.Handle; // 2 lignes pour tester
            SendMessage(hwnd, Msg, WParam, LParam);
            // Direct call of a message handler, bypassing the message queue.
            Result := True;
            Exit;
          end;
    Tellement dégoûté que j'ai fini par remplacer cette fonction SendMessageToCtrl par celle-ci, en conservant hélas la restriction du TLabel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function TForm1.SendMessageToCtrl2(const hwnd: THandle;
      const Msg: Cardinal; WParam, LParam: Integer): Boolean;
    begin
      Result := False;
      SendMessage(hwnd, Msg, WParam, LParam);
      Result := True;
    end;
    Inutile de préciser que le code du lien fonctionne, sans en changer un seul caractère, du feu de Dieu en... D7, un produit qui a 15 ans d'âge :

    Nom : perform_d7.png
Affichages : 786
Taille : 4,4 Ko

    Ah, cet exe généré sous D7 fonctionne comme on s'y attend, comme sur l'image, sous XP ! Conclusion : Lazarus (ou FreePascal) n'est pas à la hauteur.
    Quant à Lazarus sous Linux, ben, laisse tomber, quoi...

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/06/2016, 20h51
  2. [Lazarus] Sortie de la version 1.6 de l'EDI Lazarus
    Par gvasseur58 dans le forum Lazarus
    Réponses: 15
    Dernier message: 18/05/2016, 17h21
  3. Réponses: 8
    Dernier message: 06/11/2015, 21h06
  4. [Lazarus] Gestion des polices dans l'EDI de Lazarus
    Par ovni76 dans le forum Lazarus
    Réponses: 1
    Dernier message: 19/03/2011, 11h19
  5. [Lazarus / Ubuntu] Quelle fonte pour l'EDI ?
    Par ChPr dans le forum Lazarus
    Réponses: 1
    Dernier message: 02/02/2008, 18h11

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