Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];

Вниз

Плейлист в Delphi?   Найти похожие ветки 

 
Shakal   (2005-08-30 14:07) [0]

Я уже читал про drag&drop в TListBox, но не хватает у меня мозгов коды дополнить на перемещение нескольких итемов. Замучился уже, больше 2-х месяцев сижу. Может, в инете плохо ищу? Не знаю, но не нашёл. Прошу помощи мастеров!


 
-=S.S=- ©   (2005-08-30 14:24) [1]

откуда куда перетаскивать надо ?


 
Antonn ©   (2005-08-30 15:35) [2]

-=S.S=- ©   (30.08.05 14:24) [1]
перемещать надо. одновременно несколько (выделенных через ctrl, например).


 
Antonn ©   (2005-08-30 15:36) [3]

Shakal   (30.08.05 14:07)
что хранится в итемах(объект? или просто строка?)


 
Shakal   (2005-08-30 15:59) [4]

Хранятся названия медиафайлов. Это те, которые отображаются визуально. А не отображаются полные адреса к этим файлам.


 
Юрий Зотов ©   (2005-08-30 16:28) [5]

http://www.yandex.ru/yandsearch?rpt=rad&text=Delphi+Drag+Drop+%F4%E0%E9%EB

И пример в папке ($Delphi)\Demos\RichEdit


 
злобная танька   (2005-08-30 19:15) [6]

по-моему г-н Shakal имеет ввиду таскание файлов мышью по списку "аля winamp".. была тут тема такая не так давно.


 
злобная танька   (2005-08-30 19:29) [7]

Shakal, наподобие как здеся ( http://delphimaster.net/view/1-1124262559/ ) в [11]?


 
Shakal   (2005-08-31 01:18) [8]

злобная танька
Да, именно. Но, похоже, у г-на Найти, тоже проблема с перемещением нескольких строк, судя по его последнему писанию. Наверное, мы пока в тупике. Просвятите меня! Какой секрет перемещения? Пожалуйста!


 
Antonn ©   (2005-08-31 09:10) [9]

Shakal   (31.08.05 1:18) [8]
нет никакого секрета, вполне возможно, что проще написать свой компонент(мне пришлось - получилось менее геморройно).
Не знаю, кто мне писмо писать, но еще раз скажу:
* если строка перемещается вверх, то нужно в цикле пробежать сверху вниз  и все выделенные переместить вверх.
* если строка перемещается вниз, то нужно в цикле пробежаться снизу вверх и переместить вниз все выделенные.
Осталось определить, какие из них выделенные. При MultiSelect можно выделить несколько итемов, но при перетаскивании(код в OnMouseMove) все выделение слетает, в итоге не известно, что мы перетаскиваем, получается чехарда. Даже без кода, попробуйте при Мультиселекте проделать MouseMove, итемы будут выделяться(или наоборот), что совсем не нужно. Я, когда писал плейлист, использовал такую структуру:

pPlayListItem = ^TPlayListItem;
TPlayListItem = Record
 Filename : String;
 Path : String;
 Dura : String;
 Dura_m:integer;  
 Select : boolean;
 Track : boolean;
 UnderAdd: boolean;
 Item: pointer;
End;


Т.е. Select и указывал, что этот итем выделен. Можно подобное прицепить и к ListBox"у (только нужно следить что память не текла, вовремя убивать объекты при удалении), останется решить, как Select:=true делать. Можно при OnMouseDown, а на OnMouseUp снимать. Но все равно это фигня... Нужно еще отслеживать зажатие Ctrl,Shift.

Думаю ListBox не подходит. А что насчет других компонентов? на http://www.torry.net/ смотрел?

Вот то, что осталось от моей первой и последней попытки сделать из ListBox"а плейлист:
unit LBPL;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,StdCtrls,menus, Dialogs;

type
 pPlayListItem = ^TPlayListItem;
 TPlayListItem = Record
   Filename : String;
   Path : String;
   Dura : String;
   Dura_m:integer;
   Select : boolean;
   Track : boolean;
 End;

 TLBPlayLlist = class(TListBox)
 private
      IsMouseDown:boolean;
      LastMovePos:integer;
      procedure SetItemSelect(_Num:integer);
      procedure SetItemsUnSelect;
      procedure MoveSelected(_b:boolean);
 protected
   procedure MouseMove(Shift: TShiftState;x,y:integer);override;
   procedure MouseDown(Button: TMouseButton;Shift: TShiftState;x,y:integer);override;
   procedure MouseUp(Button: TMouseButton;Shift: TShiftState;x,y:integer);override;
 public
      procedure AddItemsss(_name,Path:string);
 published
 end;

implementation

procedure TLBPlayLlist.SetItemSelect(_Num:integer);
begin
if items.Objects[_Num]<>nil then
pPlayListitem(items.Objects[_Num]).Select:=true;
end;

procedure TLBPlayLlist.AddItemsss(_name,Path:string);
var PlayListItem : pPlayListItem;
begin
New(PlayListItem);
PlayListItem^.Filename:=_name;
PlayListItem^.Path:=Path;
PlayListItem^.Dura_m:=0;
PlayListItem^.Dura:="";
PlayListItem^.Track:=false;
PlayListItem^.Select:=false;
PlayListItem^.UnderAdd:=false;
PlayListItem^.Finded:=false;
items.AddObject(PlayListItem^.Filename, TObject(PlayListItem));
end;

procedure TLBPlayLlist.SetItemsUnSelect;
var i:integer;
begin
for i:=0 to items.Count-1 do
pPlayListitem(items.Objects[i]).Select:=false;
end;

procedure TLBPlayLlist.MoveSelected(_b:boolean);
var i: integer;
begin
 if items.Count = 0 then exit;
 if _b then begin
   if not pPlayListItem(items.Objects[0])^.Select then
     for i := 0 to items.Count - 1 do
       if pPlayListItem(items.Objects[i])^.Select then items.Exchange(i - 1, i);
 end
 else begin
   if not pPlayListItem(items.Objects[items.Count - 1])^.Select then
     for i := items.Count - 1 downto 0 do
       if pPlayListItem(items.Objects[i])^.Select then items.Exchange(i + 1, i);
 end;
end;

procedure TLBPlayLlist.MouseDown( Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbLeft) then  IsMouseDown:=true;
  SetItemSelect(itemindex);
  inherited MouseDown(button,shift,x,y);
end;

procedure TLBPlayLlist.MouseMove(Shift: TShiftState; X,Y: Integer);
var row:integer;
begin
 if IsMouseDown then begin
   Row := itemindex;
   if items.Count = 0 then exit;
   if LastMovePos<>row then
   for i := 1 to Abs(Row - LastMovePos) do
     if (Row - LastMovePos) < 0 then MoveSelected(true) else MoveSelected(false);
     end;
  LastMovePos := Row;
end;
   inherited MouseMove(Shift,x,y);
end;

procedure TLBPlayLlist.MouseUp( Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if (IsMouseDown) then SetItemsUnSelect;
  IsMouseDown:=false;
 inherited MouseUp(Button,Shift, X, Y);
end;

end.


 
Erik1 ©   (2005-08-31 11:08) [10]

Возми готовый DbGridEh и немучайся, подключиш идуций с ним TMemoryDataSet и дело в шляпе.


 
Shakal   (2005-09-05 13:40) [11]

Огромное спасибо за ответы, советы. Я всё же ещё буду пытаться совершенствовать, авось, получится.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.041 c
8-1115890225
Grim
2005-05-12 13:30
2005.09.25
OpenGL - получение указателя на текстуру


14-1125498070
hamster
2005-08-31 18:21
2005.09.25
Thumbs.db


4-1122556137
Ugrael
2005-07-28 17:08
2005.09.25
как обрабатывать wm_paint


14-1125743451
lookin
2005-09-03 14:30
2005.09.25
Печень просит подаянья....


1-1125302111
highlander
2005-08-29 11:55
2005.09.25
Дерево классов в Делфи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский