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/)
-   -   Systemimagelist "zeichnen" (https://www.delphipraxis.net/178349-systemimagelist-zeichnen.html)

Mattze 3. Jan 2014 09:00

Systemimagelist "zeichnen"
 
Hallo,

ich habe auch mal wieder zwei Probleme:
1. Wenn ich die Icons der Systemimagelist (über IImageList) in ein Stringrid zeichne (Drawcell), zeichnet er zuerst nur 71 Icons. Erst, wenn ich ihn das noch mal machen lasse, zeichnet er alles. Warum? Und wie kann man ihn gleich alles zeichnen lassen?
2. Einige Icons werden als schwarzes Quadrat dargestellt. Das scheint damit zusammen zu hängen, dass sie nur in einer größeren Auflösung vorhanden sind.
Da ich aber kein schwarzer Typ bin, mag ich das nicht. Ich habe schon alles mögliche versucht, da eine andere Farbe zu kriegen. Ich schaffe es nicht. Kann man das überhaupt? Noch besser wäre es, wenn man irgendworan merken könnte, dass da nix ist, nur schwarz. Dann könnte man etwas eigenes zeichnen...

Gruß und noch ein paar schöne Resttage im neuen Jahr!
Mattze

Bernhard Geyer 3. Jan 2014 09:11

AW: Systemimagelist "zeichnen"
 
Der Fehler wird wohl an deinem Quellcode liegen den du verwendest.
Da du ihnen uns nicht zeigst müssen wir hier jetzt eine Raterunde starten.

Mattze 3. Jan 2014 09:49

AW: Systemimagelist "zeichnen"
 
Hallo,

der Fehler unter 1. liegt garantiert nicht am Quellcode. Aber, wenn Du meinst:
Delphi-Quellcode:
procedure TSysteminformationen.SGSILDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var ic: TIcon;
    x,y,x1,y1: Integer;
    h: HIcon;
   bm: TBitmap;
begin
  SGSIL.Canvas.FillRect(Rect);
  x:=rect.Left+(rect.Right-rect.Left) div 2;
  y:=rect.Top+(rect.Bottom-rect.top) div 2;
  case klein of
    0: begin
         dec(x,16);
         dec(y,16);
       end;
    1: begin
         dec(x,8);
         dec(y,8);
       end;
    2: begin
         x:=rect.left+3;
         y:=rect.top+3;
       end;
    4: begin
         x:=rect.left;
         y:=rect.top;
       end;
  end;
  ic:=ticon.create;
//         bm:=TBitmap.Create;
  try
    Fii.geticon(16*arow+acol,0,h);
//           sbsil.Panels[1].text:=inttostr(h)+'  '+inttostr(16*arow+acol);
    ic.handle:=h; //,dsNormal,itImage);
{           fii.GetIconSize(x1,y1);
           bm.Height:=y1;
           bm.Width:=x1;
           bm.Canvas.Draw(0,0,ic);}
    SGSIL.Canvas.Draw(x, y,ic);
  finally
    ic.Free;
//           bm.free
  end;
end;
(Ich habe es auch mal mit einer Bitmap probiert. Die Konvertierung ist ausgegraut.)
var fii: IImagelist;
und
Delphi-Quellcode:
procedure TSysteminformationen.StartSearch;
VAR
  R, C: Integer;
BEGIN
  sgsil.Visible:=false;
  SBtnSISpeichern.Enabled:=false;
  RGSIL.enabled:=false;
  (* Löschen *)
  WITH SGSIL DO BEGIN
    FOR C := 0 TO ColCount - 1 DO BEGIN
       FOR R := 0 TO RowCount - 1 DO BEGIN
         Cells[C, R] := '';
         WITH Objects[C, R] AS TIcon DO begin
           Free;
           objects[c,r]:=nil;
         end;
       END;
    END;
    Incr := 100;
    RowCount := Incr;
    Col := 0;
    CurIcon := 0;
  END; (* WITH *)

  if not Succeeded(SHGetImageList(klein, IImageList, Fii)) then begin
    fii:=nil;
    exit;
  end;
  sgsil.Visible:=true;
  ActiveControl := SGSIL;
  fii.GetImageCount(R);
  SBSIL.Panels[2].Text :='Gesamt: ' +  IntToStr(R);
  WITH SGSIL DO BEGIN
    IF R MOD ColCount = 0 THEN
      RowCount := R DIV ColCount
    ELSE
      RowCount := R DIV ColCount + 1;
    Row := 0;
    Col := 0;
  END;
  SBtnSISpeichern.Enabled:=true;
  RGSIL.enabled:=true;
end;
kommen noch dazu.

Vielleicht seht ihr da mehr.

Und was ist mit Problem Nummer 2?

Gruß
Mattze

Mattze 3. Jan 2014 10:23

AW: Systemimagelist "zeichnen"
 
Hallo,

noch einen Hinweis zu 1.:
Unter Win 8.1 funktioniert es richtig und völlig problemlos.
Der "Fehler" tritt nur unter Win 7 auf und da immer beim ersten befüllen des Stringgrids.
Danach nicht mehr. Der Code ist jedesmal gleich!

2. tritt bei Win 8.1 übrigens auch nicht auf, was aber nichts heißen will. Da gibt es eben zufällig auch die Ikonen in einer "kleineren" Auflösung.

Gruß
Mattze


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