Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ICL in TImageList laden (https://www.delphipraxis.net/14804-icl-timagelist-laden.html)

jonny 15. Jan 2004 23:21


ICL in TImageList laden
 
Hallo hat jemand eine Idee wie ich eine ICL-Datei (Icon Library) in TImageList zur laufzeit laden kann?

scp 15. Jan 2004 23:54

Re: ICL in TImageList laden
 
Soweit ich weis ist eine ICL nichts anderes als eine umbenannte DLL, das heisst du musst sie auch so behandeln:

Delphi-Quellcode:
var
  AIco : TIcon;
  hDLL : THandle;
begin
  hDLL := LoadLibraryEx('Eine.icl', 0, LOAD_LIBRARY_AS_DATAFILE);

  AIco := TIcon.Create;
  try
    AIco.Handle := LoadImage(hDLL, '1', IMAGE_ICON, ImageList1.Width, ImageList1.Height, LR_DEFAULTCOLOR);
    ImageList1.AddIcon(AIco);
  finally
    AIco.Free;
  end;

  FreeLibrary(hDLL);
end;
Die Icons müssen also einzeln zur IL hinzugefügt werden, wie du eine Liste der enthaltenen Icons und deren Namen bekommst, weis ich allerdings im Moment nicht.

jonny 16. Jan 2004 10:07

Re: ICL in TImageList laden
 
Also ich hab das mal so gemacht und da tut sich garnichts. Ich habe sogar einfach so zum test mal der Form1.Icon ein Icon zugewiesen und da hat sich auch nichts verändert. Der name den ich benutzt habe für das Icon in der ICL war richt habe davor nachgeguckt wie die heissen.

scp 16. Jan 2004 11:27

Re: ICL in TImageList laden
 
Habs mal erweitert, jetzt fügt er alle Icons ein:
Delphi-Quellcode:
function ResourcenameCallBack(Module:HModule;resTyp:Pchar;resname:Pchar;list: TStrings):Integer;stdcall;
begin
   if HiWord(Cardinal(resname)) <> 0 then
     list.Add(' ' + resname)
   else
     list.Add(Format(' #%d', [loword(Cardinal(resname))]));
   Result := 1;
end;

function CheckResName(const AName : String) : PChar;
begin
  If (Pos(' #', AName) = 1) then
    result := MakeIntResource(StrToInt(Copy(Aname, 3, length(AName))))
  else
    result := PChar(AName);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  AIco : TIcon;
  hDLL : THandle;
  IcoList : TStringList;
  i : integer;
begin
  Button1.Enabled := false;

  hDLL := LoadLibraryEx(PChar(Edit1.Text), 0, LOAD_LIBRARY_AS_DATAFILE);

  IcoList := TStringList.Create;
  try
    //ImageList1.Clear;

    EnumResourceNames(hDLL, RT_GROUP_ICON, @ResourcenameCallBack, Integer(IcoList));

    for i := 0 to IcoList.Count-1 do
    begin
      AIco := TIcon.Create;
      try
        AIco.Handle := LoadImage(hDLL, CheckResName(IcoList[i]), IMAGE_ICON, ImageList1.Width, ImageList1.Height, LR_DEFAULTCOLOR);
        ImageList1.AddIcon(AIco);
      finally
        AIco.Free;
      end;
    end;

  finally
    IcoList.Free;
    FreeLibrary(hDLL);
  end;
  Button1.Enabled := true;
end;

jonny 16. Jan 2004 11:45

Re: ICL in TImageList laden
 
Danke jetzt funktioniert das!


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 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