Drag drop [Résolu]

nraloux 30 Messages postés jeudi 20 avril 2006Date d'inscription 26 février 2010 Dernière intervention - 30 janv. 2010 à 13:16 - Dernière réponse : nraloux 30 Messages postés jeudi 20 avril 2006Date d'inscription 26 février 2010 Dernière intervention
- 2 févr. 2010 à 15:36
salut,
je voudrais bien de l'aide sur comment effectuer un drag and drop
sur une stringrid venant d'une listBox.
le veritable problème n'est pas le drag and drop mais de faire a ce que une
cellule du stringrid puisse prendre deux items de la listbox.
quand j'essai le deuxième items remplace le premier
Merci.
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 1 févr. 2010 à 00:03
3
Merci
Désolé mais je n'ai pas eu le temps de finir pour ajuster la hauteur des lignes sur lesquelles on effectue un drag'n drop.
Voici quand même le code en l'état actuel après avoir mis la propriété DefaultDrawing à false pour le TStringGrid :

procedure TFenetre_Emploi_de_temps.Grid_emploiDrawCell(Sender: TObject;
  ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  aPos, i: integer;
  Grid: TStringGrid;
  s, temp: string;
begin
  Grid := (sender as TStringGrid);
  if (not Grid.DefaultDrawing) then
  begin
    Grid.Canvas.FillRect(Rect);
    Grid.RowHeights[ARow] := Grid.DefaultRowHeight;
    temp := Grid.cells[ACol, ARow];
    aPos := Pos(sLineBreak, temp);
    i := 0;
    if aPos > 0 then
    begin
      while aPos > 0 do
      begin
        s := Copy(temp, 1, aPos - 1);
        Grid.Canvas.TextOut(Rect.Left, Rect.Top + 2 - (Grid.Font.Height * i), s);
        Delete(temp, 1, aPos + Length(sLineBreak) - 1);
        aPos := Pos(sLineBreak, temp);
        inc(i);
      end;
    end;
    Grid.Canvas.TextOut(Rect.Left, Rect.Top + 2 - (Grid.Font.Height * i), temp);
  end;
end;


May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

Sauvons MySQL

Merci cs_Delphiprog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 102 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
Meilleure réponse
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 1 févr. 2010 à 22:06
3
Merci
"l'enregistrement dans le fichier ini ne prend en compte que le premier drop"

Je ne comprends pas trop bien...

Pour l'enregistrement du TStringGrid dans un fichier ini, voir :
ENREGISTRER ET RELIRE UN TSTRINGGRID AVEC UN FICHIER .INI

May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

Sauvons MySQL

Merci cs_Delphiprog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 102 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 30 janv. 2010 à 16:08
0
Merci
Hé, t'as pas un ch'ti bout de code à soumettre ?

May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

Sauvons MySQL
Commenter la réponse de cs_Delphiprog
nraloux 30 Messages postés jeudi 20 avril 2006Date d'inscription 26 février 2010 Dernière intervention - 31 janv. 2010 à 10:11
0
Merci
desolé voici ce que j'ai fais:
dans l'evenement dragover de ma stringgrid j'ai fait:

procedure TFenetre_Emploi_de_temps.Grid_emploiDragOver(Sender,
  Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
          if (source is TListBox) then
             Accept:=true
           else
            if (source is TsListBox) then
               Accept:=true;

end;


et dans l'evenement dragDrop de ma stringgrid il y'a ce code :

procedure TFenetre_Emploi_de_temps.Grid_emploiDragDrop(Sender,
  Source: TObject; X, Y: Integer);
var CellX,CellY:integer;
  begin
      Grid_emploi.MouseToCell(x,y,CellX,CellY);
        if(Source is TsListBox) then
         begin
           Grid_emploi.Cells[CellX,CellY]:=Select_prof;
         end
           else
            if(Source is TListBox) then
              begin
                Grid_emploi.Cells[CellX,CellY]:=Select_mat;
              end;
  end;


select_prof et select_mat recupère le nom selectionné:

procedure TFenetre_Emploi_de_temps.List_profClick(Sender: TObject);
var i:integer;
begin
      for i := 0 to (List_prof.Items.Count-1) do
        begin
           if List_prof.Selected[i]=True then 
              begin
                 Select_prof:=List_prof.Items.Strings[i];
              end;
        end;
end;


quand je fais le drag and drop, le deuxième items remplace le premier
Commenter la réponse de nraloux
nraloux 30 Messages postés jeudi 20 avril 2006Date d'inscription 26 février 2010 Dernière intervention - 31 janv. 2010 à 11:30
0
Merci
Salut
j'ai trouvé un solution dans l'evenement DRAGDROP
procedure TFenetre_Emploi_de_temps.Grid_emploiDragDrop(Sender,
  Source: TObject; X, Y: Integer);
var CellX,CellY:integer;
  begin
      Grid_emploi.MouseToCell(x,y,CellX,CellY);
        if(Source is TsListBox) then
         begin
           Grid_emploi.Cells[CellX,CellY]:= Grid_emploi.Cells[CellX,CellY] + sLineBreak +Select_prof;
         end
           else
            if(Source is TListBox) then
              begin
                Grid_emploi.Cells[CellX,CellY]:= Grid_emploi.Cells[CellX,CellY] + sLineBreak +Select_mat;
              end;
  end;
 


Mais ça m'affiche 2 carreaux et le nom selectionné.
Donc ma nouvelle question est comment afficher correctement c'est a dire le nom du prof en haut et le nom de la matiere tout en bas et non sur la même ligne.
Commenter la réponse de nraloux
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 31 janv. 2010 à 12:24
0
Merci
Bon, on s'est croisés et voici ce que j'avais fait et qui est assez similaire à ton code, sauf que j'ai ignoré la class TsListBox car je ne la connais ni ne la possède :

procedure TFenetre_Emploi_de_temps.Grid_emploiDragOver(Sender,
  Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
  Accept := (source is TlistBox) and (TListBox(Source).SelCount > 0);
end;

procedure TFenetre_Emploi_de_temps.Grid_emploiDragDrop(Sender,
  Source: TObject; X, Y: Integer);
var
  CellX, CellY, i: integer;
begin
  Grid_emploi.MouseToCell(x, y, CellX, CellY);
  if Source is TListBox then
    {pour chacun des élements du composant source}
    for i := 0 to TListBox(Source).Items.Count - 1 do
      {s'il est sélectionné...}
      if TListBox(Source).Selected[i] then
        {et si la cellule de destination est vide : on remplace le contenu}
        if Grid_emploi.Cells[CellX, CellY]= EmptyStr then
           Grid_emploi.Cells[CellX, CellY] := TListBox(Source).Items[i]
        else
          {sinon, on ajoute au contenu existant}
          Grid_emploi.Cells[CellX, CellY] := 
            Grid_emploi.Cells[CellX, CellY] + sLineBreak + TListBox(Source).Items[i];
end;


Je vais donc me remettre à la recherche d'une solution au problème d'affichage de lignes multiples dans une cellule.

May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

[url =http://www.helpmysql.org/fr/petition]Sauvons My
Commenter la réponse de cs_Delphiprog
nraloux 30 Messages postés jeudi 20 avril 2006Date d'inscription 26 février 2010 Dernière intervention - 31 janv. 2010 à 12:32
0
Merci
Merci DelphiProg
je teste tout cela et je vous tiens au courant.
Commenter la réponse de nraloux
nraloux 30 Messages postés jeudi 20 avril 2006Date d'inscription 26 février 2010 Dernière intervention - 31 janv. 2010 à 12:42
0
Merci
désolé ,
ça m'affiche toujours 2 carreaux lorsque j'ajoute un élément apparemment
delphi n'intèprète pas le sLineBreak il en est de même avec code du retour chariot #13#10
Commenter la réponse de nraloux
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 31 janv. 2010 à 18:39
0
Merci
Salut,

si si Delphi interprète bien le sLineBreak.
Ici c'est uniquement un problème d'affichage dans TStringGrid qui n'a pas été pensé pour un texte multilignes.
Solution : dessiner toi-même le texte dans l'événement OnDrawCell en utilisant la fonction windows DrawText.

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
   Stringgrid1.Canvas.FillRect(Rect); // effacement de la cellule
   Drawtext(Stringgrid1.Canvas.Handle, PChar(StringGrid1.Cells[ACol, ARow]), -1, Rect, DT_WORDBREAK);
end;


Tu peux modifier le Rect pour avoir,p.ex, une "marge" gauche et haute.

A +
Thierry
Commenter la réponse de ThWilliam
nraloux 30 Messages postés jeudi 20 avril 2006Date d'inscription 26 février 2010 Dernière intervention - 1 févr. 2010 à 19:42
0
Merci
Merci pour vos reponses.
ça fonctionne mais l'enregistrement dans le fichier ini ne prend en compte que le premier drop.

ini.WriteString('contenu','cont1,1',Grid_emploi.Cells[1,1]);
Commenter la réponse de nraloux
nraloux 30 Messages postés jeudi 20 avril 2006Date d'inscription 26 février 2010 Dernière intervention - 2 févr. 2010 à 15:36
0
Merci
Merci enormement pour la disponibilité et l'aide DelphiProg.
ça m'a beaucoup aidé.
Commenter la réponse de nraloux

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.