Дайте пример драг и дроп

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by aydar, 25 May 2011.

  1. aydar

    aydar Member

    Joined:
    12 Nov 2009
    Messages:
    259
    Likes Received:
    6
    Reputations:
    -2
    Дайте пример драг и дроп, че то у меня не получается есть 2 имаджа пытаюсь на 1 др кинуть и чтоб 1 исчез, никак не получается, сравниваю по hint. Подкиньте пример, спс
     
  2. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    что значит "исчез"? ты его image1.free делаешь?
     
  3. aydar

    aydar Member

    Joined:
    12 Nov 2009
    Messages:
    259
    Likes Received:
    6
    Reputations:
    -2
    visible=false;
     
  4. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Code:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Button2.DragMode:=dmautomatic;
    end;
    
    procedure TForm1.Button2DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      accept:=True;
    end;
    
    procedure TForm1.Button2EndDrag(Sender, Target: TObject; X, Y: Integer);
    begin
      (Sender as TButton).visible:=false;
    //в твоем случае будет или 
    //if (target is TImage) then  (target as TImage).visible:=false; 
    //или Image1.visible:=false; (1-е предпочтительнее)
    end;
     
    #4 xophet, 25 May 2011
    Last edited: 25 May 2011
  5. aydar

    aydar Member

    Joined:
    12 Nov 2009
    Messages:
    259
    Likes Received:
    6
    Reputations:
    -2
    [DCC Error] Unit3.pas(34): E2003 Undeclared identifier: 'target'
     
  6. aydar

    aydar Member

    Joined:
    12 Nov 2009
    Messages:
    259
    Likes Received:
    6
    Reputations:
    -2
    спс немного разобрался, а как реализовать такую вещь есть допустим корзина (image1 dmManual) и еще штук 5 image (dmAutomatic) цель перетащить 5 image в корзину (корзин будит 4) т.е. наверно надо сравнивать хинт корзины с хинтом image чтобы в свою корзину запихнуть, можно с этим мне помочь
     
  7. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    у всех компонентов есть свойство tag типа integer, которое можно использовать по своему усмотрению, так что не обязательно hint

    Code:
    procedure TForm1.Image1EndDrag(Sender, Target: TObject; X, Y: Integer);
    begin
      if (target is TImage)and(sender is TImage) then
      begin
      if (Sender as Timage).tag=(target as Timage).tag then
          (Sender as TImage).visible:=false
      else
      showmessage('не та корзина');
      end;  
    end;
    и тут проявляется достоинство использования (target is TImage)и(sender is TImage), а не image1 и image2
    ты всем своим "бумажкам" присваевашь это событие на enddrag, и свойство tag каждой "бумажки" равным свойству "tag" ее корзины, и все работает! Т.е. не надо для каждой бумажки писать свое событие.
     
    #7 xophet, 25 May 2011
    Last edited: 25 May 2011
    1 person likes this.
  8. aydar

    aydar Member

    Joined:
    12 Nov 2009
    Messages:
    259
    Likes Received:
    6
    Reputations:
    -2
    а если так замутить у корзины

    (Source as Timage).visible:=false;;
    if (image2.Hint='Зима') and((Source as Timage).Hint='Зима') then
    showmessage('Та корзина')

    а бумажек ниче не делать кроме dmAutomatic
     
    1 person likes this.
  9. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Code:
    if ([B](Target as TImage)[/B].hint)=((Source as Timage).Hint) then
    begin
    (Source as Timage).visible:=false;;
    showmessage('Та корзина')
    end;
    и опять же всем корзинам назначаешь одно событие
    Если у корзины и у бумажки будут одинаковые хинты все произойдет
     
  10. aydar

    aydar Member

    Joined:
    12 Nov 2009
    Messages:
    259
    Likes Received:
    6
    Reputations:
    -2
    вы где ваш код прописываете?
    у меня target не воспренимает

    Сделал так

    Code:
    procedure TForm3.Image2DragDrop(Sender, Source: TObject; X, Y: Integer);
    begin
    if ((Sender as TImage).hint)=((Source as Timage).Hint) then
    begin
    (Source as Timage).visible:=false;;
    showmessage('Та корзина')
    end;
    end;
    по идеи должно работать со всеми корзинами
     
    #10 aydar, 25 May 2011
    Last edited: 25 May 2011
  11. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    xophet +5 за понимание событий и для чего нужен Sender, но небольшая поправка:
    если Sender is TImage вернул True то дальше можно приводить явно: TImage(Sender) т.к. такое приведение работает быстрее
     
  12. aydar

    aydar Member

    Joined:
    12 Nov 2009
    Messages:
    259
    Likes Received:
    6
    Reputations:
    -2
    еще вопросик как мне эффективнее сделать 20 image, загрузить в них картинки и поставить правильные хинты (5 картинок зима 5-лето и тд).
     
  13. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    У меня Делфи 7-я, у тебя наверное другая, вот и разница в названиях

    спасибо, учту.

    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, jpeg;
    
    type
      TPrimeFRm = class(TForm)
        Trash: TImage;
        procedure ImageDragOver(Sender, Source: TObject; X, Y: Integer;
          State: TDragState; var Accept: Boolean);
        procedure TrashDragDrop(Sender, Source: TObject; X, Y: Integer);
        procedure TrashDragOver(Sender, Source: TObject; X, Y: Integer;
          State: TDragState; var Accept: Boolean);
        procedure FormCreate(Sender: TObject);
    //    procedure
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      PrimeFRm: TPrimeFRm;
    
    implementation
    
    {$R *.dfm}
    
    procedure TPrimeFRm.ImageDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      Accept:=true;
    end;
    
    procedure TPrimeFRm.TrashDragDrop(Sender, Source: TObject; X, Y: Integer);
    begin
      if (Source is TImage) then TImage(Source).Visible:=False;
    end;
    
    procedure TPrimeFRm.TrashDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      accept:=true;
    end;
    
    procedure TPrimeFRm.FormCreate(Sender: TObject);
    var i:Integer;
      Image1: TImage;
    begin
      for i:=1 to 20 do
      begin
        Image1 := TImage.Create(Application);
        with Image1 do
        begin
          Name := 'Image'+inttostr(i);
          Parent := Self;
          AutoSize:=True;
          Left := 264+i*10;
          Top := 200+i*10;
          //тут задаешь хинты, и все, что нужно
          Picture.LoadFromFile('c:\a.jpg');
          DragMode:=dmAutomatic;
          OnDragOver:=ImageDragOver;
        end;
      end;
    end;
    
    end.
    В CreateForm (или где ты будешь создавать картинки) я бы сделал массив с именами файлов и загружал Picture.LoadFromFile(massiv);

    Name := 'Image'+inttostr(i); тут будь осторожен, чтобы ненароком не попыталось создать картинку с уже существующим именем (если будешь создавать картину не по form.create, а допустим по кнопке, то нужно сделать проверку)
     
    #13 xophet, 25 May 2011
    Last edited: 25 May 2011
    2 people like this.
  14. aydar

    aydar Member

    Joined:
    12 Nov 2009
    Messages:
    259
    Likes Received:
    6
    Reputations:
    -2
    ок, спс идею вашу понял, осталось придумать как их обзывать.
    доп есть папка Image там 20 картинок (1-5 зима,5-10 осень и тд) надо както придумать чтобы именно с 1-5 когда загружается хинт был Зима и тд
     
  15. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Блин, ну ты вообще лентяй!!
    самое простое (первое, что пришло на ум):
    massiv:array[0..1,1..20]of string;
    в
    [0,1]
    [0,2] пишешь имя файла
    [0,3]
    а в
    [1,1]
    [1,2] hint
    [1,3]
    потом там в цикле их читаешь.
    если имя файла типа "Зима1", "Осень2"
    Можно при помощи extractfilename выделить имя файла и
    if pos('Зима', имя файла)=1 then hint:='Зима';
    и т.д.
    В общем: не ленись, включай мозг!
     
    1 person likes this.