Accueil > Forum > > > > Problème affectation dynamique ImageList à un ComboBoxEx.Images
Problème affectation dynamique ImageList à un ComboBoxEx.Images
mardi 16 juin 2009 à 17:31:02 |
Problème affectation dynamique ImageList à un ComboBoxEx.Images

informatixo
|
Bonsoir le forum, J'ai un problème avec le composant ComboBoxEx et plus particulièrement avec sa propriété Images. J'ai créé une procédure qui permet de mettre à jour une ComboBoxEx de façon dynamique (texte + image) dont voici le code simplifié : procedure MiseAJour(var cmbListeDeroulante: TComboBoxEx); var i: Integer; ListeImages: TImageList; Bitmap: TBitmap;
begin try // Permet de créer la liste des images et de la remplir. ListeImages := TImageList.Create(nil); ListeImages.Height := 20; ListeImages.Width := 20; Bitmap:= TBitmap.Create; Bitmap.LoadFromFile('C:\Images\Image1.bmp'); ListeImages.Add(Bitmap, nil); Bitmap.LoadFromFile('C:\Images\Image2.bmp'); ListeImages.Add(Bitmap, nil); Bitmap.LoadFromFile('C:\Images\Image3.bmp'); ListeImages.Add(Bitmap, nil); Bitmap.LoadFromFile('C:\Images\Image4.bmp'); ListeImages.Add(Bitmap, nil); Bitmap.LoadFromFile('C:\Images\Image5.bmp'); ListeImages.Add(Bitmap, nil);
// Permet d'associer la liste d'images à la liste déroulante. cmbListeDeroulante.Images.Assign(ListeImages);
// Permet de nettoyer la liste déroulante dans le cas où il y a déjà des données. cmbListeDeroulante.Clear;
// Permet d'ajouter les éléments dans la liste déroulante. for i := 0 to 4 do cmbListeDeroulante.ItemsEx.AddItem('Image' + IntToStr(i + 1), i, i, -1, -1, nil); finally ListeImages.Free; imgBitmap.Free; end; end;Dans l'exemple ci-dessus j'obtiens un Access violation. J'ai donc essayé cette variante en remplaçant le "Assign" (ligne en vert) : cmbListeDeroulante.Images.AddImages(ListeImages); Mais là, même résultat c'est-à-dire Access violation. J'ai donc pensé que Images n'était pas créé et j'ai donc ajouté cette ligne de code avant le "Assign" (ligne en vert) : cmbListeDeroulante.Images.Create(nil); cmbListeDeroulante.Images.Assign(ListeImages); Et là toujours cet Access violation ! Quelqu'un peut-il m'aiguiller SVP car je ne vois pas pourquoi avec la création j'ai un Access violation ? Merci d'avance pour votre aide. Que la force soit avec vous !
|
|
mardi 16 juin 2009 à 18:05:06 |
Re : Problème affectation dynamique ImageList à un ComboBoxEx.Images

f0xi
|
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls; type TForm1 = class(TForm) ComboBoxEx1: TComboBoxEx; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject);
private fImageList : TImageList; protected procedure UpdateImageList(ComboBox: TComboBoxEx);
public end; var Form1: TForm1; implementation {$R *.dfm} procedure Tform1.UpdateImageList(ComboBox: TComboBoxEx); var I : Integer; BMP: TBitmap; FLN, PTH : String; begin BMP := TBitmap.Create; try ComboBox.ItemsEx.BeginUpdate; try ComboBox.Clear; ComboBox.Images := fImageList;
PTH := 'c:\images\'; for I := 0 to 4 do begin FLN := 'image'+IntToStr(I+1)+'.bmp'; if FileExists(PTH+FLN) then begin BMP.LoadFromFile(PTH+FLN); fImageList.Add(BMP, nil); ComboBox.ItemsEx.AddItem(FLN, I, I, -1, -1, nil); end; end; finally ComboBox.ItemsEx.EndUpdate; end; finally BMP.Free; end; end;procedure TForm1.FormCreate(Sender: TObject); begin fImageList := TImageList.Create(Self); fImageList.Width := 20; fImageList.Height := 20; UpdateImageList(ComboBoxEx1);end;
procedure TForm1.FormDestroy(Sender: TObject); begin fImageList.Free;end;
end.
|
|
mardi 16 juin 2009 à 18:20:33 |
Re : Problème affectation dynamique ImageList à un ComboBoxEx.Images

