Composant : TImage dans un TScrollBox [Résolu]

Utilisateur anonyme - 4 nov. 2007 à 11:40 - Dernière réponse :  Utilisateur anonyme
- 6 nov. 2007 à 13:59
Salut à tous

Je suis entrain de réaliser un composant héité d'un TScrollBox permettant d'afficher horizontalement une liste d'image via un composant dérivé d'un TImage. En posant le composant sur une fiche, je peux ajouter une suite d'image : tout se passe bien (On voit bien les images). Seulement lors de la compilation, les images disparaissent. J'ai essayé de jouer avec le repaint et le refresh mais ca ne change rien.

Voila le source :

unit SpectrumLine;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Forms, SpectrumImage,Graphics;

type

  TSpectrumLine = class;
  TSpectrumLineCnt = class;
  TSpectrumImageLine=class;
 
  {TSpectrumImageLine}
  TSpectrumImageLine=class(TCollectionItem)
  protected
    FSpectrumImage:TSpectrumImage; //Composant dérivé du TImage
  public
    constructor Create(ACollection: TCollection); override;
    destructor Destroy; override;
  published
    property SpectrumImage : TSpectrumImage Read FSpectrumImage Write FSpectrumImage nodefault;
  end;

  {TSpectrumLineCnt}
  TSpectrumLineCnt = class(TOwnedCollection)
  protected
    function GetItem(Index: integer): TSpectrumImageLine;
    procedure SetItem(Index: integer; Value: TSpectrumImageLine);
  public
    constructor Create(AOwner: TSpectrumLine);
    function Add: TSpectrumImageLine;
    property Items[Index: integer]: TSpectrumImageLine Read GetItem Write SetItem;
  end;

{TSpectrumLine}
  TSpectrumLine = class(TScrollBox)
  private
    FSpectrumLineCnt:TSpectrumLineCnt;
    fCanvas: TControlCanvas;
  protected
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property SpectrumImages : TSpectrumLineCnt Read FSpectrumLineCnt Write FSpectrumLineCnt nodefault;
  end;

Var
  FSpectrumLine:TSpectrumLine; 
 
procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('TestImageMusic', [TSpectrumLine]);
end;

{TSpectrumLine}
constructor TSpectrumLine.Create(AOwner: TComponent);
Begin
  Inherited;
  Parent := TWinControl(AOwner);
  fcanvas:=TControlCanvas.Create;
  fCanvas.Control:=Self;
  FSpectrumLine:=Self; 
  FSpectrumLineCnt := TSpectrumLineCnt.Create(Self);
End;

Destructor TSpectrumLine.Destroy;
Begin
  fcanvas.Free;
  FSpectrumLineCnt.Clear;
  FSpectrumLineCnt.Free;
  Inherited;
End;

{TSpectrumLineCnt}
constructor TSpectrumLineCnt.Create(AOwner: TSpectrumLine);
begin
  inherited Create(AOwner,TSpectrumImageLine);
end;

function TSpectrumLineCnt.Add:TSpectrumImageLine;
begin
  Result := TSpectrumImageLine(inherited Add);
end;

function TSpectrumLineCnt.GetItem(Index: integer): TSpectrumImageLine;
begin
  Result := TSpectrumImageLine(inherited Items[Index]);
end;

procedure TSpectrumLineCnt.SetItem(Index: integer; Value: TSpectrumImageLine);
begin
  inherited SetItem(Index, Value);
end;

{TSpectrumImageLine}
constructor TSpectrumImageLine.Create(ACollection: TCollection);
begin
  inherited Create(ACollection);
  FSpectrumImage:=TSpectrumImage.Create(FSpectrumLine);
  With FSpectrumImage Do
    Begin
      Parent:=FSpectrumLine;
      Top:=Round(0.1*FSpectrumLine.Top);
      Height:=Round(0.9*FSpectrumLine.Height);
    End;
end;

destructor TSpectrumImageLine.Destroy;
begin
  FSpectrumImage.Free;
  inherited Destroy;
end;

Merci pour le coup de main
Afficher la suite 

Votre réponse

16 réponses

