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 5 von 5   « Erste     345   
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 Neutral General
Neutral General

 
Delphi 10.2 Tokyo Professional
 
#41
  Alt 27. Okt 2015, 15:14
Ich habe das gleiche Problem wie whiteF. Mein Fenster erscheint unter dem reservierten Bereich.
Weiß da jemand woher das kommen kann?

EDIT: Okay das Problem war dass mein Formular auf alTop gestellt war. Das darf man nicht machen, dann gehts auch.
Michael

Geändert von Neutral General (27. Okt 2015 um 15:30 Uhr)
  Mit Zitat antworten Zitat
whiteF
 
#42
  Alt 12. Jul 2016, 10:30
Ich stoße auch mal wieder auf das problem wie neutral general, jedoch handelt es sich nicht um eine form aus der eigenen anwendung sondern eine fremdanwendung. Dh ich weiß nicht ob diese al_top ist. Ich sehe für ne milisekunde das die externe anwendung an die korrekte position verschoben wird aber sofort wieder unter den reservierten bereich hüpft.

Der reservierte bereich ist sogar sicherheitshalber 20px höher als die anwendung die dort erscheinen soll.

Mein code poste ich nachher da ich unterwegs bin.
Aber im grunde genommen ist es der gleiche wie im tutorial.

Muss man etwas bestimmtes beachten bei fremdanwendungen? Oder gibt es vorraussetzungen die von einer fremdanwendung erfüllt werden muss?

Edit:
Die externe anwendung ist bereits eine anwendung die am oberen bildschirmrand positioniert ist. Die weite geht über die komplette bildschirmbreite. Die höhe ca. 100px.
Sie hat ein title und border. Ein resize icon erscheint beim überfahren mit der mouse am border. Beim versuch die größe zu ändern, kann man höchsten 1 bis 2 px resizen und dann springt sie zurück auf die ursprüngliche größe. Beim versuch diese anwendung mittels drag and drop an der titelleiste zu bewegen tut sich nichts. Auch nicht per doppelklick auf die titelleiste.

Ich habe mittlerweile die starke befürchtung das diese externe anwendung bei jeder veränderung der Größe oder der position die ursprüngliche größe wieder annimmt und die position immer wieder versucht am oberen bereich zu positionieren (top: 0, left: 0).

Das würde erklären warum diese nach einem movewindow für eine milisekunde in meinem reservierten bereich erscheint und dann wieder gleich darunter.
Wer weiß welcher code diese anwendung benutzt. Mh...

Hat jemand eine idee solch eine anwendung dennoch in meinen reservierten bereich zu verschieben?

Sry für den langen text, aber ich wollte soviel details wie möglich euch mitteilen.

Vielleicht gibts ja ein tweak wie man alle fenster aus ein gewisses fensterhandle auf top: 100px bekommt...
Ich bin momentan ratlos...
VG

Geändert von whiteF (12. Jul 2016 um 16:06 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 5   « Erste     345   


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 16:22 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