Composant : TImage dans un TScrollBox

Résolu
Utilisateur anonyme - 4 nov. 2007 à 11:40
 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

16 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
5 nov. 2007 à 11:59
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
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
5 nov. 2007 à 15:00
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
3
Utilisateur anonyme
6 nov. 2007 à 00:22
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
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
4 nov. 2007 à 16:56
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
4 nov. 2007 à 20:57
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)
0
Utilisateur anonyme
4 nov. 2007 à 21:33
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.
0
Utilisateur anonyme
5 nov. 2007 à 13:25
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
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
5 nov. 2007 à 14:43
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
0
Utilisateur anonyme
5 nov. 2007 à 14:49
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
0
Utilisateur anonyme
5 nov. 2007 à 14:51
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.
0
Utilisateur anonyme
5 nov. 2007 à 15:07
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 ?
0
Utilisateur anonyme
5 nov. 2007 à 15:17
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
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
5 nov. 2007 à 15:24
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
0
Utilisateur anonyme
5 nov. 2007 à 15:30
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
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
6 nov. 2007 à 12:28
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 ="" />
0
Utilisateur anonyme
6 nov. 2007 à 13:59
Salut Cirec,

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

Merci quand meme.
0
Rejoignez-nous