Meilleure réponse
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 5 nov. 2007 à 11:59
3
Merci
T'as regardé dnas le .dfm si l'image est bien présente ?
Logiquement oui, donc c'est un problème de chargement... mais je ne peux pas t'en dire plus...

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body

Merci florenth 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de florenth
Meilleure réponse
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 5 nov. 2007 à 15:00
3
Merci
Ca marche avec une fiche: donc ton  TSpectrumImage enregistre bien son image dans le .dfm et le recharge correctement.
Dans un TScrollBox, ça marche aussi : ça confirme ce que je viens de dire !

Ca ne marche pas ton ton dérivé de TScrollBox: ça veut dire que ce composant ne "déclare" pas son contenu à Delphi pour qu'il l'enregistre. Par contre, comment faire, je n'en sais rien. Normalement, TCollection se charge de tout.

Mais par contre, tu as oublié la méthode Assign().

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body

Merci florenth 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de florenth
Meilleure réponse
Utilisateur anonyme - 6 nov. 2007 à 00:22
3
Merci
T'as vu Flo : Regarde moi tout ces dégonflés, Japee, Cari, Cirec, f0xi, Kenavo,  Delphiprog et toute la clique, ils sont partis se bouffer de Kinders pendant que nous on taffe. Quand à Jean_Jean il doit encore se tricotter une paire de chaussette. C'est du propre tient. Oh les copains on a besoin de vous

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 4 nov. 2007 à 16:56
0
Merci
Salut !

C'est quand même rigolo (ça dépend pour qui )que ça marche à la conception, mais pas à l'exécution... en principe c'est l'inverse.

Je n'ai pas de réponse mais plutôt une question (mais qui a son utilité ^^): c'est quoi cette variable globale FSpectrumImage
Je suis quasi-sûr que le problème vient d'ici, l'initialisation des variables ne devant pas être le même entre conception et exécution.

Dans tous les cas, c'est une bien étrange idée de donner un parent global à des enfants comme tu le fais...

Moi j'aurais fait en sorte que le owner et parent soient transmis dans le constructeur de TSpectrumImageLine.
Mais comme ce n'est pas possible (car tu dois respecter le schéma de TCollectionItem), alors j'aurais mis (comme tu as eu la bonne idée de choisir un TOwnedCollection):

<hr size= "2" width="100%" />constructor TSpectrumImageLine.Create(ACollection: TCollection);
var
  Line: TSpectrumLine;
begin
  inherited Create(ACollection);
  Line := AColleciton.Owner as TSpectrumLine;
  FSpectrumImage:=TSpectrumImage.Create( Line );
  With FSpectrumImage Do
    Begin
      Parent: =Line;
      Top:= Round(0.1* Line .Top);
      Height: =Round(0.9*Line.Height);
    End;
end;
<hr size="2" width="100%" />
A voir si ça marche ou pas... enfin... si ça résout le problème.

++
Flo

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.net
Commenter la réponse de florenth
Utilisateur anonyme - 4 nov. 2007 à 20:57
0
Merci
Merci Flo pour ta réponse,

J'ai modifié la partie que tu as souligné mais cela n'a rien changé.

Voila le test que j'ai fais : j'ai remplacé le composant SpectrumImage par un simple TImage comme ceci :

  {TSpectrumImageLine}
  TSpectrumImageLine=class(TCollectionItem)
  protected
    FImage:TImage;
  public
    constructor Create(ACollection: TCollection); override;
    destructor Destroy; override;
  published
    property AImage : TImage Read FImage Write FImage nodefault;
  end;

Le meme phénomène se produit : A la conception aucun problème mais lors de la compilation le picture disparait (Ki m'énerve celui la)
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 4 nov. 2007 à 21:33
0
Merci
Bon je viens d'aller plus loin dans les test .

En rajoutant FImage.Picture.LoadFromFile('C:\MyFile.bmp'); l'image est présente à la conception et à la compilation. Il semblerait donc que le picture est vidé lors de la compilation ce qui est hallucinant.
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 5 nov. 2007 à 13:25
0
Merci
Effectivement l'image n'est pas dans le dfm et je capte pas pourquoi. Si quelqu'un sait le pourquoi du comment et a une solution simple je suis prenneur
Commenter la réponse de Utilisateur anonyme
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 5 nov. 2007 à 14:43
0
Merci
En fait, comme je te le disai spar mail, il va falloir jouer avec la surcharge de DefineProperties.
Voir une exemple simplifié ici: http://delphi.developpez.com/faq/?page=langcompilation#tableauxdansdfm

Sinon, rien de bien compliqué.

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
Commenter la réponse de florenth
Utilisateur anonyme - 5 nov. 2007 à 14:49
0
Merci
Salut Flo,

J'avais regardé mais je ne vois pas bien comment je peux l'utiliser à vrai dire.

Commence à me taper sur le système ce composant : Cari file moi un Kinder-Suicide pleazzzeeee
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 5 nov. 2007 à 14:51
0
Merci
Hummmm,

Je capte pas un truc : Pourquoi mon composant TSpectrumImage (idem pour le TImage) fonctionne nickel sur une fiche et plante avec le TScrollBox.

Autre test que j'avais fais : coller un TImage ou un TSpectrumImage directement sur mon TScrollBox. ET là lors de la compilation aucun problème.
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 5 nov. 2007 à 15:07
0
Merci
Bon on va sortir la grosse Berta (C'est qui celle la ? Une copine à Japee ) mais avant deux questions :

*"tu as oublié la méthode Assign()." : tu veux dire quoi exactement ?

*Si je fusionne les deux composants (autrement dit si je fais des imbrications de TCollection) est ce que cela va supprimer le probleme ?
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 5 nov. 2007 à 15:17
0
Merci
Tiens tiens : je viens de constater un truc. Les évènements du TImage (ou le compo dérivé) ne s'affichent pas dans l'inspecteur d'objet.

Ca devient de plus en plus du n'importe quoi
Commenter la réponse de Utilisateur anonyme
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 5 nov. 2007 à 15:24
0
Merci
La méthode Assign() de tes TCollectionItem, ici de ton TSpectrumImageLine, pour que tu puisse copier les objets au chargement (c'est fait par delphi)(normalement).



Moi j'aurais un conseil à te donner: oublie le Design-Time
et fait tout en Run-Time. Les utilisateurs de ton futur programment ne verront rien, ils n'ont pas Delphi !
C'est pas non plus impossible d'écrire quelques lignes de code au lieu de s'embêter à dire à ce p*** d'inspecteur d'objets ce qu'il doit afficher !
Pour les images, tu les met en ressources et tu les charge au démarrage.

Quand à Berta, je sais pas si elle pourra t'aider, mais essaye toujours !!

++

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
Commenter la réponse de florenth
Utilisateur anonyme - 5 nov. 2007 à 15:30
0
Merci
Oublie le Design-Time ? Et comment je fais pour mon deal de Kinder Suicide avec Cari ? T ' en as de bonnes toi .

Non non je ne veux pas l'oublier : je me suis fais suffisamment ch.... pour en arriver jusque là, je ne vais pas laisser tomber aussi pres du but.

De plus je n'ai pas finis et débeuguer le compo en Run-Time : aie aie aie

Non de mais, je vais y arriver
Commenter la réponse de Utilisateur anonyme
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 6 nov. 2007 à 12:28
0
Merci
Salut

Sans garantie aucune ...
Essaye en supprimant la valeur NoDefault de la propriété SpectrumImage
 {TSpectrumImageLine}
TSpectrumImageLine= Class (TCollectionItem)
Protected
FSpectrumImage:TSpectrumImage; //Composant dérivé du TImage
Public
Constructor Create(ACollection: TCollection); Override;
Destructor Destroy; Override;
Published
Property SpectrumImage : TSpectrumImage Read FSpectrumImage Write FSpectrumImage {nodefault};
End;




<center>Highlighted with Pas2HTML </center>







 






@+
Cirec





<hr siz ="" />
Commenter la réponse de Cirec
Utilisateur anonyme - 6 nov. 2007 à 13:59
0
Merci
Salut Cirec,

J'ai testé ton idée mais nope que nenni.

Merci quand meme.
Commenter la réponse de Utilisateur anonyme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.