Drag drop

Résolu
nraloux Messages postés 30 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 26 février 2010 - 30 janv. 2010 à 13:16
nraloux Messages postés 30 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 26 février 2010 - 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.

10 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
1 févr. 2010 à 00:03
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
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
30 janv. 2010 à 16:08
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
0
nraloux Messages postés 30 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 26 février 2010
31 janv. 2010 à 10:11
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
0
nraloux Messages postés 30 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 26 février 2010
31 janv. 2010 à 11:30
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
31 janv. 2010 à 12:24
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
0
nraloux Messages postés 30 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 26 février 2010
31 janv. 2010 à 12:32
Merci DelphiProg
je teste tout cela et je vous tiens au courant.
0
nraloux Messages postés 30 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 26 février 2010
31 janv. 2010 à 12:42
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
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
31 janv. 2010 à 18:39
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
0
nraloux Messages postés 30 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 26 février 2010
1 févr. 2010 à 19:42
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]);
0
nraloux Messages postés 30 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 26 février 2010
2 févr. 2010 à 15:36
Merci enormement pour la disponibilité et l'aide DelphiProg.
ça m'a beaucoup aidé.
0
Rejoignez-nous