Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   ListView Icon Transparenz Problem (https://www.delphipraxis.net/198290-listview-icon-transparenz-problem.html)

KodeZwerg 21. Okt 2018 20:03


ListView Icon Transparenz Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, ich werde irgendwie alleine nicht fündig,
ich habe eine Listview und hole/fülle mir so die Icons:
Delphi-Quellcode:
var
  FileInfo: SHFILEINFOW;
  Icon: TIcon;
  Files: TStringList;

...

   with Processes.Items.Add() do
    begin
      SHGetFileInfoW(PWideChar(Files[i]), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
      Icon.Handle := FileInfo.hIcon;
      ImageIndex := FileIcons.AddIcon(Icon);
      DestroyIcon(FileInfo.hIcon);
    end;
das funktioniert prinzipiell schon mal so wie gedacht.
Aber viele Icons zeigen Schwarz an obwohl dort eigentlich transparenz herrschen sollte.
Kann man das irgendwie beheben?
Anhang 50120

Hier die DFM Daten:
Code:
    object Processes: TListView
      AlignWithMargins = True
      Left = 3
      Top = 3
      Width = 466
      Height = 195
      Align = alClient
      Columns = <
        item
          AutoSize = True
          Caption = 'Filename'
        end
        item
          Caption = 'PID'
          MaxWidth = 70
          MinWidth = 50
        end
        item
          Caption = 'Started'
          MaxWidth = 130
          MinWidth = 130
          Width = 130
        end>
      ReadOnly = True
      RowSelect = True
      SmallImages = FileIcons
      TabOrder = 0
      ViewStyle = vsReport
    end
  end
  object FileIcons: TImageList
    DrawingStyle = dsTransparent
    ImageType = itMask
    Left = 24
    Top = 48
  end
/edit
Post überarbeitet und auf eine Frage beschränkt.

Hier noch mal die Frage:
Wie kann ich Icons in ListView darstellen so das die schwarze Farbe Transparent ist?

Luckie 21. Okt 2018 20:14

AW: ListView mit Icons die Transparent sind darstellen und Scrollbalken entfernen
 
Bitte erstell für jedes Problem einen separaten Thread.

API 21. Okt 2018 20:26

AW: ListView mit Icons die Transparent sind darstellen und Scrollbalken entfernen
 
So solltest du fündig werden:
Bei Google suchenshgetfileinfo icon transparent

KodeZwerg 21. Okt 2018 20:27

AW: ListView mit Icons die Transparent sind darstellen und Scrollbalken entfernen
 
Zitat:

Zitat von Luckie (Beitrag 1416268)
Bitte erstell für jedes Problem einen separaten Thread.

Habs geändert & werds mir merken. Danke fürs Lesen.

DieDolly 21. Okt 2018 20:40

AW: ListView Icon Transparenz Problem
 
Wenn gestattet dann ein eventueller Verbesserungsvorschlag?

Neue Spalten:
Process name, PID, Path, Started

Dein Tool ist ein Tool zum Auflisten von Prozessen und die Hauptinformation die ein Nutzer sucht ist der Prozessname.
Der Pfad ist nur weitere Information.

KodeZwerg 21. Okt 2018 20:48

AW: ListView Icon Transparenz Problem
 
Okay, ich scheine eine passende Stellschraube gefunden zu haben aber kann mir nicht vorstellen dass das korrekt ist.
Delphi-Quellcode:
ImageList.BkColor := clWhite
.
@DieDolly, danke, das passt schon, für mich steht der Zeitpunkt der Erstellung und PID im Fokus, Rest ist nur damit man was sieht :-)

KodeZwerg 21. Okt 2018 22:13

AW: ListView Icon Transparenz Problem
 
@dolly, habe es nun so gemacht wie du vorgeschlagen hast (nur weil ich da noch ne sortier funktion eingebaut habe ^^)

wer mag kann das tool sich hier runterladen.
(es ist noch beta, da muss noch ne konfiguration usw rein, speichert keine spaltenmaße usw...
bei interesse werkel ich da noch ein wenig rum und stelle es in userprojects vor)

tomkupitz 21. Okt 2018 22:15

AW: ListView Icon Transparenz Problem
 
Ein FileListView geht so: (Abriss)

Code:
var ImageList: TImageList;

...

var sfi: TShFileInfo;

ImageList:=TImageList.Create(nil);
ImageList.Handle:=SHGetFileInfo(PChar(GetWinDir), 0, sfi, sizeof(TShFileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
ImageList.ShareImages:=True;
ImageList.BkColor:=clNone;
ImageList.BlendColor:=clNone;

...

ListView1.SmallImages:=ImageList;

...

var sfi: TShFileInfo;

SHGetFileInfo(PChar(FileName), 0, sfi, sizeof(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);

with ListView1.Items.Add do
begin
  Caption:=ExtractFileName(FileName);
  ...
  ImageIndex:=sfi.iIcon;
end;

...

ImageList.Free;

KodeZwerg 21. Okt 2018 23:50

AW: ListView Icon Transparenz Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von tomkupitz (Beitrag 1416278)
Ein FileListView geht so: (Abriss)

Da wird aber das gemacht was ich nicht möchte, Transparente Farbe wird Schwarz dargestellt.
Ich habe auch mit Icon.Transparent etc herumprobiert, ich bekomme es, ohne meinen Umweg den ich oben beschrieb, nicht zum laufen

So schaut der aktuelle Build aus.
Anhang 50121

tomkupitz 22. Okt 2018 00:45

AW: ListView Icon Transparenz Problem
 
Auch wenn du es genauso machst wie gezeigt? Der Code ist seit Jahren über mehrere Compiler im Einsatz. Immer "Transparente" Icons.

KodeZwerg 22. Okt 2018 02:32

AW: ListView Icon Transparenz Problem
 
Zitat:

Zitat von tomkupitz (Beitrag 1416280)
Auch wenn du es genauso machst wie gezeigt? Der Code ist seit Jahren über mehrere Compiler im Einsatz. Immer "Transparente" Icons.

Ich habe soeben, nur um der Sache auf den Grund zu gehen, ein frisches Demo erstellt mit dem Ergebnis, wenn ich Deinen Code verwende, so wie Du in abgebildet hast, hab ich gar kein Icon sichtbar, das ist mir etwas zu viel transparenz.

Ich frage mich auch wozu Du eine ImageList erstellst wenn sie im Code keine Verwendung hat.
Zitat:

Zitat von tomkupitz (Beitrag 1416278)
Code:
var ImageList: TImageList; // ok, wir reservieren uns einen namen

...

ImageList:=TImageList.Create(nil); // okay, nun haben wir etwas zum benutzen vorbereitet

...

ListView1.SmallImages:=ImageList; // okay, listview erhält diese Liste für SmallImages

...

with ListView1.Items.Add do
begin
  Caption:=ExtractFileName(FileName);
  ...
  ImageIndex:=sfi.iIcon; // hmmm, wozu ImageList wenn hier direkt was übergeben wird?
end;


tomkupitz 22. Okt 2018 09:56

AW: ListView Icon Transparenz Problem
 
Code:
var ImageList: TImageList; //Variable

...

var sfi: TShFileInfo;

ImageList:=TImageList.Create(nil); //erstellen,...
ImageList.Handle:=SHGetFileInfo(PChar(GetWinDir), 0, sfi, sizeof(TShFileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON); //Handle zuweisen,...
ImageList.ShareImages:=True; //System-Icons nur nutzen, am Ende aber nicht freigeben,...
ImageList.BkColor:=clNone;
ImageList.BlendColor:=clNone;

...

ListView1.SmallImages:=ImageList; //ListView sagen diese ImageList zu benutzen

...

var sfi: TShFileInfo;

SHGetFileInfo(PChar(FileName), 0, sfi, sizeof(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON); //IconIndex holen

with ListView1.Items.Add do
begin
  Caption:=ExtractFileName(FileName);
  ...
  ImageIndex:=sfi.iIcon; //IconIndex zuweisen (sfi.iIcon ist Index kein Handle), du sagst ihm, das er Icon Nummer x aus seinen SmallImages also der SystemImageList (ImageList) dem Item zuweisen soll
end;

...

ImageList.Free; //freigeben (aber nur Objektinstanz, Icons nicht)

tomkupitz 22. Okt 2018 10:22

AW: ListView Icon Transparenz Problem
 
Und Beispiel... http://www.screensoft.de/unit1.zip

KodeZwerg 22. Okt 2018 12:04

AW: ListView Icon Transparenz Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, der Fehler lag da in meinem Code irgendwo verborgen.
Also Danke nochmal für Deine mühe, nun klappt es wie es soll!!!
Anhang 50123

Das ärgert mich das ich es mit Deiner Vorlage nicht hinbekommen hatte, aber nun wird alles gut, Dank Dir!:thumb:

/edit
habe den fehler gefunden
Delphi-Quellcode:
ImageList.Handle:=SHGetFileInfo(PChar(GetWinDir), 0, sfi, sizeof(TShFileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON); //Handle zuweisen,...
Vermutlich macht mein GetWinDir etwas anderes als Deins. Gebe ich da den Pfad direkt ein = alles funktioniert, mit meinem GetWinDir() habe ich gar keine Icons.

tomkupitz 22. Okt 2018 12:33

AW: ListView Icon Transparenz Problem
 
Code:
function GetWinDir: string;
var len: DWord;

begin
  len:=MAX_PATH+1;

  SetLength(result, len);

  len:=GetWindowsDirectory(PChar(result), len);

  if len>0 then
    SetLength(result, len)
  else
    RaiseLastOSError;
end;

KodeZwerg 22. Okt 2018 12:40

AW: ListView Icon Transparenz Problem
 
Delphi-Quellcode:
function GetWinDir: string;
var
  dir: array [0..MAX_PATH] of WideChar;
begin
  GetWindowsDirectoryW(dir, MAX_PATH);
  Result := StrPas(dir);
end;
Das war meine... strange das ganze aber nun fruchtet es, ganz herzlichen Dank nochmal für Deine tatkräftige Unterstützung!


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:41 Uhr.

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