AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Ordnung muss sein (LaunchBar)
Thema durchsuchen
Ansicht
Themen-Optionen

Ordnung muss sein (LaunchBar)

Ein Thema von EWeiss · begonnen am 17. Mai 2017 · letzter Beitrag vom 14. Nov 2021
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.910 Beiträge
 
Delphi 12 Athens
 
#1

AW: Ordnung muss sein (LaunchBar)

  Alt 14. Jun 2017, 12:39
Der Absturz beim Rechtsklick bei Windows 10 kommt von dieser Zeile (uMain.pas Zeile 961):
Delphi-Quellcode:
                  GDIP_DrawImageRectRectI(Graphics, ImgBack, ImgItemHeight, PDis.rcItem.Top,
                    Rect.Right - SideBarWidth, ImgItemHeight, 0, PDis.rcItem.Top *
                      (Integer(imgH) div Rect.Bottom), imgW, (Integer(imgH) div Rect.Bottom)
                      * ImgItemHeight, 2, nil, false, nil);
Rect ist leider leer, deshalb funktioniert die Division durch Rect.Bottom nicht.
Das liegt daran, dass WindowFromDC(PDis.HDC) 0 zurückliefert.

Ohne die Zeile wird das Menü angezeigt, allerdings wird der aktuelle Eintrag nach dem Hovern nicht wieder zurückgesetzt, sprich nach einmal Drüberfahren sehen alle gehovert aus.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Ordnung muss sein (LaunchBar)

  Alt 14. Jun 2017, 12:49
Der Absturz bei Windows 10 kommt von dieser Zeile (uMain.pas Zeile 961):
Delphi-Quellcode:
                  GDIP_DrawImageRectRectI(Graphics, ImgBack, ImgItemHeight, PDis.rcItem.Top,
                    Rect.Right - SideBarWidth, ImgItemHeight, 0, PDis.rcItem.Top *
                      (Integer(imgH) div Rect.Bottom), imgW, (Integer(imgH) div Rect.Bottom)
                      * ImgItemHeight, 2, nil, false, nil);
Rect ist leider leer, deshalb funktioniert die Division durch Rect.Bottom nicht.
Das liegt daran, dass WindowFromDC(PDis.HDC) 0 zurückliefert.
Danke dir für die Info.
Was kann man da machen?

Warum WindowFromDC jetzt 0 unter W10 zurück gibt ist mir schleierhaft.

Habe den Source nochmal aktualisiert da auch in CreateShortCut ein Problem mit dem Free vorlag.

vorher
Delphi-Quellcode:
constructor TShortCut.Create;
begin

  AddChildWindows();
  CreateIcon := TCreateIcon.Create;
end;
Delphi-Quellcode:
  if Assigned(Sprites) then
  begin
    if (Sprites.Count - 1) > ID_MAIN then
    begin
      for K := ID_FIRST to Sprites.Count - 1 do
      begin
        if Sprites[K].h_Bitmap <> 0 then
        begin
          DeleteObject(Sprites[K].h_Bitmap);
          Sprites[K].h_Bitmap := 0;
        end;
      end;
      Sprites.Free;
      AddChildWindows;
    end;
  end;
und jetzt
Delphi-Quellcode:
constructor TShortCut.Create;
begin

  CreateIcon := TCreateIcon.Create;
end;
Delphi-Quellcode:
  if Assigned(Sprites) then
  begin
    Sprites.Free;
    AddChildWindows;
  end else
  AddChildWindows;
Zitat:
Ohne die Zeile wird das Menü angezeigt, allerdings wird der aktuelle Eintrag nach dem Hovern nicht wieder zurückgesetzt, sprich nach einmal Drüberfahren sehen alle gehovert aus.
Nein, nein die brauchen wir weil sonst die Button zum selektieren der Einträge nicht neu gezeichnet werden.
Das Hintergrund Bitmap sorgt dafür das ein Invalidate auf das Menu ausgeführt wird.


gruss

Geändert von EWeiss (14. Jun 2017 um 13:44 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Ordnung muss sein (LaunchBar)

  Alt 14. Jun 2017, 13:30
Zitat:
WindowFromDC(PDis.HDC)
Versuch mal bitte
Wenn du Lust und zeit dafür hast.

Prop.hPopupMenu := FindWindow('#32768', nil);

Das Problem ist das die Handles von Menus dynamisch sind.
Das Handle Prop.hPopupMenu
Delphi-Quellcode:
    WM_RBUTTONDOWN:
      begin
        nObjectID := GetMouseMoveSpriteID(WinHandle, lpX, lpY);
        if nObjectID = 0 then
        begin
          Prop.hPopupMenu := CreatePopupMenu; // Bitmap Popupmenu
          if Prop.hPopupMenu <> 0 then
          begin
ist nicht das gleiche wie unter
Delphi-Quellcode:
    WM_DRAWITEM:
      begin
        PDis := Pointer(lP);
        case PDis^.CtlType of
          ODT_MENU:
            begin
              //Prop.hPopupMenu := WindowFromDC(FromDC);
              Prop.hPopupMenu := FindWindow('#32768', nil);
              Txt := PWideChar(GetMenuTxt(PDis.ItemId, Img, ImgHover, SideBarImg));
wäre es so dann brauchte ich es nicht neu zu initialisieren.

Funktioniert unter W7
Das müsste auch unter W10 gehen.

gruss

Geändert von EWeiss (14. Jun 2017 um 13:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.910 Beiträge
 
Delphi 12 Athens
 
#4

AW: Ordnung muss sein (LaunchBar)

  Alt 14. Jun 2017, 13:55
Ja, das funktioniert.

Es gibt noch einen minimalen Grafikfehler, wenn man das erste Mal mit der Maus über das Menü geht (da sieht man verschobene Schrift), aber sonst funktioniert das Kontextmenü dann.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Ordnung muss sein (LaunchBar)

  Alt 14. Jun 2017, 14:20
Ja, das funktioniert.

Es gibt noch einen minimalen Grafikfehler, wenn man das erste Mal mit der Maus über das Menü geht (da sieht man verschobene Schrift), aber sonst funktioniert das Kontextmenü dann.
Super dann lade ich die neue Version hoch.
Sorry mit dem minimalen Grafikfehler kann ich leider nichts machen. (bitte nicht wieder diskutieren das ich es nicht will)
Hier auf meinem System kann ich derartiges nicht ausmachen.. Ist einwandfrei.

Hoffe mal das nicht zu viel arges im Code zu finden ist

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Ordnung muss sein (LaunchBar)

  Alt 14. Jun 2017, 14:26
Neue Version oben W10 Menu Handle Problem gefixt.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#7

AW: Ordnung muss sein (LaunchBar)

  Alt 14. Jun 2017, 16:32
... geiles Teil (wenn Ich das mal so sagen darf) ...

was mir aufgefallen ist :

Die Menüeinträge erscheinen beim Überfahren mit der Mouse ein paar Pixel versetzt,
allerdings nur beim ersten Überfahren, danach nicht mehr - siehe Anhang.

Ich hab's jetzt nur unter W10 getestet, somit kann ich nicht sagen, ob es vielleicht ein
W10-Problem ist . . .

p.s. wenn ich richtig gezählt habe :
in X + 3 Pixel
in Y + 3 Pixel
Miniaturansicht angehängter Grafiken
menu.jpg  
Markus H.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Ordnung muss sein (LaunchBar)

  Alt 13. Aug 2018, 18:59
Der Absturz beim Rechtsklick bei Windows 10 kommt von dieser Zeile (uMain.pas Zeile 961):
Das liegt daran, dass WindowFromDC(PDis.HDC) 0 zurückliefert.

Ohne die Zeile wird das Menü angezeigt, allerdings wird der aktuelle Eintrag nach dem Hovern nicht wieder zurückgesetzt, sprich nach einmal Drüberfahren sehen alle gehovert aus.
Für die Leute die es interessiert warum die Menu Einträge verschoben und WindowFromDC 0 zurück liefert.
Es liegt definitiv an Windows. (Windows 7 und Up)

WindowFromDC liefert dann 0 zurück wenn Menu Animationen eingeschaltet sind.. das ist fakt.
Meine Lösung dazu ist bei OwnerDraw Menus diese Temporär auszuschalten wenn sie aktiv sind.

Delphi-Quellcode:
function TSkinEngine.SetMenuAnimation(MenuAnimation: BOOL): Boolean;
begin

  // Bisherige Einstellung ermitteln:
  result := SystemParametersInfo(SPI_GETMENUANIMATION, 0, @FOldSetting, 0);
  if result = false then
    // Result := False;
    // Der abfragende Aufruf war nicht erfolgreich
    exit; // Rückgabewert bleibt False

    // Wert ändern und Erfolg prüfen:
  if Bool(FOldSetting) <> MenuAnimation then
    result := SystemParametersInfo(SPI_SETMENUANIMATION, 0, Pointer(Ord(MenuAnimation)),
      SPIF_SENDCHANGE);
end;
gruss

Geändert von EWeiss (14. Aug 2018 um 02:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Ordnung muss sein (LaunchBar)

  Alt 13. Aug 2018, 20:28
Hallo nochmal, es existiert keine .ini Datei, nirgendwo.
Mit ProcMon komme ich auch nicht so richtig voran, da weiß ich teilweise nicht was der Fehler ist.
Es werden mir total viele Buffer Overflow Fehler in Verbindung beim Auslesen der System-Registrierung gezeigt.
Diese Overflows ziehen sich dann durch bis zum eigentlichen Crash.
So als ob oftmals Programm-Interne Values ein Result nicht aufnehmen können, zu klein oder falscher typ.
Da bei Dir so was nicht passiert werde ich wohl eine Ausnahme sein, kann man halt nichts machen, unter Win7 lief es bei mir gut.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Ordnung muss sein (LaunchBar)

  Alt 13. Aug 2018, 20:34
Dann erstell doch mal im Anwendungspfad ne Ottb.ini
Und knall das hier rein.
Und kopiere diese auch unter AppData

[OTTB Option]
SoundActive=1
ShortCutVisible=1

[Animator]
AnimatorClass=TWinAnimator
Delay=500
AnimationProbability=100

zudem.. Ich starte die Anwendung nicht mit Admin rechten. Also die Verknüpfung im Startmenu.

gruss

Geändert von EWeiss (11. Jul 2019 um 15:52 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 01:05 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