AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit dem ListView

Ein Thema von MicMic · begonnen am 26. Mai 2018 · letzter Beitrag vom 1. Jun 2018
Antwort Antwort
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

AW: Probleme mit dem ListView

  Alt 26. Mai 2018, 20:43
Das mit dem "CreateWnd" hatte ich mal probiert, aber es hatte nicht funktioniert.
Jetzt geht es aber damit. Versuche die Fehlerquelle gerade herauszubekommen aber es geht jetzt irgendwie immer. Auch die eingestellte Breite passt sich automatisch an, wie gewünscht. Zwar etwas langsam nach einer Änderung der Schriftgröße in den Anzeigeeinstellungen aber besser als wenn es gar nicht geht Also mal Danke. Hoffe es bleibt auch so. Listview ist so ein Thema. Auch "LVS_EX_INFOTIP" musste ich abstellen, da manchmal ein ToolTip außerhalb meiner Anwendung (Bildschirmposition X=0,Y=0) angezeigt wurde.

Bei mir schaut es jetzt so aus:
Code:
Type
  TListView = Class(Vcl.ComCtrls.TListView)
    Protected
      Procedure CreateWnd; Override;
  End;

Procedure DisableLVToolTips(H : THandle);
Var Styles : DWord;
Begin
 Styles := ListView_GetExtendedListViewStyle(H);
 Styles := Styles And Not LVS_EX_INFOTIP;
 ListView_SetExtendedListViewStyle(H, Styles);
End;

procedure TListView.CreateWnd;
begin
 Inherited;
 SetWindowTheme(WindowHandle, Nil, Nil);
 ListView_SetColumnWidth(WindowHandle,0,500);
 DisableLVToolTips(WindowHandle);
end;
Gruß Michael
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Probleme mit dem ListView

  Alt 26. Mai 2018, 21:23
SetWindowTheme(WindowHandle, Nil, Nil);
SetWindowTheme(Listview.Handle, '', nil);
SetWindowTheme(Form/Window-Handle, nil, nil);

sorry das ist definitiv falsch seit ihr hier am raten?

das muss so sein.
SetWindowTheme(WindowHandle, '', '');
ansonsten wird sie für dieses Fenster nicht deaktiviert.
Ist zwar PWideChar aber auf Nil zu casten ist falsch.

Zudem wenn du die Theme nur für das ListView ausschalten willst musst du auch deren Handle nehmen.

EDIT:
Für die ungläubigen. Siehe shots.
Ich möchte meinen ToolTip OwnerDrawn dann muss ich die Theme für den ToolTip deaktivieren.
Aber nicht mit NIL denn das hat keinen Effekt!
Der einfachste weg kompiliere deine Anwendung ohne Manifest! Alles andere ist Spielerei.

gruss

Geändert von EWeiss (11. Jul 2019 um 15:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Probleme mit dem ListView

  Alt 27. Mai 2018, 00:27
Also mal Danke.
Ja gerne.
seit ihr hier am raten?
Hmmm, da weiß ich gerade keine passende Antwort nur anzumerken das es beim TE und mir mit nil funktioniert, auch mit "" so ist es ja nicht (zumindest bei mir). Wenn ich mir MSDN durchlese gebe ich Dir Recht, NULL solls sein für alles.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#4

AW: Probleme mit dem ListView

  Alt 27. Mai 2018, 00:38
Zitat:
Probleme mit dem Titel
Man stelle sich mal vor, man könnte im Titel schon erkennen worum es geht.

Mit ListViews haben viel Probleme, da sogar ganz Andere,
und dein Problem haben alle Controls, wo jemand an der VCL vorbei irgendwas macht.


Delphi-Quellcode:
  TWinControl = class(TControl, IWinControl)
  protected
    procedure CreateHandle; virtual;
    procedure CreateParams(var Params: TCreateParams); virtual;
    procedure CreateWindowHandle(const Params: TCreateParams); virtual;
    procedure CreateWnd; virtual;
    //procedure RecreateWnd;
Es gibt da mehrere Ereignisse, wo man sich reinhängen könnte.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Probleme mit dem ListView

  Alt 27. Mai 2018, 01:02
Ich habe hier noch etwas gefunden, die Quelle weiß ich leider nicht mehr.
Delphi-Quellcode:
unit ThemesApp;

interface


procedure EnableThemesApp;
procedure DisableThemesApp;


implementation

uses
Controls,
Forms,
Messages,
UxTheme,
Sysutils,
Windows;

type
  TJumpOfs = Integer;
  PPointer = ^Pointer;

  PXRedirCode = ^TXRedirCode;
  TXRedirCode = packed record
    Jump: Byte;
    Offset: TJumpOfs;
  end;

  PAbsoluteIndirectJmp = ^TAbsoluteIndirectJmp;
  TAbsoluteIndirectJmp = packed record
    OpCode: Word;
    Addr: PPointer;
  end;

var
 UseThemesBackup: TXRedirCode;

function GetActualAddr(Proc: Pointer): Pointer;
begin
  if Proc <> nil then
  begin
    if (Win32Platform = VER_PLATFORM_WIN32_NT) and (PAbsoluteIndirectJmp(Proc).OpCode = $25FF) then
      Result := PAbsoluteIndirectJmp(Proc).Addr^
    else
      Result := Proc;
  end
  else
    Result := nil;
end;


procedure HookProc(Proc, Dest: Pointer; var BackupCode: TXRedirCode);
var
  n: DWORD;
  Code: TXRedirCode;
begin
  Proc := GetActualAddr(Proc);
  Assert(Proc <> nil);
  if ReadProcessMemory(GetCurrentProcess, Proc, @BackupCode, SizeOf(BackupCode), n) then
  begin
    Code.Jump := $E9;
    Code.Offset := PAnsiChar(Dest) - PAnsiChar(Proc) - SizeOf(Code);
    WriteProcessMemory(GetCurrentProcess, Proc, @Code, SizeOf(Code), n);
  end;
end;

procedure UnhookProc(Proc: Pointer; var BackupCode: TXRedirCode);
var
  n: Cardinal;
begin
  if (BackupCode.Jump <> 0) and (Proc <> nil) then
  begin
    Proc := GetActualAddr(Proc);
    Assert(Proc <> nil);
    WriteProcessMemory(GetCurrentProcess, Proc, @BackupCode, SizeOf(BackupCode), n);
    BackupCode.Jump := 0;
  end;
end;

function UseThemesH:Boolean;
Var
 Flag : DWORD;
begin
  Flag:=GetThemeAppProperties;
  if ( (@IsAppThemed<>nil) and (@IsThemeActive<>nil) ) then
    Result := IsAppThemed and IsThemeActive and ((Flag and STAP_ALLOW_CONTROLS)<>0)
  else
    Result := False;
end;

procedure HookUseThemes;
begin
  HookProc(@UxTheme.UseThemes, @UseThemesH, UseThemesBackup);
end;

procedure UnHookUseThemes;
begin
  UnhookProc(@UxTheme.UseThemes, UseThemesBackup);
end;


Procedure DisableThemesApp;
begin
  SetThemeAppProperties(0);
  SendMessage(Application.Handle,WM_THEMECHANGED,0,0);
  SendMessage(Application.MainForm.Handle,CM_RECREATEWND,0,0);
end;

Procedure EnableThemesApp;
begin
  SetThemeAppProperties(STAP_ALLOW_NONCLIENT or STAP_ALLOW_CONTROLS or STAP_ALLOW_WEBCONTENT);
  SendMessage(Application.Handle,WM_THEMECHANGED,0,0);
  SendMessage(Application.MainForm.Handle,CM_RECREATEWND,0,0);
end;

initialization
 HookUseThemes;
finalization
 UnHookUseThemes;
end.
Unit einbinden, wo auch immer, wann auch immer EnableThemesApp bzw DisableThemesApp aufrufen.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Probleme mit dem ListView

  Alt 27. Mai 2018, 09:45
Zitat:
Hmmm, da weiß ich gerade keine passende Antwort nur anzumerken das es beim TE und mir mit nil funktioniert, auch mit "" so ist es ja nicht (zumindest bei mir).
Deshalb ja! Für die ungläubigen.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Probleme mit dem ListView

  Alt 27. Mai 2018, 14:18
Hey Emil, nur mal rein um meine Neugier zu befriedigen, könntest Du mal in Deinem Source eine Sache bitte ausprobieren?
Ersetze mal bitte die "" mit nil und gebe als Handle Dein Window-Handle an, also das vom Programm nicht vom Tooltip.
Ist Dein Tooltip dann gefärbt oder Windows-Grau?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Probleme mit dem ListView

  Alt 27. Mai 2018, 14:13
Ich habe hier noch etwas gefunden, die Quelle weiß ich leider nicht mehr.
[DELPHI]unit ThemesApp;

interface


procedure EnableThemesApp;
procedure DisableThemesApp;

...

Unit einbinden, wo auch immer, wann auch immer EnableThemesApp bzw DisableThemesApp aufrufen.
Danke für die Mühe zum raussuchen. Möchte jedoch ein Theme nicht komplett ausschalten. Ich hab auch viel rumprobiert. Im Grunde geht meine ListView aber dieses SmoothScrolling ist bei vielen Einträgen etwas störend. Die lässt sich nicht so einfach für das einzelne Control ausschalten. Habe aber mal die Laufzeit-Theme Geschichte deaktiviert. Dann ist SmoothScrolling aus und dennoch ist der Grafikaufbau etwas langsam im Gegensatz zu einer ListBox. Die habe ich dann mal eben getestet. Eine Listbox kann man zum Glück auch mit "OnDrawItem" anpassen. Es geht jedenfalls um eine Verzeichnis und Dateiliste im Stil vom Total-Commander. Angefangen hatte ich mit TStringGrid. Ein paar Dinge waren dann etwas kompliziert umzusetzen. Danach dann TListView und nun probiere ich mich dann mal an einer TListBox

Michael
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Probleme mit dem ListView

  Alt 27. Mai 2018, 14:31
Danach dann TListView und nun probiere ich mich dann mal an einer TListBox
Meine Empfehlung, ShellListView! Damit hast Du lediglich beim Icon laden eine leichte Verzögerung exakt wie beim TC.
Selber nachbasteln endet idR bei einem langsameren Ergebis.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:57 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-2025 by Thomas Breitkreuz