[Delphi 6] Drag en (Re)Drop op zelfde venster

Pagina: 1
Acties:
  • 177 views sinds 30-01-2008
  • Reageer

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 16-07-2025
Hallo,

Ik heb gezocht met google naar "delphi drop always" en ik kwam hier een heel aantal dingen over tegen waardoor ik het voor elkaar heb gekregen om een TEdit te kunnen slepen. Het enige probleem wat ik nu nog heb, is het volgende. Als het edit-veld op het formulier staat, en ik sleep deze naar een andere plaats op hetzelfde formulier, dan wordt deze een apart form. Als je daarna nog een keer sleept wordt die weer terug geplaatst op het formulier. Wat ik nu wil is dat het edit-veld altijd direct op het formulier wordt geplaatst. Weet iemand wat ik hieraan moet doen?

Ik verwacht niet dat het al te moeilijk is, maar ik ben (redelijk) nieuw met delphi, en heb net een uur lopen zoeken met google en kan het niet vinden. Iedereen alvast bedankt voor de hulp.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

  1. Start nieuwe Applicatie
  2. Gooi een TEdit op het Form
  3. Zet de DragMode property van de TEdit op dmAutomatic
  4. Dubbelklik op het OnDragOver event van het Form en vul de volgende code in:
    Delphi:
    1
    2
    3
    4
    5
    
    procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      Accept := True;
    end;
  5. Dubbelklik op het OnDragDrop event van het Form en vul de volgende code in
    Delphi:
    1
    2
    3
    4
    5
    
    procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
    begin
      (Source as TControl).Left := X;
      (Source as TControl).Top := Y;
    end;
  6. Draaien maar

We adore chaos because we like to restore order - M.C. Escher


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 16-07-2025
Oke, Dat had ik ook al eens gevonden. Probleem is dat dat dus niet werkt. Om welke reden dan ook komt ie niet eens in die Code (breakpoint breakt niet :S).

Als er maar 1 venster is in het programma, werkt het wel. Met meerdere dus niet (wil een toolwindow/bar). Ook al stel ik alleen 1 venster in op accepten, als er meerdere zijn staat het veldje er de ene keer op en de andere keer voor (als een eigen form) het form. Als je dat veldje dan nog een keer versleept staat ie wel weer op het form.

[ Voor 49% gewijzigd door dexter07051982 op 26-04-2005 16:19 ]


Verwijderd

Bij drag/drop tussen verschillende forms zul je in het FormDragDrop event ook nog
Delphi:
1
(Source as TControl).Parent := Self;

moeten toevoegen.
edit:
Belangrijke toevoeging... :)

[ Voor 13% gewijzigd door Verwijderd op 26-04-2005 16:55 ]


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 16-07-2025
oke, wordt me nog niet duidelijker.

De regel die afterlife suggereerde helpt ook niet.
Maar dat had ik eerlijk gezegt ook niet echt verwacht. afterlife heeft het namelijk over drag en drop tussen verschillende schermen. Dat is bij mij niet het geval. Er zijn wel meerdere schermen, maar de drag en drop gebeurt op 1 en hetzelfde scherm. Het tweede scherm is alleen een toolwindow. Hierop hoeft niks gesleept te worden.

Maar nu nog ff waarom het me niet duidelijker wordt. Met de toolwindow kan ik namelijk op het hoofdscherm een edit-veld toevoegen. Als ik maar 1 edit veld toevoeg, blijft het probleem zich voordoen. Als ik een tweede edit-veld toevoeg, en deze eerst versleep (het probleem doet zich niet voor met het als tweede toegevoegde edit-veld) gaat het verslepen van het eerst toegevoegde edit veld daarna ook goed. Als ik niet eerst het tweede edit veld versleep, dan doet het eerste edit-veld het nog steeds fout. Wel blijft dan het als tweede toegevoegde veld goed werken. :S

Heb nu wel de code van Lord Lary nodig.

[ Voor 21% gewijzigd door dexter07051982 op 28-04-2005 14:05 ]


Verwijderd

Snap ik je nu goed dat je vanaf dat toolwindow meerdere instances van 1 TEdit naar een ander form wilt slepen? Dan zul je die instances zelf aan moeten maken. In z'n simpelste vorm:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm2.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if ((Source as TControl).Owner is TForm1) {jouw toolwindow} then begin
    with TEdit.Create(Self) do begin
      Parent := Self;
      Left := X;
      Top := Y;
      Width := (Source as TControl).Width;
      Height := (Source as TControl).Height;
      DragMode := dmAutomatic;
    end;
  end else begin
    with Source as TControl do begin
      Parent := Self;
      Left := X;
      Top := Y;
    end;
  end;
end;

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

dexter07051982 schreef op dinsdag 26 april 2005 @ 16:03:
Oke, Dat had ik ook al eens gevonden. Probleem is dat dat dus niet werkt. Om welke reden dan ook komt ie niet eens in die Code (breakpoint breakt niet :S).
Het werkt wel degelijk 100% Kennelijk heb je wat anders gedaan. Wat je precies wil berijken is me volstrekt onduidelijk, maar dat lukt je vast als je mijn voorbeeld maar begrijpt. Al het andere borduurt er alleen maar op voort.

We adore chaos because we like to restore order - M.C. Escher


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 16-07-2025
Oke, was wel een beetje een stom foutje. Ik gebruikte
code:
1
Edit.DragKind:=dkDock;
ipv
code:
1
Edit.DragKind:=dkDrag;

Het enige nadeel is nu echter dat ik niet de omlijning zie van het edit-veld.
Ik hoop dat dit ook nog kan. Zal er eens naar zoeken. Als ik het vind zal ik dat er nog bij posten.
Of iemand moet zo aardig zijn om dit al voor mij te doen :P >:)

Verwijderd

Ik zal je matsen... :)
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
var
  // placeholders voor de plek waar het vorige kader is getekend
  // -1 / -1 betekent dat er geen vorig kader verwijderd hoeft te worden
  OldX: integer = -1;
  OldY: integer = -1;

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
var
  SavePen: TPen;
  w, h: integer;
begin
  if (Source is TControl) then begin
    w := TControl(Source).Width - 1;
    h := TControl(Source).Height - 1;
    SavePen := Canvas.Pen;
    Canvas.Pen.Mode := pmNot;
    if (OldX > -1) and (OldY > -1) then begin
      // vorige kader weghalen
      Canvas.Polyline([Point(OldX, OldY), Point(OldX + w, OldY),
                       Point(OldX + w, OldY + h), Point(OldX, OldY + h),
                       Point(OldX, OldY)]);
    end;
    // nieuw kader tekenen
    Canvas.Polyline([Point(X, Y), Point(X + w, Y),
                     Point(X + w, Y + h), Point(X, Y + h),
                     Point(X, Y)]);
    OldX := X;
    OldY := Y;
    Canvas.Pen := SavePen;
  end;
  Accept := Source.InheritsFrom(TControl);
end;

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  (Source as TControl).Left := X;
  (Source as TControl).Top := Y;
  // placeholders resetten
  OldX := -1;
  OldY := -1;
end;

edit:
Heel klein beetje comments toegevoegd.

[ Voor 12% gewijzigd door Verwijderd op 28-04-2005 21:05 ]


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 16-07-2025
Hartelijk dank. Was aan het opzoeken nog niet toe gekomen. Werkt heel mooi :D
Pagina: 1