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

Composants VCL Delphi Discussion :

[VCL] Copié/collé d'un calque dans un TImgView


Sujet :

Composants VCL Delphi

  1. #1
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut [VCL] Copié/collé d'un calque dans un TImgView
    Bonjour,

    Je travaille avec les composants Tgraphics32.
    J'ai un imgView32 sur lequel je pose des calques (layers) de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L := TPositionedLayer.Create(ImgView.Layers);
    Ensuite, je renseigne divers paramètres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    L.Location := FloatRect(W,H,W+60,H+60);
    L.Scaled := True;
    L.MouseEvents := True;
    L.Tag := lTabElements;
    L.OnMouseDown := LayerMouseDown;
    L.OnPaint := dessineLayer;
    Tout marche très bien mais j'aimerais pouvoir faire un copier/coller d'un de ces calques et je n'y arrive pas, il me fait des erreurs de memoires si je fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    L := TPositionedLayer.Create(ImgView.Layers);
    L.Assign(FSelCopier); // Qui est une copie du calque en memoire
    Comment duliquer simplement un calque sur un imgView ?

    Merci d'avance.

  2. #2
    DMO
    DMO est déconnecté
    Membre chevronné
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Par défaut
    Salut Dacid,

    Ton code est correct. Malheureusement le problème est que ni TPositionedLayer, ni TCustomLayer n'ont implémenté Assign() ou AssignTo().

    Tu peux donc faire un descendant de TPositionnedLayer dans lequel tu peux définir le Assign() pour faire ce que tu veux, puis ne créer que ta classe perso. Ou bien tu peux faire une simple routine ayant deux TPositionnedLayer en paramètre.

    En tous les cas c'est à faire à la main. Désolé.

    Bon dev'

  3. #3
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Bonjour DMO,

    Bouhou, ta réponse est celle que j'esperait le moins voir.
    Bon, il va falloir se retrousser les manches.

    Pour l'affectation des méthodes et propriétés, existe-t-il (comme en javascript) une variable qui contient toutes les propriétés d'un objet pour boucler ?

    Genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Pour chaque propriété de TPositionedLayer faire
       L.propriété[i] := TPositionedLayer.propriété[i];
       L.methode[i] := TPositionedLayer.methode[i];
    fin faire
    En fait, comment est fait un assign() normalement ?

  4. #4
    DMO
    DMO est déconnecté
    Membre chevronné
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Par défaut
    Salut Dacid,

    Je trouve très bien que tu essayes de faire cela le plus intelligemment possible 8)

    Cependant pour ce cas bien prècis je ne vois pas comment cela peut se faire autrement. Il existe avec Delphi encore mieux que ce que tu suggères avec Javascript, je veux parler des informations de type à l'exécution (RTTI). Nous pourrions effectivement utiliser cela pour faire un Assign très générique, mais le problème est que ça n'est fait pour foncionner qu'avec les propriétés publiées, et non pas simplement publiques comme dans notre cas.

    Reste donc à implémenter un Assign() d'un descendant ou à faire une routine d'assignation spécifique AssignerPositionnedLayer(Source, Dest .....).

    Ceci dit j'ai pu ne pas penser à une solution plus élégante que d'autres s'empresseront alors de venir indiquer ici.

    Bon dev'

  5. #5
    DMO
    DMO est déconnecté
    Membre chevronné
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Par défaut
    oops j'oubliais de répondre à ceci : tu trouveras de nombreux modéles d'Assign dans la VCL.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TStatusPanel.Assign(Source: TPersistent);
    begin
      if Source is TStatusPanel then
      begin
        Text := TStatusPanel(Source).Text;
        Width := TStatusPanel(Source).Width;
        Alignment := TStatusPanel(Source).Alignment;
        Bevel := TStatusPanel(Source).Bevel;
        Style := TStatusPanel(Source).Style;
      end
      else inherited Assign(Source);
    end;

  6. #6
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Ok, il reprends les propriétés et méthodes une à une de la source en fait.
    Il n'y a pas d'assign() générique...

    Il n'y a pas moyen de lui faire croire que c'est un autre composant similaire (qui a a peu près les mêmes méthodes et propriétés) qui a bien un assign d'implémenté ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TStatusPanel(L).assign(TStatusPanel(FSelCopier))
    Le StatusPanel est un peu trop différent de mon TpositionLayer mais on doit bien en trouver un plus comparable.

    Et si je faisait tout simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tcomponent(L).assign(Tcomponent(FSelCopier))
    Ca ne marcherais pas ? (je n'ai pas accès à Delphi pour le moment)

  7. #7
    DMO
    DMO est déconnecté
    Membre chevronné
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Par défaut
    Citation Envoyé par dacid
    Il n'y a pas moyen de lui faire croire que c'est un autre composant similaire
    Non.

    Voici comment auraient dû être implémentés les assign dans l'unité GR32_Layers pour que tu n'ais même pas à poster quoi que ce soit ici :

    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
      TCustomLayer = class(TNotifiablePersistent)
      ...
      public
        ...
        procedure Assign(Source: TPersistent); override;
        ...
      end;
     
      TPositionedLayer = class(TCustomLayer)
      ...
      public
        ...
        procedure Assign(Source: TPersistent); override;
        ...
      end;
     
    implementation
     
    ...
     
    { TCustomLayer }
     
    ...
     
    procedure TCustomLayer.Assign(Source: TPersistent);
    begin
      if Source is TCustomLayer then
        with TCustomLayer(Source) do
          begin
            Self.Cursor := Cursor;
            Self.Index := Index;
            Self.LayerCollection := LayerCollection;
            Self.LayerOptions := LayerOptions;
            Self.MouseEvents := MouseEvents;
            Self.Tag := Tag;
            Self.Visible := Visible;
            Self.OnDestroy := OnDestroy;
            Self.OnHitTest := OnHitTest;
            Self.OnPaint := OnPaint;
            Self.OnMouseDown := OnMouseDown;
            Self.OnMouseMove := OnMouseMove;
            Self.OnMouseUp := OnMouseUp;
          end
      else
        inherited;
    end;
     
    ...
     
    { TPositionedLayer }
     
    ...
     
    procedure TPositionedLayer.Assign(Source: TPersistent);
    begin
      if Source is TPositionedLayer then
        with TPositionedLayer(Source) do
          begin
            Self.Location := Location;
            Self.Scaled := Scaled;
          end;
     
      inherited;
    end;
     
    ...
    Partant de là, et puisque sur le principe il ne faut pas modifier ces composants, je te laisse en déduire le assign à faire pour ton descendant de TPositionedLayer, c'est à dire l'addition des ces deux assign.

    Bon dev'

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/08/2008, 14h05
  2. Réponses: 5
    Dernier message: 10/04/2008, 09h09
  3. Réponses: 1
    Dernier message: 07/01/2006, 23h33
  4. [C#] Copie d'un texte selectionner dans un control
    Par Khrysby dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/12/2005, 09h55
  5. VCL de Crystal Report pour utilisation dans C++Builder
    Par dibak dans le forum C++Builder
    Réponses: 4
    Dernier message: 16/02/2004, 17h04

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