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 ListView_SetBkImage funktioniert nicht mit VCL-Listview (https://www.delphipraxis.net/10214-listview_setbkimage-funktioniert-nicht-mit-vcl-listview.html)

OLLI_T 13. Okt 2003 20:40


ListView_SetBkImage funktioniert nicht mit VCL-Listview
 
Hallo Delphi-Gemeinde!

Der Aufruf von ListView_SetBkImage liefert mir bei nem VCL-Listview als Rückgabewert FALSE. Mist!

Exakt derselbe Code arbeitet in nem NonVCL Projekt, in dem ich das kleine süsse Listview zu Fuss erstelle, völlig klaglos. WM_EraseBkGnd hab ich entsprechend gepatch und damit die VCL-Verschlimmbesserung überlistet. Daran liegt es also nicht. Ich hab auch diverseste Einstellungskombinationen im OI ausprobiert. Natürlich ohne Erfolg, sonst würd ich ja nicht nachfragen. *ggg* Welcher Wissende weiss Rat? Ich geh derweil duschen.

Delphi-Quellcode:
...
Var
  LVBK:TLVBKImage;
Begin
...
         LVBK.ulFlags:=LVBKIF_STYLE_TILE + LVBKIF_SOURCE_URL;
         LVBK.pszImage:='C:\Test.bmp';
         If ListView_SetBkImage(hLV,@LVBK) Then
            ListView_SetTextBkColor(hLV,CLR_NONE);
Vielen Dank schon mal

OLLI

OLLI_T 14. Okt 2003 09:17

Re: ListView_SetBkImage funktioniert nicht mit VCL-Listview
 
Moin!

Ich habs. Hilf Dir selbst, dann hilft Dir Gott. *ggg*

Gott zum Grusse ...

Jens Schumann 14. Okt 2003 09:24

Re: ListView_SetBkImage funktioniert nicht mit VCL-Listview
 
Hallo OLLI_T,
herzlich Glückwunsch.
Wie sieht die Lösung denn aus ?

MathiasSimmack 14. Okt 2003 09:33

Re: ListView_SetBkImage funktioniert nicht mit VCL-Listview
 
Zitat:

Zitat von OLLI_T
Welcher Wissende weiss Rat? Ich geh derweil duschen. [...] Ich habs. Hilf Dir selbst, dann hilft Dir Gott.

Was Duschen alles bewirken kann. :mrgreen:

turboPASCAL 21. Mai 2006 11:38

Re: ListView_SetBkImage funktioniert nicht mit VCL-Listview
 
So, ich wollt's auch mal ausprobieren, komme aber nicht weiter. In der MSDn steht geschrieben das man, um das Bk-Image zu verwenden den Default(Message)Handler aufrufen soll.

Delphi-Quellcode:
type
  TfrmMain = class(TForm)
    ListView1: TListView;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    LVOldWndProc: TWndMethod;
    procedure ListViewSetBKImage;
    procedure LVWindowProc(var Msg: TMessage);
  public
    { Public-Deklarationen }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

uses
  ShellAPI, CommCtrl, ComObj;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  ListViewSetBKImage;

  LVOldWndProc := ListView1.WindowProc;
  ListView1.WindowProc := LVWindowProc;
end;

procedure TfrmMain.ListViewSetBKImage;
var
  LVBkImg: TLVBkImage;
  FFilename: String;
  FTile: Boolean;
  FXOffsetPercent,
  FYOffsetPercent: Integer;
begin
  FFilename := 'C:\Windows\Angler.bmp';
  FTile := FALSE;
  FXOffsetPercent := 0;
  FYOffsetPercent := 0;

  if assigned(ListView1) and ListView1.HandleAllocated then
  begin
    if FFilename <> '' then
      LVBkImg.ulFlags := LVBKIF_SOURCE_URL
    else
      LVBkImg.ulFlags := LVBKIF_SOURCE_NONE;
    if FTile then
      LVBkImg.ulFlags := LVBkImg.ulFlags or LVBKIF_STYLE_TILE
    else
      LVBkImg.ulFlags := LVBkImg.ulFlags or LVBKIF_STYLE_NORMAL;

    LVBkImg.hbm := 0; // Bitmap.Handle (HBitmap)
    LVBkImg.pszImage := PChar(FFilename);
    LVBkImg.cchImageMax := Length(FFilename);
    LVBkImg.xOffsetPercent := FXOffsetPercent;
    LVBkImg.yOffsetPercent := FYOffsetPercent;
    ListView_SetBkImage(ListView1.Handle, @LVBkImg);

    //ListView_SetBKColor(ListView1.Handle,CLR_NONE);
  end;
end;

procedure TfrmMain.LVWindowProc(var Msg: TMessage);
begin
  Case Msg.Msg of
    WM_ERASEBKGND: DefaultHandler(Msg);
    else LVOldWndProc(Msg);
  end;
end;
In dem Listviewfenster wird nun überhaubt nichts gezeichnet.
Was habe ich falsch gemacht ? :gruebel:

Die selbe Frage gibt es (nun) auch hier: DF

turboPASCAL 22. Mai 2006 14:07

Re: ListView_SetBkImage funktioniert nicht mit VCL-Listview
 
In zwischen habe ich mal eine andere Variante versucht:

Delphi-Quellcode:
unit Unit1;

{$DEFINE WINDOWSXPSTYLE}

{$IFDEF WINDOWSXPSTYLE}
  {$R WinXP.Res}
{$ENDIF}

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TMyListView = class(TListView)
  protected
    procedure WndProc(var Message: TMessage);
      override;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    ListView1: TMyListView;
    IL: TImageList;
    procedure LVBGImage;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  ComObj, CommCtrl, ShellAPI;

{$R *.dfm}

//  const in CommCtrl:
//    LVBKIF_SOURCE_NONE = 0; // Nix
//    LVBKIF_SOURCE_HBITMAP = 1; // HBitmap source
//    LVBKIF_SOURCE_URL = 2; // Path to Bitmap
//    LVBKIF_SOURCE_MASK = 3; // BitmapMaske ?
//    LVBKIF_STYLE_NORMAL = 0; // ???
//    LVBKIF_STYLE_TILE = 16; //  Gekachelt
//    LVBKIF_STYLE_MASK = 16; // ???

procedure TMyListView.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_ERASEBKGND then
    DefaultHandler(Message)
  else
    inherited WndProc(Message);
end;

procedure TForm1.LVBGImage;
var
  LVBKImage : TLVBKIMAGE;
begin
  FillChar(LVBKImage, SizeOf(LVBKImage), 0);

  LVBKImage.ulFlags := LVBKIF_SOURCE_URL or LVBKIF_STYLE_TILE;
  LVBKImage.pszImage := PChar('c:\windows\angler.bmp'); // Bmp, Gif, Png, Jpg 's
  LVBKImage.hbm := 0;
  LVBKImage.xOffsetPercent := 0;
  LVBKImage.yOffsetPercent := 0;

  ListView_SetBkImage(ListView1.Handle, @LVBKImage);
  //ListView_SetBKColor(ListView1.Handle, CLR_NONE);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Byte;
  Icon : TIcon;
begin
  // Icon & Imagelist bauen...
  Icon := TIcon.Create;
  Icon.Handle := ExtractIcon(HInstance, 'SHELL32.DLL', 6);

  IL := TImageList.Create(Self);
  IL.Width := 32;
  IL.Height := 32;
  IL.AddIcon(Icon);

  Icon.Free;

  // Listview erstellen
  ListView1 := TMyListView.Create(Self);

  // Listview füllen
  with ListView1 do
  begin
    Parent := Self;
    Left := 5;
    Top := 5;
    Width := 250;
    Height := 200;

    With ListView1.Columns.Add do
      Caption := 'First';

    With ListView1.Columns.Add do
      Caption := 'Sub';

    ViewStyle := vsReport;
    //ViewStyle := vsIcon;

    LargeImages := IL;
  end;

  LVBGImage;

  for i := 0 to 24 do
    with ListView1.Items.Add do
    begin
      Caption := format('%s%x',[Chr(Ord('A') + i), i]);
      ImageIndex := 0;
      SubItems.Add(format('%5.5d', [i]));
    end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ListView1.Free;
  IL.Free;
end;

end.
Dieses Beispiel erstellt dynamisch ein ListView was ich aber nicht möchte. Mein Ziel ist es im der Unit selbst ein ListView zu verändern ohne eine extra Kombo.

Wer kann helfen ?

// Edit: Der Absendenbutton ist nicht der Vorschauknopf... :wall:


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