AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TTreeView wird durch TActionMainMenuBar deutlich langsamer
Thema durchsuchen
Ansicht
Themen-Optionen

TTreeView wird durch TActionMainMenuBar deutlich langsamer

Ein Thema von BerndS · begonnen am 27. Mär 2019 · letzter Beitrag vom 29. Mär 2019
Antwort Antwort
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#1

TTreeView wird durch TActionMainMenuBar deutlich langsamer

  Alt 27. Mär 2019, 15:52
Hallo,
mir ist aufgefallen dass das Füllen einer TTreeView Komponente bei mir ca. um den Faktor 6-7 langsamer wird, sobald im Projekt oder Formular ein Menü vom Typ TActionMainMenuBar verwendet wird und diese sichtbar ist.

Bemerkt habe ich es, da der gleiche Dialog in verschiedenen Programmen mal schnell und mal langsam den Baum aufgebaut wurde.
Meine Suche nach der Ursache ist leider erfolglos geblieben.

Ich habe mal ein Miniprojekt angehängt.
Zum Test:
1. Schalter Treeview füllen drücken
2. mit ActionMainMenuBar aktivieren
3. Schalter Treeview füllen drücken
Danach sollte das Label das Ergebnis anzeigen.

Vielleicht hat ja jemand eine Erklärung für den Zeitunterschied.
Gruß Bernd
Angehängte Dateien
Dateityp: zip TestTreeNode.zip (49,2 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
272 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TTreeView wird durch TActionMainMenuBar deutlich langsamer

  Alt 27. Mär 2019, 17:14
Sehr interessanter Effekt.

Keine Ahnung, wo das herkommen kann.

Eigentlich kann ich mir nur vorstellen, dass die ActionMainMenuBar beim Hören auf die Windows-Botschaften eine Verzögerung erzeugt:

Delphi-Quellcode:
    procedure CMEnabledchanged(var Message: TMessage); message CM_ENABLEDCHANGED;
    procedure CMWininichange(var Message: TWMWinIniChange); message CM_WININICHANGE;
    procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
    procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
    procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
    procedure WMSysKeyDown(var Message: TWMSysKeyDown); message WM_SYSKEYDOWN;
    procedure WMSysKeyUp(var Message: TWMSysKeyUp); message WM_SYSKEYUP;
    function MainWndHook(var Message: TMessage): Boolean;
Dann müsste aber vermutlich der/die TreeView beim Befüllen intern auch Botschaften verwenden, sonst könnte die MenüBar ja nicht dazwischenfunken...
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.960 Beiträge
 
Delphi 12 Athens
 
#3

AW: TTreeView wird durch TActionMainMenuBar deutlich langsamer

  Alt 27. Mär 2019, 18:39
Da es eine Demo von dir gibt könntes du dieses Problem auch gerne in quality.embarcadero.com einstellen und dann die Report Nummer hier posten.
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#4

AW: TTreeView wird durch TActionMainMenuBar deutlich langsamer

  Alt 28. Mär 2019, 08:26
Ich habe die Hooks noch mal genauer angeschaut. Die Verzögerung wird in der Vcl.ActnMenus durch TMenuList.Notify durch CallWindowHook ausgelöst sobald das erste Menü dort eingefügt wird.

Auf die schnelle habe ich die Unit Vcl.ActnMenus um die procedure EnableDisableMenuListHooks erweitert.
Delphi-Quellcode:
procedure EnableDisableMenuListHooks(AEnable: Boolean);
begin
  if Assigned(MenuList) and (MenuList.Count > 0) then
    if AEnable then
    begin
      if MenuCallWndHook = 0 then
      MenuCallWndHook := SetWindowsHookEx(WH_CALLWNDPROC,
        {$IFNDEF CLR}@{$ENDIF}CallWindowHook, 0, GetCurrentThreadID);
    end
    else
      if (MenuCallWndHook <> 0) then
      begin
        UnHookWindowsHookEx(MenuCallWndHook);
        MenuCallWndHook := 0;
      end;
end;
Diese rufe ich dann hier auf und die Verzögerungen sind weg (Ohne Debugger).
Delphi-Quellcode:
procedure TfmTestTreeview.btClick(Sender: TObject);
  procedure AddNodes(ACount, NL: Integer; ANode: TTreeNode);
  var
    N: TTreeNode;
    I: Integer;
    S: string;
  begin
    for I := 1 to ACount do
    begin
      if Assigned(ANode) then
      begin
        N := tv.Items.AddChild(ANode, 'Node ' + NL.ToString + '.' + I.ToString);
        if N.Level < 3 then
          AddNodes(10, I, N)
        else
          Break;
      end
      else
      begin
        N := tv.Items.Add(nil, 'Node ' + I.ToString);
        AddNodes(10, I, N);
      end;
    end;
  end;

var
  TC: Cardinal;
  E: Extended;
begin
  tv.Items.Clear;
  EnableDisableMenuListHooks(False);
  try
    tv.Items.BeginUpdate;
    try
      bt.Enabled := False;
      TC := GetTickCount;
      AddNodes(20, 0, nil);
      TC := GetTickCount - TC;
      if cbAMMB.Checked then
        FTCM := TC
      else
        FTC := TC;
      lTC.Caption := TC.ToString + ' ticks';
      if (FTC > 0) and (FTCM > 0) then
      begin
        E := FTCM / FTC;
        lTC.Caption := lTC.Caption + ' ( ohne ' + FTC.ToString + ' ticks ' + FloatToStr(RoundTo(E, - 1)) + ' x langsamer)';
      end;
    finally
      tv.Items.EndUpdate;
      bt.Enabled := True;
    end;
  finally
    EnableDisableMenuListHooks(True);
  end;
end;

Geändert von BerndS (28. Mär 2019 um 08:36 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.960 Beiträge
 
Delphi 12 Athens
 
#5

AW: TTreeView wird durch TActionMainMenuBar deutlich langsamer

  Alt 28. Mär 2019, 17:48
Bitte Problem samt Lösungsansatz inQP erfassen, damit hoffentlich alle in einer zukünftigen Version von einem offiziellen Bugfix profitieren. Danke!
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#6

AW: TTreeView wird durch TActionMainMenuBar deutlich langsamer

  Alt 29. Mär 2019, 08:59
Leider sind meine Englisch Kenntnisse nicht die besten. Mein Lösung ist auch nicht optimal, da es nicht automatisch geht.
Aber ich werde mal versuchen meinen ersten QP zu erstellen.
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#7

AW: TTreeView wird durch TActionMainMenuBar deutlich langsamer

  Alt 29. Mär 2019, 14:10
Ich habe es mit Googles Hilfe in QP hinzugefügt. RSP-24106
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.960 Beiträge
 
Delphi 12 Athens
 
#8

AW: TTreeView wird durch TActionMainMenuBar deutlich langsamer

  Alt 29. Mär 2019, 15:49
Danke. Habe dafür gestimmt.
  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 17:39 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