Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Panel verschieben (https://www.delphipraxis.net/129732-panel-verschieben.html)

_frank_ 8. Mär 2009 13:41

Re: Panel verschieben
 
Zitat:

Zitat von Kullerkeks
ja das ist so ähnlich, aber wieder mit klassen und mit images auf panels... der quelltext verwirrt mich :pale:

welchen Quelltext meinst du? den mit dem MouseOver/Down/Up? was genau ist da unklar?

Zitat:

Zitat von Kullerkeks
könntest du vllt. einfach ein beispiel schreiben, wie ich ein panel auf ein anderes "legen" kann?
(ich weiß nicht, ob es wichtig ist, dass da noch etwas drunter liegt!? also eine "scheibe" soll auf einen "stab" [türme von hanoi])

naja, du musst halt beim Ablegen prüfen, ob an der position (bzw. etsprechend versetzt) das andere Panel liegt und entweder das ablegen erluben oder zurückspringen an die alte Position. für die Reihenfolge der "Scheiben" kannst du das Tag-Property verwenden und entsprechend darauf prüfen.

@larsi: bitte delphi-tags verwenden

Gruß Frank

Kullerkeks 10. Mär 2009 18:43

Re: Panel verschieben
 
also das von Larsi funktioniert erst mal - d.h. ich kann das Panel bewegen (danke!!!)

jetzt müsste ich noch wissen, wie ich einschränken kann, wo es abgelegt wird, also dass man das panel nicht überall hinlegen kann sondern nur an eine bestimmte position.
und was bedeutet das hier genau: "(WM_SYSCOMMAND,$F012,0)" ?

(danke schon mal)

_frank_ 10. Mär 2009 21:08

Re: Panel verschieben
 
machst du es genauso wie larsi geschrieben hat? (also nur bewegen, wenn Shift-taste gedrückt ist)
oder per Mousedown/MouseUp?
bei ersterem wird es schwierig, den Ablegezeitpunkt zu ermitteln (timer u.ä. wäre in meinen Augen zu sehr gebastelt).
man könnte es evtl. noch mit onKeyUp probieren und beim loslassen der shift-taste die aktuelle position prüfen und ggf. an die alte (vor dem verschieben gesicherte) Position zurücksetzen.
MouseDown/MouseUp (egal ob mit ht-Caption,WM_SYSCOMMAND+$F012 oder manuell) finde ich eleganter und intuitiver, dort prüfst du einfach beim MouseUp und setzt wie oben bei nicht erlaubter position auf die alte zurück.

zu der Frage mit dem $F012 und WM_SYSCOMMAND (welche ich für ungünstig halte, da man nicht gleich sieht, was man da eigentlich mit der Sendmessage bezwecken will)...

schau mal da ist das ganz gut erklärt:
http://support.microsoft.com/kb/114593

Gruß Frank

Kullerkeks 11. Mär 2009 19:04

Re: Panel verschieben
 
Zitat:

Wenn Sie auf die Titelleiste klicken, wird der Wert, der von WM_SYSCOMMAND gesandt wird, von WM_SYSCOMMAND gesandt und HF012.
---> das ist aber unlogisch xD

naja und bei dem anderen muss ich gar nicht die shift-taste gedrückt halten.
ich habe den quelltext genau so übernommen (natürlich die panel-nummern geändert) und kann sie per mausklick frei bewegen.
habe dann auch versucht, eine "einschränkung" zu schreiben, indem ich festgelegt habe, dass z.b. panel1 nicht bewegt werden darf, wenn sich panel2 an einer bestimmten position (genau darüber) befindet

Delphi-Quellcode:
procedure TForm1.Panel5MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if Panel6.left<>8  and if Panel6.top<>504
then begin
    if ssLeft in Shift then
    begin
      ReleaseCapture;
      Panel24.Perform(WM_SYSCOMMAND,$F012,0);
    end;
end;
end;
aber da kommt immer das hier: [Fehler](470): Operator ist auf diesen Operandentyp nicht anwendbar

_frank_ 11. Mär 2009 21:59

Re: Panel verschieben
 
automatische Übersetzung und ihre tücken :)

damit ist gemeint, dass beim klick auf die Titelleiste an das zugehörige Control (das Fenster) eine WM_Syscommand-Message geschickt wird mit dem wert $F012.

appropos ist meiner Auffassung nach das MouseMove-Event falsch für den zweck. gehört eigentlich ins Mousedown, wenn man schon das komische $F012 nimmt.
dein Fehler kommt daher, dass der compiler folgendes versucht:

Delphi-Quellcode:
8 and if
geht natürlich nicht...was hilft sind klammern und das zweite if weg
Delphi-Quellcode:
if (Panel6.left<>8) and (Panel6.top<>504) then
dürfte aber in jedem Tutorial stehen...

HTH Frank

Kullerkeks 12. Mär 2009 19:01

Re: Panel verschieben
 
oh wow, jetzt funktionierts :-D :hello:
danke!!
aber wieso ist "onmousemove" nicht geeignet? es funktioniert doch und das zählt doch (jedenfalls bei dem, was ich machen will) :mrgreen:

_frank_ 12. Mär 2009 20:47

Re: Panel verschieben
 
Zitat:

Zitat von Kullerkeks
aber wieso ist "onmousemove" nicht geeignet? es funktioniert doch und das zählt doch (jedenfalls bei dem, was ich machen will) :mrgreen:

weil onMouseMove immer aufgerufen wird, wenn die maus innerhalb des Controls bewegt wird. die eigenschaft mit dem perform muss aber nur 1x gesetzt werden (intuitiv im Mousedown) und nix zig 1000 mal :)

haue den Code einfach mal ins Mousedown und du wirst sehen das reicht.

Delphi-Quellcode:
procedure TForm1.PanelMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
//  if ssLeft in Shift then
//  begin
  ReleaseCapture;
  (Sender as TPanel).Perform(WM_SYSCOMMAND,$F012,0); //jetzt kannst du die event-methode auch für alle panels nehmen
//  end;
end;
Gruß Frank

Kullerkeks 14. Mär 2009 09:55

Re: Panel verschieben
 
verstehe ich nicht so ganz aber ich lass es einfach mit OnMouseMove - ist der quelltext zwar ziemlich lang aber es funktioniert soweit...
schönes wochenende!

_frank_ 14. Mär 2009 15:54

Re: Panel verschieben
 
Zitat:

Zitat von Kullerkeks
verstehe ich nicht so ganz aber ich lass es einfach mit OnMouseMove - ist der quelltext zwar ziemlich lang aber es funktioniert soweit...
schönes wochenende!

was genau ist unklar? mousemove wird viel zu oft aufgerufen für diesen Zweck. probiers halt einfach mal im Mousdown aus...
die geänderte Zeile ist einfach nur dafür da, dass du für alle Panels die gleiche Methode verwenden kannst. weise die einfach deinen ganzen panels zu...

allerdings musste ich feststellen, dass es mit der perform-variante scheinbar nicht möglich ist, das ende der drag-Operation mitzubekommen (onMouseup wird nicht gecallt), und somit dann auf die position zu prüfen.
daher wird man das wohl doch manuell machen müssen (wie im von mir verlinkten thread).

Gruß Frank

Kullerkeks 30. Mär 2009 10:24

Re: Panel verschieben
 
facharbeit war nicht optimal aber hab insgesamt immerhin 11 punkte (entspricht zensur 2) gekriegt :wink:
danke an alle, die geantwortet haben


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz