Entwickler-Ecke

Windows API - Sidebar bereich wird nicht freigegen


crakos - Fr 13.05.05 16:12
Titel: Sidebar bereich wird nicht freigegen
//////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Problem zwar gelöst:hier [http://www.delphi-forum.de/viewtopic.php?t=41860#252009]
ABER: Der fehler im Programcode wurde bis jetzt NICHT gefunden!
//////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Hallo, hoffe hab das richtige Sparte erwischt :)
Ich benutze diesen Code zum erstellen meiner Taskleiste, funktioniert auch perfekt.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
   Data.cbSize := SizeOf(TAppBarData);; 
   Data.hWnd := MainForm.Handle; 
   Data.uCallbackMessage := WM_APP; 
   Data.uEdge := ABE_TOP; 
   Data.rc.Left := 0
   Data.rc.Top := 0
   Data.rc.Right := 200
   Data.rc.Bottom := 70;
   if SHAppBarMessage(ABM_NEW, Data) = 0 then 
   begin 
     ShowMessage('AppBar konnte nicht registriert werden'); 
     exit; 
   end
   SHAppBarMessage(ABM_QUERYPOS, Data); 
   SHAppBarMessage(ABM_SETPOS, Data);
   MainForm.BorderStyle := bsNone; 
   MoveWindow(MainForm.Handle, 00, Screen.Width, 70, True);


Das Problem ist, wenn ich das Program schließe, wird der Bereich nicht wieder freigegeben, ich kann also keine Fenster in den Bereich ziehen.

Delphi-Quelltext
1:
SHAppBarMessage(ABM_REMOVE, Data);                    


Ich habe diesen befehl so ziemlich überall hingeschrieben(ende button,destroy,onclose)
hilft nix.

Wo ist mein Fehler?

Vielen dank schonmal

Moderiert von user profile iconraziel: Titel geändert: Redundantes nicht entfernt.


feivel3333 - Fr 13.05.05 21:24

Gibt es bei deinem Data-Element ein Release, also z.B.

Data.Release;

oder

Data.Free;

oder

Data := NIL beim Beenden des Programms?

Da ich nur ein Fragment des gesamten Quellcodes sehe, kann ich es nicht nachvollziehen. Zudem weiß ich nicht, auf welcher Delphi-Version du arbeitest. Und vor allem nicht, was Data überhaupt ist, woraus es generiert wurde.

Gruß, AS


crakos - Fr 13.05.05 21:41

sry

Delphi-Quelltext
1:
Data: TAppBarData;                    

Das ist der gesamte sidebar code.
hab delphi 2005 per steht doch rechts bei mir.
free und Release bringt nix
außerdem versteh ich nicht was das direkt bringt.

Delphi-Quelltext
1:
SHAppBarMessage(ABM_REMOVE, Data);                    

dachte dies bedeutet, das er den bereich, mit den werten von data wieder freigibt.


feivel3333 - Fr 13.05.05 21:53

Bei D2K muss ich passen, da muss jemand anderes helfen. Habe diese Version leider noch nicht.

Schönes Wochenende an alle!


crakos - Fr 13.05.05 21:56

schade, wusste gar nicht, das da so ein unterschied zwischen den delphi versionen ist.
Aber danke fürs antworten :)


JayEff - Fr 13.05.05 23:34

Erzeugt D2K5 nicht nur .NET code? ich glaube, es gelesen zu haben... jedenfalls hab ich versucht anhand von D7 jemandem mit D2k5 die grundbegriffe beizubringen. an Label1.Caption:='hallo' sind wir gescheitert...


Delete - Fr 13.05.05 23:58

Nein, so wohl als auch. Du kannst damit beides erstellen.


crakos - Sa 14.05.05 00:18

D2k5 unterstüzt beides. Das prg hab ich nicht in .net geschrieben
habe noch nie was in .net geschrieben. Kenne voner Schule nur win32 also die normale delphie sprache. Ich weiss nicht wo da der unterschied eigentlich ist.

Achso um in d2k5 eine win 32 form zu starten,
File->New->VCL Forms Application-Delphi for Win32
einen anderen Weg hab ich bisher nicht gefunden :)
Hoffe einer von euch kann mir nun sagen, warum der ver$&#te Bereich nicht wieder freigegeben wird.


crakos - Sa 14.05.05 01:15

was ich gerade herrausgefunden hab, wenn ich die MainForm(Sidebar) mit
BorderStyle=bsNone starte, dann habe ich in dem Bereich, wo normalerweise die Sidebar ist, ein leeres desktop feld, in das ich nichts hineinziehen kann.
Die MainForm befindet sich erst dadrunter.
Wenn ich aber die MainForm schließe und den code SHAppBarMessage(ABM_REMOVE, Data); ausführe, ist der Bereich wieder freigegeben.

Wenn ich es mit BorderStyle=bsSingle starte, dann befindet sich die Sidebar an ihrem Richtigen platz, aber der Platz wird nicht freigegeben.

Habs grad mal versucht beim Starten bsSingle
und beim verlaßen


Delphi-Quelltext
1:
2:
3:
   MainForm.BorderStyle:=bsNone;
   MainForm.Update;
   SHAppBarMessage(ABM_REMOVE, Data);

Hilft aber nichts hoffe nun kann mir einer helfen.
Versuche dann morgen weiter,hoffe aber ihr helft mir auf die Sprünge :)


crakos - Sa 14.05.05 12:08

Morgen,
Habe gerade mal rumgespielt.
Also wenn ich die grundeinstellung(opjektinspektor) bsSingle hab
dann kommt Richtiger Bereich, wird aber nicht wieder freigegeben.

Wenn ich grundeinstellung bsNone ANSCHLIEßEND mache
Also single starten schließen, bsnone einstellen starten.

Ist es der Richtige Bereich, UND der Bereich wird nachher auch freigegeben.

Na also denkste machste von anfang an bsNone ja von wegen,
Dann ist wieder das wie gerade beschrieben: Taskbereich registriert, aber die leiste nicht drin Oo, aber wird nachher freigegeben.

Ich könnt heulen Oo


crakos - Sa 14.05.05 12:48

Naja hab jetzt sowas wie eine Lösung. Geflällt mir zwar nicht, weil es das übel nicht an der wurtzel packt,also wenn wer den richtigen fehler findet, bitte mitteilen. danke.

Habe im FormDestroy den vollständigen sidebar code vor    SHAppBarMessage(ABM_REMOVE, Data); geschrieben. naja nun gehts. Aber wie gesagt gefallen tut mir das nicht :/

Also wer weiss warum, warte ;)