Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TToolbarButton aus Toolbar entfernen (https://www.delphipraxis.net/164284-ttoolbarbutton-aus-toolbar-entfernen.html)

tools400 6. Nov 2011 18:04


TToolbarButton aus Toolbar entfernen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Zusammen,

ich versuche nun schon seit einigen Tagen, dem SVN Wizard von 'scdevelop' (http://delphiaddinfortortoisesvn.tigris.org/) beizubringen einige seiner Funktionen als Buttons in der 'Custom Toolbar' anzuzeigen. Prinzipiell funktioniert dies auch, wenn da nicht noch unter gewissen Umständen 'Geister-Buttons', dass heißt leere Buttons ohne Icon und ohne Action stehen bleiben würden. Im Detail bedeutet dies:

a) Der Wizard funktioniert, wenn er für ein Projekt aktiviert oder deaktiviert wird.

b) Er funktioniert nicht, wenn ein oder mehrere Projekte den Wizard einbinden und andere Projekte nicht. In den Projekten ohne Wizard werden dann in der 'Custom Toolbar' leere Buttons ohne Icon und Action angezeigt.

Erzeugt werden die Buttons mit diesem Code (http://stackoverflow.com/questions/4...button-runtime) (leicht modifiziert):

Code:
procedure TTortoiseSVN.AddActionToToolbar(var bar: TToolBar; action: TAction);
var
  newbtn: TToolButton;
  lastbtnidx: integer;
begin
  newbtn := TToolButton.Create(bar);
  newbtn.Action := action;
  lastbtnidx := bar.ButtonCount - 1;
  if lastbtnidx > -1 then
    newbtn.Left := bar.Buttons[lastbtnidx].Left + bar.Buttons[lastbtnidx].Width
  else
    newbtn.Left := 0;
  newbtn.Parent := bar;
  tSvnToolbarActions.Add(action);
end;
Und entfernt werden Buttons wie im "Component Writer’s Guide" (http://docwiki.embarcadero.com/RADSt...7s_Guide_Index) beschrieben.

Code:
procedure TTortoiseSVN.RemoveActionFromToolbar (Action: TAction; ToolBar: TToolBar);
var i: Integer;
    Btn: TToolButton;
begin
    for i := ToolBar.ButtonCount - 1 downto 0 do begin
      Btn := ToolBar.Buttons[I];
      if Btn.Action = Action then begin
        { Remove "Btn" from "ToolBar" }
        ToolBar.Perform(CM_CONTROLCHANGE, WPARAM(Btn), 0);
        Btn.Free;
      end;
    end;
end;
Screenshot_1.jpg zeigt, wie die Toolbar bei aktivem Wizard aussieht. Screenshot_2.jpg demonstriert die leeren 'Geister-Buttons'.

Hat jemand eine Idee, wie das Problem gelöst werden kann?

Die verwendete IDE ist Delphi 7, bzw. Delphi 7 Personal.

Thomas.

Furtbichler 7. Nov 2011 06:32

AW: TToolbarButton aus Toolbar entfernen
 
Sind die Buttons noch da, d.h. reagiert da etwas auf MouseOver, oder hat die Toolbar nur vergessen, sich neu zu organisieren? Könnte ja auch sein, das die Toolbar zu blöd ist, sich automatisch zu verkleinern. Da könnte man ja nachhelfen.

tools400 7. Nov 2011 07:08

AW: TToolbarButton aus Toolbar entfernen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Leider sind die Buttons noch vorhanden und reagieren auf MouseOver. Lediglich die Icons sind verschwunden und wenn man auf einen Button klickt, wird keine Aktion ausgelöst. Soll ich eventuell mal meinen Projektordner (74k) anhängen?

tools400 7. Nov 2011 12:33

AW: TToolbarButton aus Toolbar entfernen
 
Ich habe den Eindruck, dass es für dieses Problem keine vernünftige Lösung gibt oder das es sich möglicherweise sogar um einen Bug der Delphi IDE handelt. Folgendes konnte ich bisher beobachten:

Ausgangszustand:

Frisch installiertes Delphi mit 'TortoiseSVN.bpl' in DELPHI_HOME/Projects/Bpl.
Neues, nicht weiter modifiziertes Anwendungsprojekt, erstellt über 'Datei' -> 'Neu' -> 'Anwendung'. Nennen wird es 'Projekt1'. Das Projekt ist gespeichert und Delphi ist beendet.

Testablauf:

Starte ich nun die IDE für 'Projekt1' und aktiviere den Wizard über 'Komponente' -> 'Packages installieren', so erscheinen die SVN Buttons in der Toolbar und der neue Zustand der Toolbar wird mit dem Beenden von Delphi in folgenden Registry Key geschrieben:

HKEY_CURRENT_USER\Software\Borland\Delphi\7.0\Tool bars: "CustomToolBar"

Starte ich nun die IDE für 'Projekt1' erneut und deaktiviere den SVN Wizard, so verschwinden die SVN Buttons aus der Toolbar und und mit dem Beenden von Delphi entspricht die Registry wieder dem Ausgangszustand. Soweit funktioniert alles bestens.

So, und jetzt wird es spannend.

Zunächst wird die IDE wieder gestartet, 'Projekt1' geladen, der SVN Wizard aktiviert und die IDE beendet. Die Registry beinhaltet die neuen SVN Buttons.

Wird die IDE jetzt erneut gestartet, so erzeugt Delphi automatisch ein neues Projekt ohne SVN Wizard (ist ja auch richtig), zeigt jedoch die nun leeren und aktionslosen SVN Buttons an. Das ist falsch!

Die Vermutung liegt nahe, dass die Buttons angezeigt werden, weil sie ja durch 'Projekt1' zuvor in die Registry eingetragen worden sind. Falsch finde ich jedoch, dass Delphi nicht merkt, dass hinter den Buttons keinen Aktionen liegen (Button.Action = nil). Buttons ohne Actions dürften meiner Meinung nach nicht angezeigt werden.

Vielleicht noch wichtiger ist, dass mit dem Beenden des Wizards auch die Buttons aus der Toolbar entfernt wurden, jedoch nicht die Registry unverändert blieb!

Thomas.


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