![]() |
Arbeiten mit AppBars
Sogenannte AppBars sind bspw. Formulare, die an einer Deskseite sitzen und sich verhalten, wie die Taskleiste: es kann z.B. kein Fenster darüber liegen und es ist immer zu sehen.
Diese AppBar's lassen sich auch mit Delphi-Mitteln relativ einfach erzeugen. Im folgenden will ich das einmal kurz erklären. Als erstes brauchen wir eine Variable vom Typ _AppBarData. Diese Variable enthält alle wichtige Informationen über die AppBar, die wir an Windows senden. Die Variable muss global bzw. ein Feld des Formulares sein, weil wir auf sie mehrmals im Programm zugreifen müssen. Dann füllen wir dieses Record mit Daten:
Delphi-Quellcode:
Die letzten Zeilen Code zeigen den zu reservierenden Platz. Das Formular kann durchaus größer/kleiner sein (dann müsste bei rc.Bottom ein anderer Wert stehen). Allerdings würde das bewirken, dass der reservierte Platz nicht mehr dem Formular entspricht und es somit zu durchaus komischen Konstruktionen kommen kann.
uses {...}, ShellApi, {...};
{...} type TfrmMain = class(TForm) {...} private fAppBarData: _AppBarData; {...} end; const // Konstante, die als CallBack für die AppBar arbeitet WM_APPBARMSG = WM_USER + 1; {...} // bspw. im OnCreate-Ereignis des Formulares, welches als AppBar dienen soll var iResult: integer; begin // Größe der ganzen Struktur fAppBarData.cbSize := SizeOf(TAppBarData); // Handle des Formulares, das als AppBar dienen soll fAppBarData.hWnd := Self.Handle; // Callback-Message fAppBarData.uCallbackMessage := WM_APPBARMSG; // Wo soll die AppBar sein? fAppBarData.uEdge := ABE_TOP; {Alternative Werte: ABE_BOTTOM, ABE_LEFT, ABE_RIGHT} // Rect für den reservierten Platz, wo keine Anwendung "hin darf" fAppBarData.rc.Left := 0; fAppBarData.rc.Right := 0; fAppBarData.rc.Top := 0; fAppBarData.rc.Bottom := self.ClientHeight;
Delphi-Quellcode:
Die AppBar wurde nun erzeugt. Am Ende muss der reservierte Platz auf jedenfall wieder freigegeben werden:
// AppBar erstellen
iResult := SHAppBarMessage(ABM_NEW, fAppBarData); // Hat das Erzeugen geklappt? if iResult = 0 then begin ShowMessage('Die AppBar konnte nicht erzeugt werden. Unter Umständen existiert bereits eine AppBar an dieser Position.'); Exit; end; // Formular genauso breit machen, wie Bildschirm self.Width := screen.Width; // Position abfragen und nochmal setzen SHAppBarMessage(ABM_QUERYPOS, fAppBarData); SHAppBarMessage(ABM_SETPOS, fAppBarData); // Nachrichtenschleife abarbeiten Application.ProcessMessages; // Bringt das Fenster an die gewünschte Position. Dazu werden die vorher festgelegten Werte verwendet. MoveWindow(aAppBarData.hWnd, fAppBarData.rc.Left, fAppBarData.Rc.Top, GetSystemMetrics(SM_CXSCREEN), fAppBarData.rc.Bottom, true); end;
Delphi-Quellcode:
Fertig ist die AppBar.
// zum Beispiel im OnDestroy-Ereignis des Formulars
begin SHAppBarMessage(ABM_REMOVE, aAppBarData); end; |
Re: Arbeiten mit AppBars
äh und warum 3 mal das ganze?
frei nach dem motto alle guten dinge sind drei ;-) |
Re: Arbeiten mit AppBars
Mozilla, wollte nicht so, wie ich. ;)
Chris |
Re: Arbeiten mit AppBars
Klappt ganz gut, könntest du noch ein Beispiel bezüglich "Auto-Hide" und das verschieben der AppBar posten (von einem Bildschirmrand zum anderen...)
|
Re: Arbeiten mit AppBars
Verschieben: Einfach den Platz für die APPBAR freigeben, dann den neuen an einer anderen Seite reservieren und mit MoveWindow an die entsprechende Stelle schieben. Ach so das Fenster muss natürlich von der Größe etc auch noch angepasst werden...
Edit: Beispiel für's Auto-Hide hat Chal neulich schon ein mal gepostet, such am besten mal... |
Re: Arbeiten mit AppBars
Hi,
ich habe den Beitrag bereits (also ca. 8 Tage danach) in die CodeLibrary verschoben: ![]() Chris [edit=Chakotay1308]:shock: Ja wo isser denn? :gruebel: Ich geb dir gleich mal den Link.. ;)[/edit] [edit=Chakotay1308] ![]() |
Re: Arbeiten mit AppBars
A :gruebel: lso vielleicht ist das nur mal wieder so ne Newbie Frage, aber ich habe da so das Problem das bei mir immer die Fehlermeldung dass WMUSER ein ungültiger bezeichener sei (muss ich irgend etrwas unter uses ändern??) :drunken:
|
Re: Arbeiten mit AppBars
bei mir auch
|
Re: Arbeiten mit AppBars
Delphi-Quellcode:
WM_USER
|
Re: Arbeiten mit AppBars
naja, sind noch mehrere Fehler drin...evtl sollte der Code mal überarbeitet werden!
Kidix |
Re: Arbeiten mit AppBars
Geht auch bei mir nicht :/ WM_User und _appbardata kennt er nicht
|
Re: Arbeiten mit AppBars
Zitat:
|
Re: Arbeiten mit AppBars
Hi,
sorry der Beitrag ist mir ein wenig durch die Lappen gegangen, ich werde die Hinweise auf die Units noch ergänzen. Jemand sonst noch irgendwelche Fehler gefunden? Chris |
Re: Arbeiten mit AppBars
Warum
Delphi-Quellcode:
als Globale, nur weil man es mehrmals nutzt? Für sowas gibt es doch Private. Schließlich bezieht sich das ganze auf das Hauptform und geht die anderen klassen nix an.
aAppBarData: _AppBarData
|
Re: Arbeiten mit AppBars
Das Tutorial ist echt gut, hat mir einen guten Start in die Materie vermittelt. :thumb:
Aber so wie ich das sehe sind Appbars mitunter ein ziemliches Problem, aber vielleicht weiß ja jemand Rat. Die Nutzung einer Appbar zerballert mir einfach manche Menüs in anderen Fenstern. Bei Delphi 2005 kann ich das z.B beobachten. Da ist nach der Erzeugung der Appbar erstmal das Hauptmenü "unter" den Toolbars. Wenn da jemand einen Tipp hätte, wärs toll. |
Re: Arbeiten mit AppBars
Man sollte aber vorher überprüfen, ob sich nicht an der Seite schon eine Appbar befindet. sonst gehat das nämlich schief.
|
Re: Arbeiten mit AppBars
@sprint: Öhm, das Problem ist, dass Chakotay WM_user hätte schreiben müssen.
Damit gehts, jetzt bekomme ich nurnoch einen Fehler bei WM_Appbar (Undef. Bezeichner) P.S. Einmal muss es iResult heißen, nicht result!!! Edit1.text := 'Oleole es geht, man muss WM_APPBARMSG schreiben, dann klappts!'; |
Re: Arbeiten mit AppBars
Hi,
ich habe das mal oben alles korrigiert. ;) Chris |
Re: Arbeiten mit AppBars
Nachdem ich hier ein bissl rumgeschnüffelt habe, sind mir ein paar fehler aufgefallen (ich poste mal nur das korrigierte ;) ):
Delphi-Quellcode:
mfg phlux :hi:
// In der Uses Klausel fehlt die Angaben von ShellApi
// Wenn man schon oben die Variable aAppBarData in fAppBarData umbenennt sollte man es vllt auch im // ganzen code tun ;) // Zeile 11 WM_APPBARMSG = WM_USER + 1; |
Re: Arbeiten mit AppBars
Hi phlux,
done. :) Danke für die Hinweise. :thumb: Chris |
Re: Arbeiten mit AppBars
Ein kleiner Fehler ist mir noch aufgefallen:
In der Zeile 20 im 2. Codeblock steht noch aAppBarData - gehört wahrscheinlich fAppBarData Edit: Im 3. Codeblock steht auch noch aAppBarData LG, Delphi-Freak |
Re: Arbeiten mit AppBars
Hi...also funzen tut das schon....nur meine frage ist, wie bekomm ich die Appbar anstatt nu oben, wo sie ist nach unten bzw. zu Seite?
Ist zwar gut und eigentlich relativ verständlich erklärt doch irgendwie bekomm ich das mit dem nach unten nicht hin :( |
Re: Arbeiten mit AppBars
Hi,
steht im SourceCode drin:
Delphi-Quellcode:
Musst halt ABE_TOP ersetzen durch die jeweilige andere Position...
// Wo soll die AppBar sein?
fAppBarData.uEdge := ABE_TOP; {Alternative Werte: ABE_BOTTOM, ABE_LEFT, ABE_RIGHT} Chris |
Re: Arbeiten mit AppBars
Joa das hab ich ja auch gemacht dem entsprechend auf ABE_BOTTOM.....funktioniert jedoch nicht.
|
Re: Arbeiten mit AppBars
Kommt sich die vielleicht mit der Tastleiste in die Quere?
|
Re: Arbeiten mit AppBars
Ich denke nicht, naja hab keine ahnung wie das gehn soll!...Jemand ne idee?
|
Re: Arbeiten mit AppBars
Hast du unten die Taskleiste?
|
Re: Arbeiten mit AppBars
soweit ich mich erinnern kann, kann es maximal nur eine appbar pro seite geben, wenn du unten also die taskbar hast, hast du schlechte karten :!:
|
Re: Arbeiten mit AppBars
Ne ich hab die Taskleiste anner Seite (links).
|
Re: Arbeiten mit AppBars
Guten Tag,
sorry das ich diesen älteren Beitrag jetzt hochhole. Aber ich hab da ein Problem was mit dem Beitrag zusammen hängt. Undzwar versuch ich den Code hierraus zu verwenden, was im Prinzip auch wunderbar klappt. Problem ist nur, das ich wohl den Explorer im Hintergrund brauche. Und den hab ich nicht. Ich habe also keinen Desktop und keine Taskleiste. Jetzt möchte ich trotzdem ein Fenster als Leiste oben "pinnen" können, die IMMER im Fordergrund ist. Wenn die explorer.exe im Hintergrund läuft, klappt das problemlos. Läuft sie nicht, bekomme ich die Meldung das schon eine AppBar an der Stelle läuft und sie deshalb nicht erzeugt werden kann. Gibt es da trotzdem Möglichkeiten? Gruß, Andreas |
Re: Arbeiten mit AppBars
Danke erstmal ! ..es waren leider noch ein paar Fehler drinne, hier der Code den ich benutzt habe...
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ShellApi; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private fAppBarData: _AppBarData; public { Public declarations } end; const WM_APPBARMSG = WM_USER + 1; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var iResult: integer; begin // Größe der ganzen Struktur fAppBarData.cbSize := SizeOf(TAppBarData); // Handle des Formulares, das als AppBar dienen soll fAppBarData.hWnd := Self.Handle; // Callback-Message fAppBarData.uCallbackMessage := WM_APPBARMSG; // Wo soll die AppBar sein? fAppBarData.uEdge := ABE_TOP; {Alternative Werte: ABE_BOTTOM, ABE_LEFT, ABE_RIGHT} // Rect für den reservierten Platz, wo keine Anwendung "hin darf" fAppBarData.rc.Left := 0; fAppBarData.rc.Right := 0; fAppBarData.rc.Top := 0; fAppBarData.rc.Bottom := self.ClientHeight; // AppBar erstellen iResult := SHAppBarMessage(ABM_NEW, fAppBarData); // Hat das Erzeugen geklappt? if iResult = 0 then begin ShowMessage('Die AppBar konnte nicht erzeugt werden. Unter Umständen existiert bereits eine AppBar an dieser Position.'); Exit; end; // Formular genauso breit machen, wie Bildschirm self.Width := screen.Width; // Position abfragen und nochmal setzen SHAppBarMessage(ABM_QUERYPOS, fAppBarData); SHAppBarMessage(ABM_SETPOS, fAppBarData); // Nachrichtenschleife abarbeiten Application.ProcessMessages; // Bringt das Fenster an die gewünschte Position. Dazu werden die vorher festgelegten Werte verwendet. MoveWindow(fAppBarData.hWnd, fAppBarData.rc.Left, fAppBarData.Rc.Top, GetSystemMetrics(SM_CXSCREEN), fAppBarData.rc.Bottom, true); end; procedure TForm1.FormDestroy(Sender: TObject); begin SHAppBarMessage(ABM_REMOVE, fAppBarData); end; end. |
Re: Arbeiten mit AppBars
SHAppBarMessage(ABM_REMOVE, fAppBarData);
damit habe ich ein problem .... habe die bar als fAppBarData.uEdge := ABE_BOTTOM; jetzt muss ich ab und zu die grösse meines programms ändern bzw. somit auch die grösse des reservierten bereichs ... also lösche ich zunächst den reservierten platz mit : SHAppBarMessage(ABM_REMOVE, fAppBarData); das problem ist .... in diesem moment erstreckt sich meine form über den ganzen Bildschirm.... ich setze zwar dann den platz neu und meine form nimmt dann auch wieder gestallt an aber wie gesagt für einen hundertstel teil erstreckt sich das programm.... jetzt die frage wie kann ich dieses umgehen !? Danke schonmal wie immer im voraus ! einfach112 |
Re: Arbeiten mit AppBars
Hallo
wie bekomme ich es denn hin, dass ich den ganzen Bereich reserviere, aber mein fenster links rechts mitte angeordnet wird. sagen wir mal mit 100 pixeln. Mit
Delphi-Quellcode:
gehts nicht.
// Formular genauso breit machen, wie Bildschirm
self.Width := 100; Gruß S4SH |
Re: Arbeiten mit AppBars
PUSH
|
Re: Arbeiten mit AppBars
Zitat:
|
Re: Arbeiten mit AppBars
Danke Kinzler,
aber ich will, dass mein Fenster nur 100 Pixel breit wird. |
Re: Arbeiten mit AppBars
*PUSH*
|
AW: Arbeiten mit AppBars
@ S4SH1981
Code:
50 Pixel von der Mitte anfangen und 100 Breit.
MoveWindow(fAppBarData.hWnd, Screen.Width div 2 - 50, fAppBarData.Rc.Top, 100, fAppBarData.rc.Bottom, True);
|
AW: Arbeiten mit AppBars
Liste der Anhänge anzeigen (Anzahl: 1)
hi,
meine Form wird unter dem reservierten Bereich angeordnet :!::!::?::?: Eig. sollte diese Form ja in dem reservierten Bereich. Hab den Code 1zu1 kopiert. Daten PC: Win 7 / 1920*1080 Screenshot anbei: Anhang 37483 Die Höhe des blauen freien Bereichs gleicht, dem der Höhe der sichtbaren Form2. weiß jmd was da schief läuft? |
AW: Arbeiten mit AppBars
Also bei mir ist es mit dem Code oben im reservierten Bereich.
Hast du das Fenster zu irgendeinem Zeitpunkt in der Größe oder so verändert? Wenn ich das mache, z.B. mit der Maus, dann ist es darunter. Bei dir ist das Form2. Was macht Form1? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:00 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