f0xi
|
Réponse acceptée !
Explications : cela est du au fait que, comme les Evenements, les propriétés du style Images, PopupMenu, Action, ActiveControl, Menu, etc, ne sont la que pour stocker une instance existante d'un objet. voici comme elle sont déclarée : TMaClasse = class private fCompo: TComponent; // Ceci est en fait un pointeur sur l'instance existante d'un composant, il est nil par defaut procedure SetCompo(Value: TComponent); // permet d'effectuer les operations necessaire pour l'assignation a fCompopublic procedure Notification(AComponent: TComponent; Operation: TOperation); override; // permet de gerer la notification de liberation externe de fCompo, sans cela, un appel a fCompo alors // que ce dernier serait libéré provoquerai une erreur dans la classe.
property Component : TComponent read fCompo write SetCompo; // ceci est la propriété visible permettant de "linker" un composant a notre classe.end; procedure TMaClasse.Notification(AComponent: TComponent; Operation: TOperation); begin // si le composant linké se libère on remet fCompo a nil. if (AComponent = fCompo) and (Operation = opRemove) then fCompo := nil; inherited; end; procedure MaClasse.SetCompo(Value: TComponent); begin if fCompo <> Value then begin // Si fCompo etait assigné on lui indique de ne plus prevenir la classe de sa libération
if Assigned(fCompo) then fCompo.RemoveFreeNotification; // on assigne notre nouveau composant ou nil fCompo := Value; // si fCompo est de nouveau assigné, il doit nous prevenir de son eventuelle libération
if Assigned(fCompo) then fCompo.FreeNotification(Self); end; end; Voila, ce genre de propriété permet de linké un composant avec un autre, le Owner ne doit pas, en regles generales, effectuer la creation ou la libération d'une telle propriété. Elles ne servent qu'a pouvoir interragir avec un composant.
|
|
mardi 16 juin 2009 à 23:40:04 |
Re : Problème affectation dynamique ImageList à un ComboBoxEx.Images

informatixo
|
Merci beaucoup foxi pour ta réponse si rapide et si complète, désolé de ne pas avoir pu être aussi réactif ! Donc si j'ai bien compris, la propriété Images du composant ComboBoxEx n'est qu'un pointeur vers un TImageList existant et à la conception ça marche bien puisque les deux sont créés sur la form et que l'on a que besoin de les lier. Hors dans l'hypothèse d'une création dynamique, je suppose qu'il n'y a pas moyen d'assigner un TImageList mais juste de pointer dessus. Je ne mets pas réponse accepté pour ton code car dans mon cas il ne s'applique pas cependant je vais m'en servir pour arriver à mes fins ! En revanche tes explications sont claires et m'ont permis de trouver une solution donc je mets réponses accepté pour ta deuxième réponse. Mon problème est que ma procédure est stockée dans une unité toute simple sans form que j'appelle depuis plusieurs autres form via le uses. Donc si j'ai compris les deux solutions qu'ils me restent sont : - De déclarer dans mon unité un TImageList global que je pourrais lier à la propriété Images par une simple affectation (qui initialisera le pointeur en question) depuis ma procédure
- De créer mon propre composant ComboBoxEx en dérivant de TCustomComboBox pour arriver au résultat souhaité
Pourrais-tu avoir la gentillesse de me dire si je suis sur la bonne voie ? Merci d'avance pour ton aide et encore merci pour l'aide que tu m'as déjà apporté. Que la force soit avec vous !
|
|
mercredi 17 juin 2009 à 04:17:11 |
Re : Problème affectation dynamique ImageList à un ComboBoxEx.Images

f0xi
|
Réponse acceptée !
procedure UpdateImageList(ComboBox: TComboBoxEx; ImageList: TImageList; const ImagesName : array of string); var I : Integer; BMP: TBitmap; begin if (Length(ImagesName) = 0) or (ComboBox = nil) or (ImageList = nil) then Exit;
BMP := TBitmap.Create; try ComboBox.ItemsEx.BeginUpdate; try ComboBox.Clear; ComboBox.Images := ImageList;
for I := Low(ImagesName) to high(ImagesName) do begin if FileExists( ImagesName[I] ) then begin BMP.LoadFromFile( ImagesName[I] ); ImageList.Add(BMP, nil); ComboBox.ItemsEx.AddItem( ImagesName[I] , I, I, -1, -1, nil); end; end; finally ComboBox.ItemsEx.EndUpdate; end; finally BMP.Free; end; end;
|
|
mercredi 17 juin 2009 à 12:20:02 |
Re : Problème affectation dynamique ImageList à un ComboBoxEx.Images

informatixo
|
Merci encore foxi pour ton aide.
Donc mes hypothèses précédentes se vérifie à propos du TImageList.
Je te remercie pour ton dernier code, je vais m'en inspiré pour compléter ma procédure car je veux l'appeler avec uniquement le ComboBoxEx comme paramètre par référence.
Ton aide m'a été vraiment précieuse et tu m'a mis sur la bonne voie alors je t'en remercie.
A plus au détour d'un autre post ...
Que la force soit avec vous !
|
|
mercredi 17 juin 2009 à 16:17:06 |
Re : Problème affectation dynamique ImageList à un ComboBoxEx.Images

