Results 1 to 14 of 14

Thread: load image in component

  1. #1

    Lightbulb load image in component

    Ik ben bezig met een report designer, en wil op de bands icons weergeven wat het wat duidelijker maakt (naast de caption) wat voor band het is. Nu zou ik graag de icons voor die bands in de component zelf laden. Ik weet hoe ik afbeeldingen kan laden in een applicatie uit de resource, maar ik weet niet of dit ook kan in een component. Is er iemand die mij hier het antwoord op kan geven? Ik heb al zitten zoeken maar kan er niet zo snel iets over terug vinden - en heb zelf geen voorbeeld waar ik kan vinden hoe dit zou kunnen werken.

    Hieronder een preview van hoe de report designer eruit ziet, met de bands - de eerste band heb ik nu designtime een icon geladen, maar zou dit graag in de constructor van de component doen, en dan voor elke band de respectievelijke icon die bij die band hoort.

    Click image for larger version. 

Name:	REPORT.png 
Views:	77 
Size:	42.9 KB 
ID:	8187
    Last edited by Reidinga; 31-Aug-21 at 16:39. Reason: Toevoeging van afbeelding

  2. #2
    Ok, en waar loop je vast?
    Je kan designtime afbeeldingen laden in bijvoorbeeld TImage. Dit lijkt me net zoiets, maar dan met meerdere images? Of bedoel je niet dat de gebruiker van het component de afbeeldingen moet kiezen?
    1+1=b

  3. #3
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Dat werkt voor een visueel component exact hetzelfde als voor een programma. De resources van een in de IDE geregistreerd component zijn design time ingeladen, en de HInstance variabele verwijst design time naar de instantie van de IDE.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  4. #4
    Nou ik zou inderdaad de afbeedingen voor de bands laden in de constructor. Zo dat er standaard al een icon is voor elke band, en deze zijn dan te overriden door er een andere icon in te laden.

  5. #5
    Meer een functioneel vraagje: Worden die icons geprint met je rapport? Zitten mensen daarop te wachten, en zouden de icons dan standaard in ieder geval niet leeg moeten zijn?
    En zou je zoiets niet liever oplossen door de ontwerper een los image component op het rapport te laten zetten, net zoals je straks, neem ik aan, ook teksten op je rapport gaat zetten?
    Het lijkt me dat je die bands veel te ingewikkeld maakt door zo'n specifieke optie daarin te implementeren.

    Dat terzijde is het me nog steeds niet duidelijk waar je nou vastloopt. Je weet blijkbaar dat je ze in de constructor wilt laden, je weet hoe dat moet uit resources, je kan in de VCL spieken hoe dat kan via de object inspector, als je dat überhaupt wilt..
    1+1=b

  6. #6
    Nee die bands zijn enkel zichtbaar in de design modus - in de preview en op de print zijn deze bands niet zichtbaar. Deze icons gaan dus enkel zichtbaar zijn als de gebruiker de rapport ontwerpt. Nu de reden dat ik dit vraag - is omdat ik dit als een basis gebruik voor oa ook label design, en voor een ander programma. Ik heb nu ook afbeeldingen gemaakt voor elk type band, wat uiteindelijk voor de gebruikers herkenbaar zal zijn. Ik kan natuurlijk in de applicatie die icons toezijzen, maar zou graag hebben als ik dit component op een form drop dat deze icons er al in staan en ik niet in elke applicatie / project deze elke keer opnieuw er handmatig moet in laden.

  7. #7
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,084
    Bedoel je zoiets:

    een speedbutton krijg een image uit de resource toegewezen.


    Delphi Code:
    1. With FPinButton Do
    2.     Begin
    3.       Glyph.LoadFromResourceName(HInstance, SPinButtonBmpResName);
    4.       GroupIndex := -1;
    5.       AllowAllUp := True;
    6.       Down := Not FAutoHide;
    7.       Anchors := [AkTop, AkRight];
    8.       SetBounds(DefWidth - DefPinButtonSize - DefMargin, DefMargin, DefPinButtonSize, DefPinButtonSize);
    9.       OnClick := PinButtonClicked;
    10.       Flat := True;
    11.       Parent := Self;
    12.     End;
    10.4.2, Delphi2010, of Lazarus 2.2.0

  8. #8
    Ja, en kan ik dan gewoon een RES file toevoegen aan mijn package en die daaruit lezen? Of moet ik die dan in de resource van de uiteindelijke applicatie zetten?

  9. #9
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,084
    Die kan je in je project meecompileren, in het menu onder project zit resources, daar je de bmp's toevoegen
    10.4.2, Delphi2010, of Lazarus 2.2.0

  10. #10
    En je moet ze ook in de uiteindelijke applicatie hebben, ja. Maar als je een unit hebt die die res file meeneemt, en je gebruikt die unit in de uiteindelijke applicatie, dan komt de resource dus in die applicatie terecht. Denk overigens goed na over de naam van die resources. Ik kan me voorstellen dat mensen zich ergeren aan een naam als 'MAIN_ICON' voor het icon van de main band, bijvoorbeeld.
    1+1=b

  11. #11
    Ik heb het nu opgelost door de Images (PNG) aan de package toe te voegen, en deze worden in de component constructor geladen met deze procedure;
    Delphi Code:
    1. procedure LoadPNGImage(const ResourceId: Integer; const Picture: TPicture);
    2.   var
    3.     PNG: TPNGImage;
    4.   begin
    5.     PNG := TPNGImage.Create;
    6.     try
    7.       PNG.LoadFromResourceID(FindClassHInstance(TERDReportDesignerBase), ResourceId);
    8.       Picture.Assign(PNG);
    9.     finally
    10.       PNG.Free;
    11.     end;
    12.   end;

    Ik had geprobeerd om ze te laden met de resource name, maar dan blijf ik een error krijgen - dus heb deze veranderd naar een ID en nu werkt het wel. Ik weet niet of er "gereserveerde" ID's zijn waar ik rekening mee moet houden? Zodat deze niet vervangen worden door een andere package?

  12. #12
    Vreemde is dat de images prima geladen worden in Delphi, de PNG's staan dan ook in de BPL maar als ik deze gebruik in een test applicatie, zie ik dat de resource PNG's uit de BPL niet in de Exe worden gezet, en krijg bijgevolg een melding dat de resource niet gevonden kan worden. Nu zou dit prima op te lossen zijn door zoals hierboven aangegeven deze images ook aan de Exe resource toe te voegen. Ik vraag mij alleen af of er een mogelijkheid is dat dit automatisch wordt meegenomen vanuit de BPL?
    Last edited by Reidinga; 02-Sep-21 at 17:02.

  13. #13
    Ja, kans op. Sommige zijn gereserveerd door bijvoorbeeld Windows (zoek op MAKEINTRESOURCE in de Windows unit), maar elk ander package kan natuurlijk id's hergebruiken.

    Ik denk dat strings daarom veiliger zijn, omdat je die makkelijker uniek kan maken. Iemand anders zal z'n resource misschien niet zo snel "REIDINGA_REPORT_MAIN_BAND_ICON" noemen.

    Maar ja "een error" is ook lastig
    1+1=b

  14. #14
    Ja inderdaad ik zou liever resource names gebruiken - maar weet niet goed waarom hij ze niet wilt laden met de naam maar wel met een id, ik ga eens zoeken of er limieten zijn aan de ID's en welke gereserveerd zijn. Misschien kan ik het op MSDN vinden

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •