Bonjour,
Je réaliser un Drag and Drop d'un TListbox vers un Panel.
Drop
Over
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 procedure TFDossierTiers.sListBoxObjetsDragDrop(Sender, Source: TObject; X, Y: Integer); begin if Source is TsListBox then begin TsListBox(Source).Left := X; TsListBox(Source).Top := Y; end; end;
Function Chevauvement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 procedure TFDossierTiers.sPanelDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); Var VeritableSource: TObject; begin if (source is TsListBox) then begin With (Source As TsListBox) do begin case AnsiIndexStr(Items.Strings[ItemIndex],['Biseau','Etiquette','Zone saisie','Liste de choix','Zone note','Case à cocher']) of 0:if not Chevauchement(TsBevel(Source),TsPanel(Sender)) then Accept := true; 1:if not Chevauchement(TsLabel(Source),TsPanel(Sender)) then Accept := true; 2:if not Chevauchement(TsDBEdit(Source),TsPanel(Sender)) then Accept := true; 3:if not Chevauchement(TsDBComboBox(Source),TsPanel(Sender)) then Accept := true; 4:if not Chevauchement(TsDBMemo(Source),TsPanel(Sender)) then Accept := true; 5:if not Chevauchement(TsDBCheckBox(Source),TsPanel(Sender)) then Accept := true; end; end; end; end;
La notion proprement parlé du chevauvement fonctionne, cependant lorsque je pose l'objet (END DRAG)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 function TFDossierTiers.Chevauchement(Sender, Target: TObject): Boolean; Var i : integer; R : TRect; begin result := False; With Target do Begin //Contrôle chevauchement for i := 0 to ControlCount -1 do begin //Ignore le control sélectionné (lui-même) if Controls[i] = TWinControl(Sender) then Continue; //Superposition ? Result := IntersectRect(R, Controls[i].BoundsRect, TWinControl(Sender).BoundsRect); end; End; end;
Ma fonction ne prend pas en compte la taile Height et Witdh de l'objet que je pose.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 procedure TFDossierTiers.sListBoxObjetsEndDrag(Sender, Target: TObject; X, Y: Integer); Var aParent: TObject; begin if (Target is TsPanel) then begin With (Sender as TsListBox) do begin case AnsiIndexStr(Items.Strings[ItemIndex],['Biseau','Etiquette','Zone saisie','Liste de choix','Zone note','Case à cocher']) of 0:{$REGION 'Création dynamique Bevel'} begin With TsBevel.Create(Self) do begin Parent := TsPanel(Target); Left := X; Top := Y; end; end; {$ENDREGION} 1:{$REGION 'Création dynamique Etiquette'} begin With TsLabel.Create(Self) do begin Parent := TsPanel(Target); Caption := 'Etiquette'; Left := X; Top := Y; end; end; {$ENDREGION} 2:{$REGION 'Création dynamique Zone saisie'} begin With TsDBEdit.Create(Self) do begin Parent := TsPanel(Target); Left := X; Top := Y; end; end; //...
Ma question comment prendre en compte la taille de mon objet en DragOver pour ne pas le poser sur un objet déjà créer ?
PS : j'ai déjà essayé dans ma function ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 function TFDossierTiers.Chevauchement(Sender, Target: TObject): Boolean; Var i : integer; R : TRect; begin result := False; if (Sender is TsBevel) then begin TWinControl(Sender).Height := 50; TWinControl(Sender).Width := 50; end else if (Sender is TsLabel) then begin TWinControl(Sender).Height := 16; TWinControl(Sender).Width := 50; end else if (Sender is TsDBEdit) then begin TWinControl(Sender).Height := 24; TWinControl(Sender).Width := 121; end else if (Sender is TsDBCombobox) then begin TWinControl(Sender).Height := 24; TWinControl(Sender).Width := 145; end else if (Sender is TsDBMemo) then begin TWinControl(Sender).Height := 89; TWinControl(Sender).Width := 185; end else if (Sender is TsDBCheckBox) then begin TWinControl(Sender).Height := 22; TWinControl(Sender).Width := 109; end;
Partager