Bacterius
|
@f0xi : tu écris dans ton premier commentaire que tu crées dynamiquement ton TImageList de la façon suivante :
fImageList := TImageList.Create(self);
Mais tu le libères dans le OnDestroy, alors que tu définis la fiche comme propriétaire de l'objet. N'est-ce pas superflu de libérer cet enfant alors que la fiche, à sa fermeture, devrait s'en occuper ? J'aimerais être fixé sur ce point car j'ai toujours des doutes sur la libération des objets enfants/parents.
Cordialement, Bacterius !
|
|
mercredi 17 juin 2009 à 22:40:01 |
Re : Problème affectation dynamique ImageList à un ComboBoxEx.Images

f0xi
|
non, on libere toutes les ressources créées manuellement de façon manuelle. si je crée un objet, je libere ce dernier. je ne laisse pas un autre composant s'occuper de sa liberation, SAUF si ce composant saitle faire, peux le faire et le fait car il est prevus pour ça. en aucuns cas je ne laisse le ramasse miette le faire, en aucuns cas je laisse les composant se drebrouiller entre eux
|
|
jeudi 18 juin 2009 à 12:04:11 |
Re : Problème affectation dynamique ImageList à un ComboBoxEx.Images

Bacterius
|
D'accord.
Cordialement, Bacterius !
|
|
jeudi 18 juin 2009 à 13:10:32 |
Re : Problème affectation dynamique ImageList à un ComboBoxEx.Images

Guillemouze
|
Petite précision sur la source de la violation d'accès : // Permet d'associer la liste d'images à la liste déroulante. cmbListeDeroulante.Images.Assign(ListeImages);
Comme l'a dit foxi, "cela est du au fait que les propriétés du style Images [...] ne sont la que pour stocker une instance existante d'un objet.", la propriété Images n'est qu'un lien vers ton instance. Il est donc nil à l'origine. Le code qui tente donc d'être exécuté est : nil.Assign(ListeImages); d'où l'access violation.
|
|
Cette discussion est classée dans : images, bitmap, nil, listeimages, cmblistederoulante
Répondre à ce message
Sujets en rapport avec ce message
pb lors de la sauvegarde de grandes images [ par ericamiens ]
salut à tous, mon problème est le suivant :lors de la création d'images JPG, j'ai l'erreur JPEG n° 36 lorsque les dimensions sont trop importantes (ex
comparaison de deux images bitmap [ par kamicaz2002 ]
aidez moi sur la comparaison de deux images bmp si elle sont simelaire ou bien non. notre images sources et l'autre sont deux images de main sur un f
Enregistrement d'une image depuis internet. [ par Eithne ]
Bonjour ! Je développe actuellement une application qui récupère des images à partir d'internet grâce à la fonction UrlDownloadToFile(nil, PChar (sou
Images [ par AEC1 ]
Bonjours, j'aimerais savoir pourquoi quand on sélectionne une image BMP, JPG, ICO etc... elle s'affiche bien dans le composant TImage alors que je tra
AIDE A/S: DÉFILEMENT D'UN TEXTE SOUS FORME D'IMAGE SUR UN AFFICHEUR À LEDS [ par zwail1 ]
Salut aux utilisateurs de cet espace ! Je suis un débutant en DELPHI J essaye de travailler un soft pour défiler du texte sur un tableau d affichage (
fermer fenetre DOS apres fin processus [ par skiso ]
j'utiliser cette fonction pour excuter mon programe sous dos : CreateProcess(nil,PChar('cmd.exe /k go.exe '),nil,nil,True,0,nil,nil,Si,Pi); et cette
Comparaison d'images successives [ par Nitro1217 ]
Bonjour à tous, Je suis tout nouveau sur le forum et étant très débutant sur Delphi, je me permets de vous demandez un peu d'aide sur la réalisation
cryptage des images avec matlab [ par MaherElbahri ]
Bonsoir tout le monde. Est ce que l'un d'entres vous peut me montrer un petit code source matlab sur la façon de crypter un texte et une image avec la
Imprimer un bmp avec Rave [ par gpletinckx ]
Bonjour, J'ai créé un programme qui imprime automatiquement une entête sur une lettre; entête au format bmp. Mon code est le suivant: Begin Bitmap :
recuperer des images cryptees [ par tekin88 ]
bonjour,je suis nouveau dans le forum,je ne connais pas encore tres bien son fonctionnement,mon probleme est:j'avais crypte des images de formats jpeg
Livres en rapport
|
Derniers Blogs
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|