Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Arbeiten mit AppBars (https://www.delphipraxis.net/24419-arbeiten-mit-appbars.html)

CalganX 20. Jun 2004 19:40


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:
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;
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.
Delphi-Quellcode:
  // 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;
Die AppBar wurde nun erzeugt. Am Ende muss der reservierte Platz auf jedenfall wieder freigegeben werden:
Delphi-Quellcode:
// zum Beispiel im OnDestroy-Ereignis des Formulars
begin
  SHAppBarMessage(ABM_REMOVE, aAppBarData);
end;
Fertig ist die AppBar.

Meflin 20. Jun 2004 19:44

Re: Arbeiten mit AppBars
 
äh und warum 3 mal das ganze?
frei nach dem motto alle guten dinge sind drei ;-)

CalganX 20. Jun 2004 19:47

Re: Arbeiten mit AppBars
 
Mozilla, wollte nicht so, wie ich. ;)

Chris

MrKnogge 11. Jul 2004 15:31

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...)

Alexander 11. Jul 2004 15:45

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...

CalganX 11. Jul 2004 15:53

Re: Arbeiten mit AppBars
 
Hi,
ich habe den Beitrag bereits (also ca. 8 Tage danach) in die CodeLibrary verschoben: AppBar automatisch hintergrundAppBar automatisch hintergrund

Chris

[edit=Chakotay1308]:shock: Ja wo isser denn? :gruebel: Ich geb dir gleich mal den Link.. ;)[/edit]
[edit=Chakotay1308]Hab ihn[/edit]

Weazy 30. Apr 2005 21:18

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:

Kidix 30. Apr 2005 21:41

Re: Arbeiten mit AppBars
 
bei mir auch

Sprint 30. Apr 2005 21:56

Re: Arbeiten mit AppBars
 
Delphi-Quellcode:
WM_USER

Kidix 1. Mai 2005 11:23

Re: Arbeiten mit AppBars
 
naja, sind noch mehrere Fehler drin...evtl sollte der Code mal überarbeitet werden!

Kidix

MisterNiceGuy 1. Mai 2005 11:42

Re: Arbeiten mit AppBars
 
Geht auch bei mir nicht :/ WM_User und _appbardata kennt er nicht

Sprint 12. Mai 2005 19:17

Re: Arbeiten mit AppBars
 
Zitat:

Zitat von MisterNiceGuy
Geht auch bei mir nicht :/ WM_User und _appbardata kennt er nicht

Die Konstante WM_USER befindet sich in der Unit "Messages". Und _AppBarData oder besser TAppBarData findest du in der Unit "ShellAPI".

CalganX 12. Mai 2005 21:38

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

SirThornberry 12. Mai 2005 21:53

Re: Arbeiten mit AppBars
 
Warum
Delphi-Quellcode:
aAppBarData: _AppBarData
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.

Fingolfin 12. Mai 2005 21:54

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.

Luckie 12. Mai 2005 23:44

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.

MisterNiceGuy 13. Mai 2005 10:44

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!';

CalganX 13. Mai 2005 13:27

Re: Arbeiten mit AppBars
 
Hi,
ich habe das mal oben alles korrigiert. ;)
Chris

phlux 6. Jun 2005 17:19

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:
// 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;
mfg phlux :hi:

CalganX 6. Jun 2005 18:40

Re: Arbeiten mit AppBars
 
Hi phlux,
done. :)
Danke für die Hinweise. :thumb:

Chris

Delphi-Freak 26. Jun 2005 19:34

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

Jonas 18. Nov 2005 07:44

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 :(

CalganX 18. Nov 2005 09:24

Re: Arbeiten mit AppBars
 
Hi,
steht im SourceCode drin:
Delphi-Quellcode:
  // Wo soll die AppBar sein?
  fAppBarData.uEdge := ABE_TOP;
  {Alternative Werte: ABE_BOTTOM, ABE_LEFT, ABE_RIGHT}
Musst halt ABE_TOP ersetzen durch die jeweilige andere Position...

Chris

Jonas 18. Nov 2005 09:42

Re: Arbeiten mit AppBars
 
Joa das hab ich ja auch gemacht dem entsprechend auf ABE_BOTTOM.....funktioniert jedoch nicht.

Delphi-Freak 18. Nov 2005 14:25

Re: Arbeiten mit AppBars
 
Kommt sich die vielleicht mit der Tastleiste in die Quere?

Jonas 20. Nov 2005 17:22

Re: Arbeiten mit AppBars
 
Ich denke nicht, naja hab keine ahnung wie das gehn soll!...Jemand ne idee?

Delphi-Freak 20. Nov 2005 17:39

Re: Arbeiten mit AppBars
 
Hast du unten die Taskleiste?

phlux 20. Nov 2005 20:53

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 :!:

Jonas 21. Nov 2005 12:38

Re: Arbeiten mit AppBars
 
Ne ich hab die Taskleiste anner Seite (links).

Sanguis 21. Feb 2007 12:50

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

-187- 11. Jul 2008 09:29

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.

einfach112 25. Jul 2008 21:17

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

S4SH1981 1. Jun 2009 14:28

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:
  // Formular genauso breit machen, wie Bildschirm
  self.Width := 100;
gehts nicht.

Gruß S4SH

S4SH1981 5. Jun 2009 19:28

Re: Arbeiten mit AppBars
 
PUSH

mkinzler 5. Jun 2009 19:31

Re: Arbeiten mit AppBars
 
Zitat:

self.Width := Screen.Width;
mcht das Formular so breit wie den Bildschirm

S4SH1981 5. Jun 2009 19:52

Re: Arbeiten mit AppBars
 
Danke Kinzler,

aber ich will, dass mein Fenster nur 100 Pixel breit wird.

S4SH1981 6. Jun 2009 19:50

Re: Arbeiten mit AppBars
 
*PUSH*

MuTzE.Y85 19. Jun 2010 15:23

AW: Arbeiten mit AppBars
 
@ S4SH1981

Code:
MoveWindow(fAppBarData.hWnd, Screen.Width div 2 - 50, fAppBarData.Rc.Top, 100, fAppBarData.rc.Bottom, True);
50 Pixel von der Mitte anfangen und 100 Breit.

whiteF 21. Aug 2012 19:56

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?

MuTzE.Y85 16. Sep 2012 14:36

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 17:07 Uhr.
Seite 1 von 2  1 2      

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