![]() |
Re: Panel verschieben
Zitat:
Zitat:
@larsi: bitte delphi-tags verwenden Gruß Frank |
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) |
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: ![]() Gruß Frank |
Re: Panel verschieben
Zitat:
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:
aber da kommt immer das hier: [Fehler](470): Operator ist auf diesen Operandentyp nicht anwendbar
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; |
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:
geht natürlich nicht...was hilft sind klammern und das zweite if weg
8 and if
Delphi-Quellcode:
dürfte aber in jedem Tutorial stehen...
if (Panel6.left<>8) and (Panel6.top<>504) then
HTH Frank |
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: |
Re: Panel verschieben
Zitat:
haue den Code einfach mal ins Mousedown und du wirst sehen das reicht.
Delphi-Quellcode:
Gruß Frank
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; |
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! |
Re: Panel verschieben
Zitat:
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 |
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. |
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