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

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

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

    Informations forums :
    Inscription : mars 2005
    Messages : 3 234
    Points : 9 311
    Points
    9 311
    Billets dans le blog
    5

    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 10.2 Tokyo Community Edition - CodeTyphon 6.50 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. #62
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : septembre 2015
    Messages : 941
    Points : 2 559
    Points
    2 559
    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

  3. #63
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 806
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2002
    Messages : 2 806
    Points : 4 580
    Points
    4 580

    Par défaut

    salut

    il faut revenir aux fondamentaux

    private : accessible dans toute l'unité ;
    protected : accessible dans toute l'unité et dans les classes enfantes ;
    public : accessible partout ;
    published : comme public, mais avec en plus génération de RTTI pour l'exploitation par l'inspecteur d'objet par exemple.
    Donc tu peux utiliser protected quand tu veux que certaines données/méthodes soient accessibles par la classe ou ses enfants, mais pas le reste.
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  4. #64
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : septembre 2015
    Messages : 941
    Points : 2 559
    Points
    2 559
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par anapurna Voir le message
    salut

    il faut revenir aux fondamentaux

    private : accessible dans toute l'unité ;
    protected : accessible dans toute l'unité et dans les classes enfantes ;
    public : accessible partout ;
    published : comme public, mais avec en plus génération de RTTI pour l'exploitation par l'inspecteur d'objet par exemple.
    Donc tu peux utiliser protected quand tu veux que certaines données/méthodes soient accessibles par la classe ou ses enfants, mais pas le reste.
    Ok d'accord avec ça, mais j'ai bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private
     FFullFileName: String;
    Public
      Property FullFileName: String read FFullFileName;
    et dans les classes enfants

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Public
      Property FullFileName;
    Pour FFullFileName je veux pas et je ne l'utilise pas dans les classes enfants

    La seule et unique fois ou j'y accède c'est ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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;
    • "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

  5. #65
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 806
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2002
    Messages : 2 806
    Points : 4 580
    Points
    4 580

    Par défaut

    salut

    ta property FullFileName doit vouloir y accéder non ?
    Dans les descendant cela plante ... met la variable en protected
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  6. #66
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : septembre 2015
    Messages : 941
    Points : 2 559
    Points
    2 559
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par anapurna Voir le message
    salut

    ta property FullFileName doit vouloir y accéder non ?
    Dans les descendant cela plante ... met la variable en protected
    En ecrivant ces quelques lignes :
    Je vois pas pourquoi normalement cela devrait fonctionner et je ne devrai pas perdre la valeur de ma variable je prend pour exemple :
    Dans ma classe "TGLZCustomImageFileIO" (Avant dernière classe )

    J'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Type
      TGLZCustomImageFileIO = Class(TGLZCustomBitmap)
      protected
        procedure RaiseInvalidImageHeader;
    et le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TGLZCustomImageFileIO.RaiseInvalidImageHeader;
    begin
      raise EGLZInvalidImageHeader.Create('En-tête du fichier : '+ExtractFileName(FullFileName)+#13+#10+
                                                              'au format '+DataFormatDesc.Name+' ('+DataFormatDesc.Desc+') invalide.');
    End; 
    End;
    et lorsque l'exception est levée depuis "TGLZBitmapXPMImage.CheckFormat" (fonction virtuelle, surchargée seulement dans TGLZBitmapXPMImage)
    Note :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Type "TGLZBitmapXPMImage = Class(TGLZCustomImageFileIO)"
    On voit que tout vas bien.

    Nom : 2017-08-25_233818.jpg
Affichages : 272
Taille : 10,3 Ko
    J'ai eu un éclair qui à traversé mon cerveau. Mon erreur ce n'est pas mon objet principal qui charge les données, c'est que je passe par la variable "tempImage" du coup normal que FullFileName soit vide.

    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
     
    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;
    Je vais réfléchir à ce problème. Je vais réorganisé un peu tout ça.

    Bref Pour le coup, le message d'erreur de gdb dans la boite de dialogue de suivi n'est pas très explicite. Ca mériterai d'être un poil plus clair. Je vais m'en souvenir de celui là.

    Merci de votre intérêts à tous.

    EDIT : En plus j'ai la solution sous les yeux avec ce petit commentaire de m... : "// Assign(TGLZBitmap(TempImage));". C'est en forgeant que l'on deviens forgerons, non ?
    • "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

  7. #67
    Rédacteur
    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    mars 2009
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : mars 2009
    Messages : 428
    Points : 1 306
    Points
    1 306

    Par défaut

    Bonjour .

    L'affichage, dans un panel de la barre de statut par exemple, du système cible de la compilation pourrait être utile pour ceux qui font régulièrement des compilations croisées. Cet affichage pourrait être proposé dans les options pour ne pas gêner ceux à qui il n'est pas utile.

    Amicalement,
    naute.

  8. #68
    Membre régulier
    Homme Profil pro
    Inscrit en
    février 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : février 2013
    Messages : 47
    Points : 104
    Points
    104

    Par défaut TRY Except au lieu de finally

    Lorsqu'on entre le mot TRY dans l'IDE, il auto-complète toujours avec finally, mais parfois, c'est Except que je veux.

  9. #69
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : septembre 2015
    Messages : 941
    Points : 2 559
    Points
    2 559
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par Pierre le Grand Voir le message
    Lorsqu'on entre le mot TRY dans l'IDE, il auto-complète toujours avec finally, mais parfois, c'est Except que je veux.
    Pour avoir ce comportement tape trye puis utilise la raccourci clavier CTRL-J
    • "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

  10. #70
    Rédacteur
    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    mars 2009
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : mars 2009
    Messages : 428
    Points : 1 306
    Points
    1 306

    Par défaut Auto-complétion

    Bonjour .

    Dans un TStringList, appelé liste, par exemple, quand on saisie
    Lazarus propose un choix permettant de compléter la commande. Parmi ces choix, il y a Strings.
    Si on clique dessus, la ligne se complète comme suit:
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    liste.String[|];
    IL pourrait être intéressant d'étendre ce concept aux procédures et fonctions.
    Par exemple, après avoir saisi
    ce serait un gain de temps d'avoir la complétion suivante:

    Amicalement,
    naute.

  11. #71
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    7 774
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 7 774
    Points : 11 192
    Points
    11 192

    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 : 153
Taille : 41,8 Ko

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



    Linux Debian FPC 3.0.4 / Laz 1.8.2
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  12. #72
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    7 774
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 7 774
    Points : 11 192
    Points
    11 192

    Par défaut Avoir une aide digne de ce nom ?

    Je l'ai déjà dit, je le dis encore, mais là j'ai la preuve. Je voulais savoir ce qui se cachait sous Canvas.CopyMode, j'ai donc cliqué sur le mot puis F1 dans la 1.8.2 (vous me réveillez si la 1.8.4 a évolué, d'accord ?) :
    Nom : aide_copymode1.png
Affichages : 133
Taille : 10,1 Ko

    OK, donc je suis le lien TCopymode :
    Nom : aide_copymode2.png
Affichages : 135
Taille : 5,4 Ko

    puis le lien Longint :
    Nom : aide_copymode3.png
Affichages : 134
Taille : 5,1 Ko

    et voilà.
    Terminé, plus de liens à suivre.
    Fermez le ban.

    Le temps qu'il m'a fallu pour trouver ça sur le web, caché au milieu de posts où les gens exposent leurs 'blèmes, bref...
    Code text : 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
    cmBlackness Fills the destination rectangle on the canvas with black.
    cmDstInvert Inverts the image on the canvas and ignores the source.
    cmMergeCopy Combines the image on the canvas and the source bitmap by using the Boolean AND operator.
    cmMergePaint Combines the inverted source bitmap with the image on the canvas by using the Boolean OR operator.
     
    cmNotSrcCopy Copies the inverted source bitmap to the canvas.
    cmNotSrcErase Combines the image on the canvas and the source bitmap by using the Boolean OR operator, and inverts the result.
     
    cmPatCopy Copies the source pattern to the canvas.
    cmPatInvert Combines the source pattern with the image on the canvas using the Boolean XOR operator
    cmPatPaint Combines the inverted source bitmap with the source pattern by using the Boolean OR operator. Combines the result of this operation with the image on the canvas by using the Boolean OR operator.
     
    cmSrcAnd Combines the image on the canvas and source bitmap by using the Boolean AND operator.
    cmSrcCopy Copies the source bitmap to the canvas.
    cmSrcErase Inverts the image on the canvas and combines the result with the source bitmap by using the Boolean AND operator.
    cmSrcInvert Combines the image on the canvas and the source bitmap by using the Boolean XOR operator.
    cmSrcPaint Combines the image on the canvas and the source bitmap by using the Boolean OR operator.
    cmWhiteness Fills the destination rectangle on the canvas with white.
    Ben nan, pas "bref", parce que ce fut vraiment laborieux et très time consuming.

    PS : certains ont noté qu'il y avait des approximations dans ce texte, mais n'ont pas dit où...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  13. #73
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    juin 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : juin 2012
    Messages : 1 036
    Points : 2 010
    Points
    2 010

    Par défaut

    Terminé, plus de liens à suivre.
    En effet pas terrible comme aide, mais elle te donne un indice: cmSrcCopy. Donc toutes les valeurs possibles commenceront par cm, en utilisant l'auto complétion on y voit un peu plus clair:
    Nom : copymode.jpg
Affichages : 130
Taille : 33,2 Ko
    et une fois un choix effectué F1 sur le cmquelquechose donne une (trop) petite indication quant à la chose.
    C'est pas terrible mais mieux que rien.

  14. #74
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    7 774
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 7 774
    Points : 11 192
    Points
    11 192

    Par défaut Améliorer l'aide (encore et toujours)

    sur AssignFile en 1.8.2 sous Windows XP :

    Nom : assignfile.png
Affichages : 104
Taille : 14,7 Ko
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  15. #75
    Rédacteur
    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    mars 2009
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : mars 2009
    Messages : 428
    Points : 1 306
    Points
    1 306

    Par défaut

    Bonjour .

    Il est évident que tu as raison, mais il est tout aussi évident que l'aide est loin d'être une priorité des développeurs de Lazarus, alors que ça avait été une réelle qualité des premières versions de Delphi auquel il veut ressembler. C'est d'ailleurs une problématique assez générale dans le monde du libre. C'est sûr que c'est un sacré boulot, mais c'est vraiment dommage de développer un composant de qualité et de le rendre quasiment inutilisable en raison de l'absence de mode d'emploi.

    J'avais installé Jedi sur Delphi 5 mais ça ne m'a servi pratiquement à rien en raison du manque de doc. Des centaines de composants dont on ne sait même pas ce qu'ils font pour une grande partie d'entre eux, et sans même parler de la façon dont ils fonctionnent .

    Je crains qu'il n'y ait malheureusement pas grand chose à faire . En gros, c'est gratuit, on prend ou on ne prend pas. Si on n'est pas content ...

  16. #76
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    7 774
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 7 774
    Points : 11 192
    Points
    11 192

    Par défaut

    Bonjour,

    pas sûr que ça soit la discussion la plus appropriée pour ce que je vais exposer, mais j'en ai assez de voir cette image sur mon Bureau, alors hop !

    Nom : innerouterborder.jpg
Affichages : 67
Taille : 96,2 Ko

    Explication de texte sur l'image : l'ovale orange dans l'aide se passe de commentaire, en fait ; la propriété OuterBorder est introuvable dans l'EDI, aussi bien avec un TLabel qu'avec un TPanel, alors que l'aide parle de TControl sans distinction.

    Découvert en 1.4.0, toujours valide en 1.8.2.

    Bonne journée,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  17. #77
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : septembre 2015
    Messages : 941
    Points : 2 559
    Points
    2 559
    Billets dans le blog
    2

    Par défaut

    Salut
    Outborder correspond à "around (autour) Left,bottom, top, right". "InnerBorder" fonctionne uniquement suivant les 2 propriétés du dessus si je me souviens bien.

    A+
    • "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

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/06/2016, 21h51
  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, 18h21
  3. Réponses: 8
    Dernier message: 06/11/2015, 22h06
  4. [Lazarus] Gestion des polices dans l'EDI de Lazarus
    Par ovni76 dans le forum Lazarus
    Réponses: 1
    Dernier message: 19/03/2011, 12h19
  5. [Lazarus / Ubuntu] Quelle fonte pour l'EDI ?
    Par ChPr dans le forum Lazarus
    Réponses: 1
    Dernier message: 02/02/2008, 19h11

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