Windows system icons

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Windows system icons

Beitrag von Ralph59 »

Hallo,

jetzt arbeite ich mich schon einige Wochen in Lazarus ein, stoße jedoch immer wieder an meine Grenzen.

Bei der Erstellung eines FTP Clients habe ich eine Imagelist verwendet, um Verzeichnisse, sowie Dateien mit einem Icon anzeigen zu können. Zu diesem Zweck habe ich vorhandene und eigene Icons verwendet.
Jetzt gefällt mir dass aber nicht so richtig, denn ich finde, es ist sinnvoller Icons zu verwenden, die der User kennt (die vom windows system genutzten Icons), aber, ich weiss nicht wie ich da ran komme.

:?: Kann mir hier jemand helfen, und mir sagen, wo ich nachschauen kann?


Mit freundlichem Gruß

Ralph
Dateianhänge
So stell ich mir dass vor
So stell ich mir dass vor
ftpClient2.jpg (54.86 KiB) 3412 mal betrachtet
so habe ich es jetzt realisiert
so habe ich es jetzt realisiert
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

Kuster Peter
Beiträge: 205
Registriert: So 2. Dez 2007, 20:47
OS, Lazarus, FPC: Windows XP Lazarus immer neueste Version
CPU-Target: xxBit
Wohnort: Schweiz

Re: Windows system icons

Beitrag von Kuster Peter »

Hallo Ralph59

Deine Icons sind doch schön. Ansonsten nimm einen Icongrabber und mache selber welche, indem Du die von Windows mit dem Grabber direkt abkopierst oder Du googelst nach:

Guckst Du hier:

http://www.chip.de/downloads/Vista-Icon ... 40082.html

oder hier ein free Icongrabber mit vielen Icons:

http://www.suedwest-pc.de/the_simple_ic ... -3746.html

Hoffe es hilft Dir. Aber meine Meinung ist, dass Deine Icons schön sind und so unter uns, einen eigenen Touch können doch Deine Programme schon haben oder?

Peter

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Windows system icons

Beitrag von Ralph59 »

Hallo Peter,

ich gebe Dir ja recht, dass ein gewisser eigener Touch Software bloss schöner macht, aber wenn ich z.B. eine html Datei anzeige, dann sollte der User natürlich auch den von Ihm genutzten Programmicon (Mozilla, Firefox, MS Internet Explorer oder...) angezeigt bekommen.
Oder wenn jemand .prg . php oder was auch immer mit Notepad++, ultraedit oder was auch immer bearbeitet, dann sollten die icons auch dem entsprechen.


Dass hätte, finde ich auch einen gewissen Scharm.

Ich mache doch schon schöne Buttons, oder versuche es.

Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

ralli
Beiträge: 374
Registriert: Mi 13. Sep 2006, 15:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Hagen a.T.W.
Kontaktdaten:

Re: Windows system icons

Beitrag von ralli »

Seit einigen Jahren habe ich eine eigene Palette an Icons selbst entworfen. Das war verdammt viel Arbeit und es kommen noch laufend welche hinzu. Ein Icon ist nicht nur ein Icon. Für mich sollte es auch einen Wiedererkennungswert haben, und repräsentiert so etwas wie das äussere Erscheinungsbild und die Unternehmenskultur einer Firma.

Corporate Identity.

(CI, auch Unternehmensidentität) ist der abgestimmte Einsatz von Verhalten, Kommunikation und Erscheinungsbild nach innen und außen. Basis dafür ist das Unternehmensleitbild, welches durch die Corporate Identity mit Leben gefüllt wird. Ziel der Corporate Identity ist eine nachhaltige Unternehmensentwicklung. Die CI ist also die Persönlichkeit einer Organisation, die als einheitlicher Akteur handelt und wahrgenommen wird.

(Aus Wikipedia)

Warum also den Markführer nachäffen? Meine Programme wirst Du aus Tausenden sofort heraus erkennen, alleine am äusseren Erscheinungsbild und an den Icons. Für mich war das der richtige Weg und deshalb bleibe ich dabei. Gestern habe ich 4 Stunden für die neue Icon Collection für meinen neuen FBTeacher, einem Schulungsprogramm für die embedded firebird Datenbank investiert. Und es macht auch richtig Spass, seiner souveränen, schöpferischen Kreativität die Sporen zu geben.

Natürlich ist es ein Leichtes , ein entsprechendes Icon aus einer Windows Bibliothek zu extrahieren, dafür gibt es Dutzende von Freeware Programmen, aber wirft das nicht auch Urheberrechtsprobleme auf ?

Design und Funktionalität müssen eine Einheit sein, wenn der Benutzer diese Harmonie und diese Stimmigkeit spürt, nimmt er das neue Programm gerne an.

Manche verwenden auch noch 16*16 Icons mit 16 Farben, das ist meineserachtens eine Beleidigung fürs Auge, denn Icons sollten auch ergonomisch sein, denn es gibt auch Menschen, die Sehprobleme haben, wie ich, der ich von Kindes Beinen an kurzsichtig bin und eine Brille tragen muss .

Wenn Du aber partou gute kostenlose Icons brauchst, dann guckst Du hier:

http://nerdbusiness.com/blog/5978-high- ... rss-page-3

oder hier:

http://freeiconsweb.com/toolbar_icons.html

oder hier:

http://www.iconspedia.com/pack/crystal- ... ions-1303/

Viel Spass beim Stöbern.
Pentium 4 - 2GB - Debian Lenny - Gnome 2.22.3 - Nvidia 8600 GT - FPC 2.2.2 - Lazarus 0.9.26 - GTK2

Benutzeravatar
Garfield
Beiträge: 172
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
CPU-Target: 64Bit
Wohnort: Aken

Re: Windows system icons

Beitrag von Garfield »

Eigene Icon sind sicher etwas schönes. Aber wenn ich
Ralph59 hat geschrieben:... um Verzeichnisse, sowie Dateien mit einem Icon anzeigen zu können. ...

richtig verstehe, sind die für einen Dateityp usw registrierten Icon gemeint.

Unter Windows hilft da SHGetFileInfo weiter.

http://msdn.microsoft.com/en-us/library/bb762179(VS.85).aspx
Ein Delphi-Beispiel: http://www.delphipraxis.net/topic153487_icon+anhand+des+dateitypen+ermitteln.html
Gruß Garfield

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Windows system icons

Beitrag von Ralph59 »

Hallo,
danke für die nette Anregung, habe es auch gleich mal probiert:

:roll: mit folgendem Erfolg

1. Habe ich ein Form erstellt, und da das Icon ausgetauscht, funktionier recht gut :)

Code: Alles auswählen

form1.Icon:=GetFileIcon('C:\Programme\lazarus\source\ftp4\project1.exe', true);


Also wird zum mindest das Icon zurück gegeben.

Dann habe ich versuchet meine Imagelist it dem Icon zu füllen, dabei bekomme ich jedoch eine -1 zurückgegeben
-1 bedeutet:AddIcon - add an icon to the list, returning the index of the icon or -1 if not successful (not yet supported) :(

hiermit habe ich es versucht:

Code: Alles auswählen

showmessage(inttostr(imagelist1.AddIcon(GetFileIcon('C:\Programme\lazarus\source\ftp4\project1.exe', true))));


Besteht eine andere Möglichkeit ein TIcon in eine ImageList einzufügen?


Hier das Bild vom Icon, dass ich in die Form eingetragen habe:
Dateianhänge
icon.jpg
icon.jpg (3.89 KiB) 3357 mal betrachtet
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

ralli
Beiträge: 374
Registriert: Mi 13. Sep 2006, 15:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Hagen a.T.W.
Kontaktdaten:

Re: Windows system icons

Beitrag von ralli »

Wenn Du die visuelle Komponente ImageList auswählst und mit der rechten Maustatse anklickst, dann kommt ein Kontextmenu, daraus wählst Du den Bildlisteneditor, mit dem Du die ImageList befüllen kannst.
Wenn Du zum Beispiel eine Toolbar mit einer ImageList verbindest, dann hat der erste Button auch immer den Index -1, dabei muss der Index immer mit 0 anfangen(das kannst Du im Objektinspektor ändern) und dann fortlaufend erhöht werden, erst dann wird auch das Icon in dem ToolButton der Toolbar angezeigt. Fügst Du einen zweiten Button ein, dann hat der wieder den Index -1, obwohl der dann 1 haben müsste.
Pentium 4 - 2GB - Debian Lenny - Gnome 2.22.3 - Nvidia 8600 GT - FPC 2.2.2 - Lazarus 0.9.26 - GTK2

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Windows system icons

Beitrag von Ralph59 »

Hallo Namensvetter,

dass mit dem Bildlisteneditor habe ich auch schon rausgefunden, aber das ist nicht mein Problem.
Ich lese ein Icon aus einer Datei aus, in meinem Beispiel eine .exe es könnte aud eine .pas Datei sein, die müsste dann in meinem FTP Client auch anders dargestellt werden. Dieses habe ich mit

Code: Alles auswählen

GetFileIcon('C:\Programme\lazarus\source\ftp4\project1.exe', true)


hier der Quelltext dazu

Code: Alles auswählen

uses
 ... ShellAPI
 
...
 
function GetFileIcon(const FileName: string; const FileMustExist: Boolean): TIcon;
 
var
  FI: TSHFileInfo;
  Attributes: DWORD;
  Flags: Word;
begin
  if FileMustExist then
  begin
    Attributes := 0;
    Flags := SHGFI_ICON or SHGFI_LARGEICON;
  end
  else
  begin
    Attributes := faAnyFile ;//FILE_ATTRIBUTE_NORMAL;
    Flags := SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_LARGEICON;
  end;
 
  if SHGetFileInfo(PChar(FileName), Attributes, FI, SizeOf(FI), Flags) <> 0 then
  begin
    result := TIcon.Create;
    Result.Handle := FI.hIcon;
  end;
end;


zurück bekomme ich auch das Icon, kann dieses jedoch nicht an meine ImageList zu Laufzeit anhängen.

Das Icon in der Form wird angezeigt, s. oben

habe dann dieses probiert,

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
BMP :TBitmap;
i:integer;
begin
  //funktioniert
  form1.Icon:=GetFileIcon('C:\Programme\lazarus\source\ftp4\project1.exe', true);
  // geht nicht, bringt -1 zurück
  imagelist1.AddIcon(GetFileIcon('C:\Programme\lazarus\source\ftp4\project1.exe', true))
  //Dieses funktioniert auch
  Bmp := TBitmap.Create;
  Bmp.LoadFromFile('C:\Programme\lazarus\source\div_Beitraege\icon.bmp');
  Bmp.Transparent := True;
  Bmp.TransparentMode := tmAuto;
  imageList1.Add(Bmp , Bmp); //(Bmp , Bmp.TransParentColor);
  i:=imagelist1.Add(Bmp , Bmp);
  listview1.Items.Item[0].Caption:='Test mit Icon';
  listview1.Items.Item[0].ImageIndex:=i;
 
end;



Beim Versuch das erst einmal in eine Datei zu scheiben, "ich könnte ja evtl. ein Verzeichnis durchsuchen, ob eine entsprechende Datei vorhanden ist, wenn ja, dann lade den entsprechenden index...)
Auber auch das funktioniert nicht.
Habe es hiermit versucht:

Code: Alles auswählen

GetFileIcon('C:\Programme\lazarus\source\ftp4\project1.exe', true).SaveToFile('C:\Programme\lazarus\source\div_Beitraege\ralph.ico');


Die Datei wird zwar erstellt, habe diese versucht zu öffnen, mit Fehlermeldungen.

Beim öffnen mit einem editor steht volgendes drin s. Anhang in HEX:
Dateianhänge
Ralph.jpg
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

Benutzeravatar
Garfield
Beiträge: 172
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
CPU-Target: 64Bit
Wohnort: Aken

Re: Windows system icons

Beitrag von Garfield »

In der TImageList muss die Größe der Images angegeben werden und dann können nur Images mit dieser Größe eingefügt werden.
Gruß Garfield

ralli
Beiträge: 374
Registriert: Mi 13. Sep 2006, 15:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Hagen a.T.W.
Kontaktdaten:

Re: Windows system icons

Beitrag von ralli »

Ja, das setzte ich jetzt als selbstverständlich voraus.
Pentium 4 - 2GB - Debian Lenny - Gnome 2.22.3 - Nvidia 8600 GT - FPC 2.2.2 - Lazarus 0.9.26 - GTK2

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Windows system icons

Beitrag von Ralph59 »

Ja, das habe ich auch schon gelesen, deshalb habe ich auch folgendes probiert

Code: Alles auswählen

result1.Height:=16;
    result1.Width:=16;
    result1.Transparent:=false;


hatte jedoch auch nicht zum gewünschten Erfolg geführt. Bei meiner Suche bin ich jedoch auch auf folgendes gestoßen:

http://forum.lazarus.freepascal.org/ind ... pic=2140.0

Der hatte das gleiche Problem, handelt es sich hier vieleicht um ein bug sorry feature :?:

Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

Benutzeravatar
Garfield
Beiträge: 172
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
CPU-Target: 64Bit
Wohnort: Aken

Re: Windows system icons

Beitrag von Garfield »

Bei mir hat GetFileIcon weder mit Lazarus noch mit TurboDelphi funktioniert. :?

Code: Alles auswählen

TForm1 = class(TForm)
    ...
  private
    { private declarations }
    FLargeImageList: TImageList;
    FSmallImageList: TImageList;
    function GetIcon: Boolean;
  public
    { public declarations }
  end;
 
function Shell_GetImageLists(LargeList: PCardinal; SmallList: PCardinal): Boolean; stdcall; external 'shell32.DLL' name 'Shell_GetImageLists';
 
implementation
 
function TForm1.GetIcon: Boolean;
type
  HIMAGELIST = THandle;
var
  HLargeImageList: HIMAGELIST;
  HSmallImageList: HIMAGELIST;
begin
  FLargeImageList        := TImageList.Create(nil);
  FLargeImageList.Height := 32;
  FLargeImageList.Width  := 32;
 
  FSmallImageList        := TImageList.Create(nil);
  FSmallImageList.Height := 16;
  FSmallImageList.Width  := 16;
 
  HLargeImageList := 0;
  HSmallImageList := 0;
 
  Shell_GetImageLists(@HLargeImageList, @HSmallImageList);
 
  Result := (HLargeImageList > 0) and (HSmallImageList > 0);
 
  if HLargeImageList > 0
  then FSmallImageList.Handle := HLargeImageList;
 
  if HSmallImageList > 0
  then FSmallImageList.Handle := HSmallImageList;
end;
 
...

Unter TurboDelphi läuft das zwar auch nicht so, wie es soll, aber unter Lazarus funktionieren die letzten beiden Befehle nicht: Error: No member is provided to access property. Anscheinend ist das eine Nur-Lesen-Eigenschaft.

Ralph59 hat geschrieben:http://forum.lazarus.freepascal.org/index.php?topic=2140.0

Der hatte das gleiche Problem, handelt es sich hier vieleicht um ein bug sorry feature :?:

Sicher, dass er das selbe Problem hatte. Er hatte das Problem, dass er mit dem Befehl

Code: Alles auswählen

DestroyIcon(FileInfo.hIcon);

das Icon gleich wieder zerstört hat. Mit Delphi 7 bekomme ich da ein Icon mit einer zu geringen Farbtiefe. Lazarus speichert irgendetwas und gibt eine Fehlermeldung aus. Wenn man sich die Größe des Icons ausgeben lässt, ist es 0x0 Pixel groß?
Gruß Garfield

Ralph59
Beiträge: 145
Registriert: So 22. Mär 2009, 07:48
OS, Lazarus, FPC: WIN 11 (momentan )
CPU-Target: 64 und 32Bit
Wohnort: Hessen
Kontaktdaten:

Re: Windows system icons

Beitrag von Ralph59 »

Hallo,

habe noch ein wenig weiter getestet und folgendes festgestellt:

1. Als erstes habe ich jetzt versucht nur ein Icon aus einer Datei zu laden und dieses dann als icon von einem Form darzustellen, das funktioniert.

2. Danach habe ich versucht dieses in eine Imagelist einzufügen, dieses geht nicht

3. Dann habe ich versucht, das icon als Datei zu speichern, dieses funktioniert auch.

Also, ich glaube jetzt schon bald, dass die Funktion AddIcon einfach nicht unterstützt wird,-leider-

Code: Alles auswählen

procedure TForm1.Button2Click(Sender: TObject);
var
  icon1:TIcon;
begin
  // Funktioniert leider nicht, wurde ja schon weiter oben getestet
  form1.FSmallImageList.AddIcon(GetFileIcon('C:\Programme\lazarus\source\dir2\project1.exe', true));
  // erstelle Icon
  icon1 := TIcon.Create;
  icon1.SetSize(16,16);
  icon1.LoadFromFile('C:\Programme\lazarus\source\dir2\ftp.ico');
  form1.Icon:=icon1;                                                      //funktioniert, Icon wird angezeigt
  icon1.SaveToFile('C:\Programme\lazarus\source\dir2\ftp33.ico'); // geht auch, datei wird gespeichert
  showmessage(inttostr(form1.FSmallImageList.Count));               // steht momentan 1 Icon drin   
  showmessage('Images in icon1'+inttostr(icon1.Count));               // ist auch 1,
  showmessage('Rueckgabe; '+ inttostr(form1.FSmallImageList.AddIcon(icon1)))//gibt leider wieder -1
  form1.FSmallImageList.AddIcon(icon1);                                     // es geht einfach nicht,
  icon1.Free;
  showmessage(inttostr(form1.FSmallImageList.Count));              // ist demnach immer noch 1
  ...
end;


Ich glaube, jetzt weiss ich erst mal nicht mehr weiter :oops:

Mit freundlichem Gruß

Ralph
Fehler sind wie Berge, man steht auf dem Gipfel seiner eigenen und redet über die der anderen.

NickNameX
Beiträge: 19
Registriert: Di 22. Jun 2010, 13:52

Re: Windows system icons

Beitrag von NickNameX »

Bin gerade selber auf der Suche,
das Problem scheint in Lazarus weiterhin
ungelöst zu sein .. auch jetzt (DEZ 2010)
konnte ich bisher keine funktionierende
Lösung er"googeln"


Dafür zwei Links, an denen ich mich heute versuchen möchte:

Name (lokalisiert) und Icon von Shell-Objekten erhalten:
http://www.delphipraxis.net/551825-post.html#641170

Title: TListView (egal, es ´geht ja um's Icon laden ..):
http://forum.lazarus.freepascal.org/ind ... opic=753.0

(Achso, und: http://support.microsoft.com/kb/319350 )

Falls jemand mittlerweile einen Weg weiß,
wie man in LAZARUS die Windows System Icons
in den TTREEVIEW herüber bekommt
ohne HANDLE zu benutzen ... her damit !

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Windows system icons

Beitrag von MAC »

Man, ich bin schon ganz stolz auf meine 2 mb quellcode xD
Hab mal was herrausgekramt:

ImageList1.Add(V_Image.Picture.Bitmap,nil);


hab es wohl damals vorgendermaen gemacht. Also musstest du das Bild in ein Image laden, und von da in die Imagelist. Bild danach wieder mit .Free freigeben.
Hat aufjedenfall vor nem halben Jaar funktioniert...

Code: Alles auswählen

Signatur := nil;

Antworten