Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bild in Imagelist durch ein anderes Ersetzen - zur Laufzeit (https://www.delphipraxis.net/179189-bild-imagelist-durch-ein-anderes-ersetzen-zur-laufzeit.html)

matashen 19. Feb 2014 13:17

Bild in Imagelist durch ein anderes Ersetzen - zur Laufzeit
 
Hallo,


siehe Titel.
Wie geht das. Ich such jetzt schon seit einer Stunde im Netz rum, ein Bild zur Laufzeit hinzufügen OK geht mit AddMasked, aber wie tausch ich eins zur Laufzeit aus?

Gruß Matthias

alleinherrscher 19. Feb 2014 13:25

AW: Bild in Imagelist durch ein anderes Ersetzen - zur Laufzeit
 
Was ist mit ImageList.Replace?

Code von: http://www.delphigroups.info/2/9/640652.html

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
Bitmap: TBitmap;
begin
Bitmap := TBitmap.Create;
try
  Bitmap.PixelFormat := pf32bit;
  Bitmap.Width := ImageList1.Width;
  Bitmap.Height := ImageList1.Height;
  Bitmap.Canvas.Brush.Color := clGreen;
  Bitmap.Canvas.FillRect(Rect(0, 2, 16, 14));
  ImageList1.Replace(0, Bitmap, nil);
finally
  Bitmap.Free;
end;
end;

matashen 19. Feb 2014 13:32

Erledigt AW: Bild in Imagelist durch ein anderes Ersetzen - zur Laufzeit
 
Ah danke,

Es könnte ja so einfach sein.

Die Funktion kannte ich nicht und habs wohl übersehen.

Dankeschön

BGHake 5. Okt 2014 18:04

AW: Bild in Imagelist durch ein anderes Ersetzen - zur Laufzeit
 
Hallo zusammen

Ich habe dazu auch eine Frage.

Wie kann ich in einem ImageList zur Laufzeit ein "png" Bild auswechseln ?
ImageList1.Replace(0, Bitmap, nil); benötigt eine Bitmap...

Ich habe schon fast alles versucht, aber em muß doch eine einfache Lösung dazu geben !

Vielen Dank im Voraus
Gruß Bernd

mkinzler 5. Okt 2014 18:12

AW: Bild in Imagelist durch ein anderes Ersetzen - zur Laufzeit
 
Mit welcher Komponente lädst Du das Png?

himitsu 5. Okt 2014 18:31

AW: Bild in Imagelist durch ein anderes Ersetzen - zur Laufzeit
 
Eine TImageList beinhaltet nunmal ausschließlich nur Bitmaps/Icons. Denn das Ding ist "nur" eine Schnittstelle zur entsprechenden Windows-Komponente, welche man beim Bei Google suchenImageList_Create rausbekommt.

Ob nun der Bilderlisten-Editor der VCL auch den Import von anderen Grafikformaten anbietet ist davon unabhängig.
Die API bietet jedoch nur den Import von Bitmap/Icon (Bei Google suchenImageList_Replace, Bei Google suchenImageList_LoadImage, Bei Google suchenImageList_AddIcon usw.) an
und wenn Emba in seiner Komponente es nicht einbaut auch andere Grafikformate anzubieten, was vollkommen verständlich ist diese Komponenten standardmäßig immer in alle Programme einzubinden, dann hast du eben Pech und mußt diese Grafiken eben selber laden, in TBitmap (Image und Mask, bei Transparenzen) umwandeln und dann entsprechend zu übergeben.


Wenn es möglich wäre mehrere ClassHelper an einen Typen zu binden, dann könnte man in die Units der jeweiligen PNG/JPEG/GIF-Komponenten die entsprechenden Lade-/Zugriffsfunktionen für TImageList, TPicture und Co. nachrüsten.



Diue FMX-ImageList wird intern wohl alles selber machen, weswegen dort andere Spielregel gelten, aber auch dort wäre es "blöd", wenn man dort alle in Delphi vorhandenen Grafikformate direkt anbietet. (man könnte dessen Schnittstelle aber als TGraphic deklarieren und indirekt alles, der aktuell geladenen Units, ermöglichen)

Volker Z. 5. Okt 2014 20:47

AW: Bild in Imagelist durch ein anderes Ersetzen - zur Laufzeit
 
Hallo,

Zitat:

[...] Wie kann ich in einem ImageList zur Laufzeit ein "png" Bild auswechseln ? [...] Ich habe schon fast alles versucht [...]
Auch so (oder ähnlich)?
Delphi-Quellcode:
procedure ImageListReplaceImageWithPNG (const Imagelist : TImageList; const Index : Integer; const Filename : string);
var
  p : TPngImage;
  b : TBitmap;
begin
  // Testen, ob gültige Imagelist übergeben, der Index in den entsprechenden Grenzen, die Datei existiert

  p := TPngImage.Create;
  b := TBitmap.Create;
  try
    p.LoadFromFile (Filename);
    // Testen, ob Breite, Höhe etc. des PNG mit der Imagelist übereinstimmt

    p.AssignTo (b);
    Imagelist.Replace (Index, b, nil)
  finally
    p.Free;
    b.Free
  end
end;
Gruß

BGHake 7. Okt 2014 15:41

AW: Bild in Imagelist durch ein anderes Ersetzen - zur Laufzeit
 
@All

Vielen Dank für Eure Antworten. Nach vielen Versuchen habe ich das jetzt anders gelöst.

Es war ja nicht das Problem eine png-Datei "hizuzufügen",
deswegen suche ich "Intern" nach dem entspechenden Bild, lösche es und füge das Neue hinzu.
bei Bedarf suche ich wieder nach dem Bild und übergebe den index an die entsprechende Komponente.

Ich weiß, ist zwar nicht unbedingt "Die Lösung", aber dadurch stelle ich obendrein sicher, das immer das richtige Bild verbunden wird.

Ach ja, ich benutze den ImageLister von AlphaTools.

Viele Dankt trotzdem für Eure Mühe
Gruß Bernd

himitsu 7. Okt 2014 16:49

AW: Bild in Imagelist durch ein anderes Ersetzen - zur Laufzeit
 
Wenn du das meinst: http://www.delphi-treff.de/tipps-tri...m-verknuepfen/

Die haben scheinbar einen Bug in ihrem CMS, denn da fehlen irgendwie alle "<", ">" und vorallem die ganzen wichtigen "\".

BGHake 7. Okt 2014 17:30

AW: Bild in Imagelist durch ein anderes Ersetzen - zur Laufzeit
 
Nein, der Name der Grafik wird mitgespeichert und diesen Umstand mache ich mir zu Nutze.

Delphi-Quellcode:
// ------------------------------------------------------------ Procedur einem Schalter eine bestimmte Grafik zuzuweisen
procedure Tfrm_Main.gp_LoadPic(ListViewName : TsAlphaImageList; // ----------- Das ImageList, das umgestellt werden soll
                               ButtonName  : TsSpeedButton; // -------- Der Schalter dessen Grafik geändert werden soll
                               InternName  : String); // ----------------------- Der Name den das eingelagerte Bild hat
var I: Integer;
begin
  for I := 0 to ListViewName.Items.Count - 1 do
    begin
      if ListViewName.Items[I].ImageName = InternName then
        begin
          ButtonName.ImageIndex := I;
        end;
    end;
end;

// ---------------------------------------------- Procedur um vorhanden Schalter-Grafiken in der ImageList auszutauschen
procedure Tfrm_Main.gp_Replays(InternName  : String; // ------------------------ Der Name den das eingelagerte Bild hat
                               PicPath     : String; // ------- Der Pfad, wo sich die zu ladenden Grafik-Datei befindet
                               PicName     : String; // ------------------------- Der Name der zu ladenden Grafik-Datei
                               ListViewName : TsAlphaImageList); // ---------- Das ImageList, das umgestellt werden soll
var
  I: Integer;
  P: String;
begin
  for I := 0 to ListViewName.Items.Count - 1 do
    begin
      if ListViewName.Items[I].ImageName = InternName then
       begin
         ListViewName.Delete(I);
         ListViewName.LoadFromFile( PicPath + PicName);
         Break;
       end;
    end;
end;
man könnte das auch als Function schreiben, um zu überprüfen, ob es wirklich geklappt hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz