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 2 von 5     12 34     Letzte »    
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 MisterNiceGuy
MisterNiceGuy

 
Delphi 7 Personal
 
#11
  Alt 1. Mai 2005, 12:42
Geht auch bei mir nicht :/ WM_User und _appbardata kennt er nicht
Jonas
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

 
Delphi 5 Professional
 
#12
  Alt 12. Mai 2005, 20:17
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".
  Mit Zitat antworten Zitat
CalganX

 
Turbo Delphi für Win32
 
#13
  Alt 12. Mai 2005, 22:38
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry

 
Delphi 2006 Professional
 
#14
  Alt 12. Mai 2005, 22:53
Warum
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.
Jens
  Mit Zitat antworten Zitat
Fingolfin
 
#15
  Alt 12. Mai 2005, 22:54
Das Tutorial ist echt gut, hat mir einen guten Start in die Materie vermittelt.

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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#16
  Alt 13. Mai 2005, 00:44
Man sollte aber vorher überprüfen, ob sich nicht an der Seite schon eine Appbar befindet. sonst gehat das nämlich schief.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von MisterNiceGuy
MisterNiceGuy

 
Delphi 7 Personal
 
#17
  Alt 13. Mai 2005, 11:44
@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!';
Jonas
  Mit Zitat antworten Zitat
CalganX

 
Turbo Delphi für Win32
 
#18
  Alt 13. Mai 2005, 14:27
Hi,
ich habe das mal oben alles korrigiert.
Chris
  Mit Zitat antworten Zitat
Benutzerbild von phlux
phlux

 
Delphi 6 Personal
 
#19
  Alt 6. Jun 2005, 18:19
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
Christian "phlux" Arndt
  Mit Zitat antworten Zitat
CalganX

 
Turbo Delphi für Win32
 
#20
  Alt 6. Jun 2005, 19:40
Hi phlux,
done.
Danke für die Hinweise.

Chris
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


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