AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Button Image bei Drag & Drop

Ein Thema von Natcree · begonnen am 3. Dez 2013 · letzter Beitrag vom 4. Dez 2013
Antwort Antwort
Natcree

Registriert seit: 5. Mär 2013
502 Beiträge
 
Delphi 7 Enterprise
 
#1

Button Image bei Drag & Drop

  Alt 3. Dez 2013, 12:32
Hallo Ich will einen TButton mit Drag & Drop auf der Form verschieben.

Was auch kein Problem ist.

Nun soll aber beim Drag over Der Button sichtbar bleiben ? Habe mir schon vieles angesehen.

Kann mir jemand weiter helfen Hier mal mein Code

Delphi-Quellcode:
procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := Source is TButton;
  end;

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
    if Source is TButton then
    begin
      TButton(Source).Left := X;
      TButton(Source).Top := Y;
    end;
end;
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#2

AW: Button Image bei Drag & Drop

  Alt 3. Dez 2013, 22:52
Hallo,

Zitat:
[...] Nun soll aber beim Drag over Der Button sichtbar bleiben [...]
Wenn Du es unbedingt mit Drag & Drop machen möchtest, dann hast Du ein kleines Problem: Solange der Mauszeiger auf Deinem Control ist gibt es kein "Drag". Erst wenn der Mauszeiger außerhalb des Controls ist kann Du mit DragOver darauf reagieren und dann musst Du den Button dem Mauszeiger "hinterherziehen".
Funktionieren würde es z. B. so:
Delphi-Quellcode:
TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
  private
    { Private-Deklarationen }
    FDragButton : TButton;
  public
    { Public-Deklarationen }
  end;

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if (Sender is TButton) and (Button = mbLeft) then
    begin
      FDragButton := TButton (Sender);
      FDragButton.BeginDrag (False, 4)
    end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1.DragMode := dmManual; // oder im OI zuweisen
  FDragButton := nil
end;

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  FDragButton := nil
end;

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
var
  r : TRect;
begin
  Accept := Source = FDragButton;
  if Accept then
    begin
      r := FDragButton.BoundsRect;
      if X < r.Left - 1 then
        FDragButton.Left := X + 1
      else
        if r.Right < X then
          FDragButton.Left := X - r.Right + r.Left;

      if Y < r.Top - 1 then
        FDragButton.Top := Y + 1
      else
        if r.Bottom < Y then
          FDragButton.Top := Y - r.Bottom + r.Top
    end
end;
Eine andere Variante: Anstatt Drag & Drop verschiebe den Button über OnMouseMove. Das funktioniert dann z. B. so:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure Button1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FCursorPos : TPoint;
    FDragButton : TButton;
  public
    { Public-Deklarationen }
  end;

implementation

{$R *.dfm}

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if (Sender is TButton) and (Button = mbLeft) then
    begin
      FCursorPos := Point (X, Y);
      FDragButton := TButton (Sender)
    end
end;

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if Assigned (FDragButton) then
    begin
      if Screen.Cursor <> crDrag then
        Screen.Cursor := crDrag;

      FDragButton.Left := FDragButton.Left + X - FCursorPos.X;
      FDragButton.Top := FDragButton.Top + Y - FCursorPos.Y
    end
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  FDragButton := nil;
  Screen.Cursor := crDefault
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FDragButton := nil
end;
[EDIT]
BTW: Eine weitere Variante findest Du hier (wurde von Furtbichler bei einem ähnlichen Thema gepostet).
[/EDIT]

Gruß
Volker Zeller

