AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Arbeiten mit AppBars
Tutorial durchsuchen
Ansicht
Themen-Optionen

Arbeiten mit AppBars

Ein Tutorial von CalganX · begonnen am 20. Jun 2004 · letzter Beitrag vom 12. Jul 2016
Antwort Antwort
Seite 3 von 5     123 45      
CalganX
Registriert seit: 21. Jul 2002
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.
 
Benutzerbild von Delphi-Freak
Delphi-Freak

 
Delphi 2006 Architect
 
#21
  Alt 26. Jun 2005, 20:34
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
Gerhard Pfister
  Mit Zitat antworten Zitat
Jonas

 
Delphi 2007 Professional
 
#22
  Alt 18. Nov 2005, 08:44
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
  Mit Zitat antworten Zitat
CalganX

 
Turbo Delphi für Win32
 
#23
  Alt 18. Nov 2005, 10:24
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
  Mit Zitat antworten Zitat
Jonas

 
Delphi 2007 Professional
 
#24
  Alt 18. Nov 2005, 10:42
Joa das hab ich ja auch gemacht dem entsprechend auf ABE_BOTTOM.....funktioniert jedoch nicht.
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Freak
Delphi-Freak

 
Delphi 2006 Architect
 
#25
  Alt 18. Nov 2005, 15:25
Kommt sich die vielleicht mit der Tastleiste in die Quere?
Gerhard Pfister
  Mit Zitat antworten Zitat
Jonas

 
Delphi 2007 Professional
 
#26
  Alt 20. Nov 2005, 18:22
Ich denke nicht, naja hab keine ahnung wie das gehn soll!...Jemand ne idee?
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Freak
Delphi-Freak

 
Delphi 2006 Architect
 
#27
  Alt 20. Nov 2005, 18:39
Hast du unten die Taskleiste?
Gerhard Pfister
  Mit Zitat antworten Zitat
Benutzerbild von phlux
phlux

 
Delphi 6 Personal
 
#28
  Alt 20. Nov 2005, 21:53
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
Christian "phlux" Arndt
  Mit Zitat antworten Zitat
Jonas

 
Delphi 2007 Professional
 
#29
  Alt 21. Nov 2005, 13:38
Ne ich hab die Taskleiste anner Seite (links).
  Mit Zitat antworten Zitat
Sanguis
 
#30
  Alt 21. Feb 2007, 13:50
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 5     123 45      


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 21:28 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