Дайте пример драг и дроп, че то у меня не получается есть 2 имаджа пытаюсь на 1 др кинуть и чтоб 1 исчез, никак не получается, сравниваю по hint. Подкиньте пример, спс
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;
спс немного разобрался, а как реализовать такую вещь есть допустим корзина (image1 dmManual) и еще штук 5 image (dmAutomatic) цель перетащить 5 image в корзину (корзин будит 4) т.е. наверно надо сравнивать хинт корзины с хинтом image чтобы в свою корзину запихнуть, можно с этим мне помочь
у всех компонентов есть свойство 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" ее корзины, и все работает! Т.е. не надо для каждой бумажки писать свое событие.
а если так замутить у корзины (Source as Timage).visible:=false;; if (image2.Hint='Зима') and((Source as Timage).Hint='Зима') then showmessage('Та корзина') а бумажек ниче не делать кроме dmAutomatic
Code: if ([B](Target as TImage)[/B].hint)=((Source as Timage).Hint) then begin (Source as Timage).visible:=false;; showmessage('Та корзина') end; и опять же всем корзинам назначаешь одно событие Если у корзины и у бумажки будут одинаковые хинты все произойдет
вы где ваш код прописываете? у меня 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; по идеи должно работать со всеми корзинами
xophet +5 за понимание событий и для чего нужен Sender, но небольшая поправка: если Sender is TImage вернул True то дальше можно приводить явно: TImage(Sender) т.к. такое приведение работает быстрее
еще вопросик как мне эффективнее сделать 20 image, загрузить в них картинки и поставить правильные хинты (5 картинок зима 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, а допустим по кнопке, то нужно сделать проверку)
ок, спс идею вашу понял, осталось придумать как их обзывать. доп есть папка Image там 20 картинок (1-5 зима,5-10 осень и тд) надо както придумать чтобы именно с 1-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:='Зима'; и т.д. В общем: не ленись, включай мозг!