Geändert von Volker Z. ( 3. Dez 2013 um 22:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#3

AW: Button Image bei Drag & Drop

  Alt 3. Dez 2013, 23:01
Ich weiß leider nicht mehr genau wie, aber es giebt auch eine Möglichkeit das "Verschieben", wie im FormDesigner, im eigenen Programm zu verwenden.
Man muß da nur irgendwas im OnMouseDown machen.

Eventuell mal hier oder auf www.torry.net nach "Komponente verschieben", oder Dergleichen, suchen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Natcree

Registriert seit: 5. Mär 2013
502 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Button Image bei Drag & Drop

  Alt 3. Dez 2013, 23:48
Ich Danke euch Habe es so gemacht
Delphi-Quellcode:
var
flastpos: TPoint;
Delphi-Quellcode:
procedure TForm1.ButtonMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
r:TRect;
begin
  if [ssLeft,ssRight]*Shift=[ssLeft,ssRight] then exit;
  with TControl(Sender) do
  begin
    flastpos:=ClientToScreen(Point(x,y));//um sicherzustellen, daß der Button auf dem Panel bleibt
    r:=Parent.ClientRect;
    r.TopLeft:=Parent.ClientToScreen(r.TopLeft);
    r.BottomRight:=Parent.ClientToScreen(r.BottomRight);
    inc(r.Left,x);
    dec(r.Right,Width-x);
    inc(r.Top,y);
    dec(r.Bottom,Height-y);
    ClipCursor(@r);
  end;
end;

procedure TForm1.ButtonMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
var
mpos:TPoint;
begin
  if [ssLeft,ssRight]*Shift=[] then exit;
  with TControl(Sender) do
  begin
    mpos:=ClientToScreen(Point(x,y));
    x:=mpos.x-flastpos.x;
    y:=mpos.y-flastpos.y;
    SetBounds(Left+x,Top+y,Width,Height);
    flastpos:=mpos;
  end;
end;

procedure TForm1.ButtonMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
  if [ssLeft,ssRight]*Shift<>[] then exit;
  ClipCursor(nil);
end;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Button Image bei Drag & Drop

  Alt 4. Dez 2013, 01:12
Eine globale Variable ...

Für alle die diesen Thread lesen gilt wie immer bei globalen Variablen "Don't do that at home!"
(auf deutsch "Bitte nicht nachmachen!")

Falls die Frage aufkommt, wie es richtig geht, einfach nachfragen, wir - speziell auch ich - geben gerne Antwort.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Alt 4. Dez 2013, 01:33     Erstellt von Smut
Dieser Beitrag wurde von TBx gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Button Image bei Drag & Drop

  Alt 4. Dez 2013, 02:07
Merci und danke für den Jungspund

Bei einer globalen Variablen hat sich der Ersteller zu 80% keine Gedanken zum Kontext gemacht (wozu gehört diese Variable - ach, zur Instanz) und zu 20% Faulheit, weil er keine Singleton-Klasse, bzw. Default-Klasse oder simple Funktion erstellen/erzeugen möchte.

Und aus dem Kindergarten kenne ich noch die Sprüche wie "Aber der Klaus hat auch..."

Nur weil Borland das u.a. mit dem RAD-Ansatz vormacht, muss man nicht wie die Lemminge hinterher.

Auch wenn da was in Büchern steht ... Papier ist und war schon immer geduldig.

Es zählt einfach nur ein robustes Programmdesign, das bekommt man nicht geschenkt und eine globale Variable ist nicht robust.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#7

AW: Button Image bei Drag & Drop

  Alt 4. Dez 2013, 02:13
Hallo,

Zitat:
Die 'kleine' Problematik, das eine globale eine lokale überdecken kann ist mir schon bewußt...
Offenbar nicht! Wenn, dann verschattet eine lokale Variable eine globale Variable und nicht umgekehrt.
Delphi-Quellcode:
implementation

var
  aVar : Integer;

procedure DoSomething;
var
  aVar : string;
begin
  aVar := 'Hallo Welt';
  WriteLn (aVar); // Output 'Hallo Welt' nicht 42
  [...]
end;

begin
  aVar := 42;
  DoSomething
end.
Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Alt 4. Dez 2013, 02:14     Erstellt von Smut
Dieser Beitrag wurde von TBx gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Alt 4. Dez 2013, 02:15     Erstellt von Smut
Dieser Beitrag wurde von TBx gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Button Image bei Drag & Drop

  Alt 4. Dez 2013, 02:46
Hi und danke für die Antwort...

Hier nur mal mein musikalischer Geburtstagsgruß:
http://www.youtube.com/watch?v=_2BqiipGKNA
Ich steh ja soooo auf Musik... wird Dir wohl nicht gefallen... na egal.
Da muss ich dich leider enttäuschen ...

Tubular Bells I, II, III, Orchestral, Millennium sowie die BBC Aufnahme der Tubular Bells I (Video) sind seit Urzeiten ein fester Bestandteil meiner Audiothek (neben Hergest Ridge, Amarok, etc.)

Zu den globalen Variablen: Angenommen, ich nehme EINE Globale Variable,nenne die z.B. MasterLang und bin so in der Lage, Datenbankeingaben mehrsprachig zu gestalten, was ist daran verkehrt?
Nimm einfach eine Funktion und du kannst den Zugriff darauf besser kontrollieren (threadsafe)

Also statt
Delphi-Quellcode:
interface

var
  MasterLang : string;
einfach
Delphi-Quellcode:
interface

function MasterLang : string;

implementation

var
  _MasterLang : string;

function MasterLang : string;
begin
  if _MasterLang = 'then
    _MasterLang := GetMasterLang;
  Result := _MasterLang;
end;
Will ich das threadsafe haben, kein Problem, einfach eine TCriticalSection rein.

Will ich das aber auch noch speichern/laden, dann kommt das in eine Klasse (z.B. TApplicationLayer) und die Klasse speichert und lädt die Einstellungen.

Der Zugriff auf diese Klasse erfolgt analog über eine Funktion.

Wie schon gesagt, es ist eigentlich nur Faulheit - die sich meistens irgendwann rächt.
Ich bin lieber am Anfang rege und lege mich später entspannt zurück (z.B. ein kleines Notfallkassensystem mit automatischem Datenaustausch an eine WaWi läuft seit ca. 8 Jahren fehlerfrei in der Version 1.0.1 - ein Ausgabe-Fehler beim Nachbon - und häufiger im Einsatz als ursprünglich geplant - wir haben doch noch eine Kasse)

Schlimm ist erst mal nix, schlimm wird es aber auch schon von alleine und man muss es nicht schon vom Design an schlimm gestalten
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 4. Dez 2013 um 02:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#9

AW: Button Image bei Drag & Drop

  Alt 4. Dez 2013, 08:14
Ich vermute, himitsu hat das hier gemeint:
Delphi-Quellcode:
procedure TFormTest.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
const
  SC_DRAGMOVE = $F012;
begin
  if (ssLeft in Shift) and (Sender is TWinControl) then
    begin
      ReleaseCapture;
      TWinControl(Sender).Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
    end;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:26 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