unit MainD; interface 
  uses Classes, ExtCtrls, MPlayer, SysUtils, mmSystem, StdCtrls, Forms, Dialogs; type
    myThread = class(TThread)
    private
      procedure SetMovieVolume;
      procedure SetPositionVolume;
    protected
      procedure Execute;override;
    public
      constructor Create();
end;type 
    myThread2 = class(TThread) 
    private 
      procedure SetMovieVolume1; 
    protected 
      procedure Execute;override; 
    public 
      constructor Create(MediaPlayer:tMediaPlayer;Panel:tPanel;Image:tImage); 
end; type
    myThread3 = class(TThread)
    private
      procedure SetDirFile;
    protected
      procedure Execute;override;
    public
      constructor Create(ListBox:tListbox;filePath:string);
end;function SetSumTimes(Volumes:integer):string; var 
  aImage:tImage; 
  aMediaPlayer:tMediaPlayer; 
  aPanel:tPanel; 
  aListbox:tListbox; 
  FSums:string;
  HPosition:integer; implementation uses Main, MainN; constructor myThread3.Create(ListBox:tListbox;filePath:string); 
begin 
  inherited Create(false); 
  aListbox:=ListBox;
  if opennames <>'' then Form1.quit.Click; 
  aListbox.Items.Clear;
  syschecked('delete from 0');
  chdir(filePath); 
end; procedure myThread3.execute;
begin 
  SetDirFile;
end; procedure myThread3.SetDirFile; 
var 
  sr:TSearchRec; 
  err:integer; 
  s:string; 
begin 
  err:=findfirst('*.*',$37,sr); 
  while (err=0) do 
  begin 
    if (sr.name[1] <>'.') then 
    begin 
      if (sr.attr and fadirectory)=0 then 
      begin 
        s:=extractfileext(sr.Name); 
        if (pos(lowercase(s+';'),ExtList)>0) and (s <>'') then 
        begin 
            s:=expandfilename(sr.name);
            alistbox.Items.Add(extractfileName(s));
            syschecked('insert into 0([name]) values("'+s+'")');
        end; 
      end; 
      if (sr.attr and fadirectory)=16 then 
      begin 
        chdir(sr.name); 
        SetDirFile; 
        chdir('..'); 
      end; 
    end; 
    err:=findnext(sr); 
  end; 
end; function SetSumTimes(Volumes:integer):string; 
begin 
  SetSumTimes:=format('%.1d',[Volumes div 3600000])+':'+format('%.2d',[(Volumes mod 3600000) div 60000])+':'+format('%.2d',[((Volumes mod 3600000) mod 60000) div 1000]); 
end; constructor myThread2.Create(MediaPlayer:tMediaPlayer;Panel:tPanel;Image:tImage); 
begin 
  inherited Create(false); 
  aMediaPlayer:=MediaPlayer; 
  aPanel:=Panel; 
  aImage:=Image;
end; procedure myThread2.execute; 
begin 
  synchronize(SetMovieVolume1); 
end; procedure myThread2.SetMovieVolume1;
begin
  aMediaPlayer.DeviceType:=dtAutoSelect;
  aMediaPlayer.Close;
  aMediaPlayer.FileName:=OpenNames;
  aMediaPlayer.Open;
  aMediaPlayer.Display:=aPanel;
  ListFilesa:=aMediaPlayer.DisplayRect.Right;
  ListFilesc:=aMediaPlayer.DisplayRect.Bottom;
  Form1.Titles.Caption:='播放中            '+inttostr(ListFilesa)+' x '+inttostr(ListFilesc);
  aMediaPlayer.TimeFormat:=tfMilliseconds;
  SetShowRect;
  if OpenListIndex>-1 then
  begin
    aMediaPlayer.Position:=OpenListIndex;
    OpenListIndex:=-1;
  end;
  amediaplayer.Notify:=false;
  aMediaPlayer.Play;
  Fsums:=SetSumTimes(aMediaPlayer.Length);
  Form1.Timers.Caption:='0:00:01 / '+fsums;
  if aMediaPlayer.Position=0 then
  begin
     aMediaPlayer.Position:=93;
     aMediaPlayer.Play;
  end;
  amediaplayer.Notify:=true;
end; constructor myThread.Create(); 
begin 
  inherited Create(false); 
end; procedure myThread.execute; 
begin 
  if MouseChecked then 
    while MouseChecked do 
    begin 
        synchronize(SetMovieVolume); 
        if terminated then exit; 
    end 
  else 
    while aImage.Left <=Form1.shpProcess.Left+Form1.shpProcess.Width-11 do
    begin
      synchronize(SetPositionVolume); 
      if terminated then exit; 
    end; 
end; procedure myThread.SetPositionVolume; 
begin 
  if aMediaPlayer.Position>aMediaPlayer.Length then 
    aImage.Left:=Form1.shpProcess.Width+Form1.shpProcess.Left-11 
  else 
    if aMediaPlayer.Length>0 then 
        aImage.Left:=(aMediaPlayer.Position*Form1.shpprocess.width) div aMediaPlayer.Length+Form1.shpProcess.Left-11; 
  Form1.Timers.Caption:=SetSumTimes(aMediaPlayer.Position)+' / '+fsums; 
end; procedure myThread.SetMovieVolume; 
var 
  Position:integer; 
begin 
    Position:=(aImage.Left-Form1.shpProcess.Left+11)*aMediaPlayer.Length div Form1.shpprocess.width; 
    if HPosition=Position then exit; 
    if aMediaPlayer.Mode=mpPlaying then 
    begin 
      aMediaPlayer.Position:=Position; 
      aMediaPlayer.Play 
    end 
    else 
    if Form1.ToolButton3.Enabled then 
      aMediaPlayer.Position:=Position; 
    HPosition:=Position; 
end; end.

解决方案 »

  1.   

    unit MainN;interface 
      uses Windows, StrUtils, SysUtils, Classes, Controls, Forms, Menus, MMSystem, DB, ADODB;procedure SetSysIniInfo1;
    function GetRst(lstrSql:string):TadoDataSet;
    procedure SysChecked(lstrSql:string);
    procedure SetOpenIniInfo;
    procedure SetFileIni;
    procedure SetDriverInfo(mMenu:TMenuItem;mMenu1:TMenuItem);
    function SetDrivers(lstr:string):string; 
    function SetWindowMenus(lstr:string):string; 
    procedure SetWindowMenu(mMenu:TMenuItem;mMenu1:TMenuItem;lstr:string); 
    procedure GetWindowVolume; 
    procedure SetWindowVolume;
    procedure SetShowRect;
    function FileNameIndex:integer;
    function FileNameList(lIndex:integer):string;
    function OpenLists(lIndex:integer):string;
    procedure SetMenuLists(s:string);
    procedure SetPopMenus(mMenu:tPopupMenu;mMenu1:TMenuItem;lIndex:integer);
    procedure SetSizeType(mMenu:TMenuItem;mMenu1:TMenuItem;lIndex:integer);
    procedure SetShowType(mMenu:TMenuItem;lSize:integer);
    procedure SetFormPost(mMenu:TMenuItem;mMenu1:TMenuItem;lIndex:integer);
    procedure SetPlayInfo(MediaPlayer2:tMediaPlayer);var
      cn:TADOConnection;implementationuses Main, MainD;procedure SetPlayInfo(MediaPlayer2:tMediaPlayer);
    begin
      if MediaPlayer2.Position=0 then
        if TMovieMode=1 then
          ToolButton8.Click
        else if TMovieMode=2 then
        begin
          Randomize;
          openfiles(FileNameList(Random(listbox1.Count)+1));
        end
        else if TMovieMode=3 then
          ToolButton1.Click
    end;procedure SetFormPost(mMenu:TMenuItem;mMenu1:TMenuItem;lIndex:integer);
    begin
       mMenu.Items[winpost].Checked:=false;
       mMenu.Items[lIndex].Checked:=true;
       mMenu1.Items[winpost].Checked:=false;
       mMenu1.Items[lIndex].Checked:=true;
       winpost:=lIndex;
       if lIndex=0 then
          setwindowpos(form1.Handle,hwnd_notopmost,form1.Left,form1.Top,form1.Width,form1.Height,0)
       else if lindex=1 then
          setwindowpos(form1.Handle,hwnd_topmost,form1.Left,form1.Top,form1.Width,form1.Height,0);
    end;procedure SetShowType(mMenu:TMenuItem;lSize:integer);
    begin
      mMenu.Checked:=true;
      SizeType:=lSize;
      WinSizeType:=true;
      if opennames <>'' then
          SetShowRect;
    end;function FileNameIndex:integer;
    var
       rs:TadoDataSet;
    begin
       rs:=getrst('select 1 from 0 where id<=(select id from 0 where name="'+opennames+'")');
       FileNameIndex:=rs.RecordCount;
    end;procedure SetSizeType(mMenu:TMenuItem;mMenu1:TMenuItem;lIndex:integer);
    begin
      mMenu.Items[ShowType].Checked:=false;
      mMenu.Items[lIndex].Checked:=true;
      mMenu1.Items[ShowType].Checked:=false;
      mMenu1.Items[lIndex].Checked:=true;
      ShowType:=lIndex;
      WinSizeType:=true;
      if opennames <>'' then
        SetShowRect;
    end;procedure SetPopMenus(mMenu:tPopupMenu;mMenu1:TMenuItem;lIndex:integer);
    begin
      mMenu.Items[TMovieMode].Checked:=false;
      mMenu.Items[lIndex].Checked:=true;
      mMenu1.items[TMovieMode].Checked:=false;
      mMenu1.Items[lIndex].Checked:=true;
      TMovieMode:=lIndex;
    end;function OpenLists(lIndex:integer):string;
    var
       rs:TadoDataSet;
    begin
       rs:=getrst('select * from (select top '+inttostr(lindex)+' name,id from 1 order by id desc) order by id');
       OpenLists:=rs.FieldValues['name'];
    end;function FileNameList(lIndex:integer):string;
    var
       rs:TadoDataSet;
    begin
       rs:=getrst('select * from (select top '+inttostr(lindex)+' name,id from 0 order by id) order by id desc');
       FileNameList:=rs.FieldValues['name'];
    end;procedure SysChecked(lstrSql:string);
    begin
       cn.Execute(lstrSql);
    end;function GetRst(lstrSql:string):TadoDataSet;
    var
       rs:TadoDataSet;
    begin
       rs:=TadoDataSet.Create(nil);
       rs.Connection:=cn;
       rs.CursorType:=ctDynamic;
       rs.LockType:=ltBatchOptimistic;
       rs.CommandText:=lstrSql;
       rs.open;
       GetRst:=rs;
    end;procedure SetShowRect;
    var 
      ltop:integer; 
      lleft:integer; 
      lwidth:integer; 
      lHeight:integer;
    begin
      if WindowFull=false then
      begin
      lwidth:=ListFilesa*SizeType div 100; 
      lHeight:=ListFilesc*SizeType div 100;
      with Form1 do 
      begin 
        if ShowType=0 then
          if WinSizeType then
            begin
              if Panel1.Width<lwidth then
                width:=width+lwidth-Panel1.Width;
              if Panel1.Height<lHeight+winStatusHeight then
                height:=height+lHeight+winStatusHeight-Panel1.Height;
                lleft:=(Panel1.Width-lwidth) div 2;
                ltop:=(Panel1.Height-lHeight-winStatusHeight) div 2;
                aMediaPlayer.DisplayRect:=rect(lleft,ltop,lwidth,lHeight);
            end
          else
          begin
             if Panel1.Width<lwidth then
                lwidth:=Panel1.Width;
             if Panel1.Height<lHeight+winStatusHeight then
                lHeight:=Panel1.Height-winStatusHeight;
             lleft:=(Panel1.Width-lwidth) div 2;
             ltop:=(Panel1.Height-lHeight-winStatusHeight) div 2;
             aMediaPlayer.DisplayRect:=rect(lleft,ltop,lwidth,lHeight);
          end
        else if ShowType=1 then
          aMediaPlayer.DisplayRect:=rect(0,0,panel1.Width,panel1.Height-winStatusHeight)
        else if showtype=2 then
        begin
          if Panel1.Width<lwidth then
            lwidth:=Panel1.Width;
          if Panel1.Height<(lwidth*3 div 4+winStatusHeight) then
            height:=height+(lwidth*3 div 4)+winStatusHeight-Panel1.Height;
          lleft:=(Panel1.Width-lwidth) div 2;
          ltop:=(Panel1.Height-(lwidth*3 div 4)-winStatusHeight) div 2;
          aMediaPlayer.DisplayRect:=rect(lleft,ltop,lwidth,(lwidth*3 div 4));
        end
        else if showtype=3 then
        begin
          if Panel1.Width<lwidth then
            lwidth:=Panel1.Width;
          if Panel1.Height<(lwidth*4 div 5+winStatusHeight) then
            height:=height+(lwidth*4 div 5)+winStatusHeight-Panel1.Height;
          lleft:=(Panel1.Width-lwidth) div 2;
          ltop:=(Panel1.Height-(lwidth*4 div 5)-winStatusHeight) div 2;
          aMediaPlayer.DisplayRect:=rect(lleft,ltop,lwidth,(lwidth*4 div 5));
        end
        else
        begin
          if Panel1.Width<lwidth then
            width:=width+lwidth-Panel1.Width;
          if Panel1.Height<(lwidth*9 div 16+winStatusHeight) then
            height:=height+(lwidth*9 div 16)+winStatusHeight-Panel1.Height;
          lleft:=(Panel1.Width-lwidth) div 2;
          ltop:=(Panel1.Height-(lwidth*9 div 16)-winStatusHeight) div 2;
          aMediaPlayer.DisplayRect:=rect(lleft,ltop,lwidth,(lwidth*9 div 16));
        end;
        panel3.Align:=alBottom;
      end;
      end
      else
         aMediaPlayer.DisplayRect:=rect(0,0,Form1.Width,Form1.Height-winStatusHeight);
    end; procedure SetWindowVolume; 
    var 
      v,t:longint; 
    begin
        with Form1 do
        begin
          t:=(imgvoice.left-shpvoice.left+6)*255 div shpvoice.Width;
        end;
        waveoutgetvolume(0,@v);
        if volumetype=0 then
           v:=0
        else
        if VolumeType=1 then
          v:=(t shl 8)or(t shl 24)
        else
        if VolumeType=2 then
          v:=v and $ffff0000 or (t shl 8)
        else
          v:=v and $0000ffff or (t shl 24);
        waveOutSetVolume(0,v);
    end; procedure SetSysIniInfo1;
    begin
       cn:=TADOConnection.Create(nil);
       cn.CursorLocation:=clUseClient;
       cn.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source='+extractfilePath(application.ExeName)+'List\DateBase.mdb';
       cn.Open;
    end;procedure GetWindowVolume; 
    var 
      v:longint; 
    begin 
      waveOutGetVolume(0,@v); 
      if VolumeType=1 then 
      begin 
        if hi(v)>hi(v shr 16) then 
          v:=hi(v) 
        else 
          v:=hi(v shr 16); 
      end 
      else if VolumeType=2 then 
        v:=hi(v) 
      else 
        v:=hi(v shr 16); 
      with Form1 do 
      begin 
        mainmenu1.Items[1].Items[8].Items[VolumeType-1].Checked:=true;
        PopupMenu1.Items[13].Items[VolumeType-1].Checked:=true;
        imgvoice.left:=shpvoice.left+(shpvoice.width*v) div 255-6; 
      end; 
    end; 
      

  2.   


    function SetWindowMenus(lstr:string):string; 
    var 
      f:string; 
    begin 
      f:=extractfileName(lstr); 
      with Form1.Canvas do 
      begin 
      if textwidth(lstr)>300 then 
          if textwidth(leftBstr(lstr,3)+'...\'+f)>300 then
            lstr:=leftBstr(lstr,3)+'...\'+RightbStr(f,(300-textwidth(leftbstr(lstr,3)+'...\')) div 6)
          else 
            lstr:=leftbstr(lstr,(300-textwidth('...\'+f)) div 6)+'...\'+f;
      SetWindowMenus:=lstr; 
      end;
    end; function SetDrivers(lstr:string):string;
    var
      VolN:array[0..255] of Char;
      n,l,f:Longword; 
      s:array[0..255] of Char; 
    begin 
      GetVolumeInformation(PChar(lstr),VolN,255,@n,l,f,s,255); 
      SetDrivers:=VolN; 
    end; procedure SetDriverInfo(mMenu:TMenuItem;mMenu1:TMenuItem); 
    var 
      i,j:Integer; 
      s:string; 
    begin 
      j:=0; 
      for i:=65 to 90 do 
      begin 
        s:=chr(i)+':\';
        if GetDriveType(pchar(s))=drive_cdrom then
        begin 
            if j=0 then 
              mMenu1.Caption:=s+SetDrivers(s) 
            else 
              SetWindowMenu(mMenu,mMenu1,s+SetDrivers(s)); 
            j:=j+1; 
        end; 
      end;
    end;procedure SetWindowMenu(mMenu:TMenuItem;mMenu1:TMenuItem;lstr:string);
    var 
      mItem:TMenuItem; 
    begin 
      mItem:=TMenuItem.create(mMenu1);
      if mMenu1.caption='-' then
      begin
        mItem.caption:='        '+SetWindowMenus(lstr);
        mItem.onclick:=Form1.MainClick;
        mMenu.insert(4,mitem)
      end 
      else 
      begin 
        mItem.caption:=lstr; 
        mItem.onclick:=Form1.DVDClick; 
        mMenu.insert(mMenu1.count,mitem); 
      end; 
    end; procedure SetOpenIniInfo; 
    var
      rs:TadoDataSet;
      i:Integer;
      s:string;
    begin
      rs:=getrst('select * from 1 where name=""');
      if rs.Eof=false then
      syschecked('delete from 1 where name=""');
      rs:=getrst('select name from 1 order by id');
      if rs.Eof=false then
        Form1.MainMenu1.Items[0].Items[6].Items[3].Visible:=true;
      for i:=1 to rs.RecordCount do
      begin
        s:=rs.FieldValues['name'];
        SetWindowMenu(Form1.MainMenu1.Items[0].Items[6],Form1.MainMenu1.Items[0].Items[6].Items[3],s);
        rs.Next;
      end;
    end;procedure SetFileIni; 
    var
      rs:TadoDataSet;
      i:Integer; 
      s,f:string; 
    begin
      rs:=getrst('select * from 0 where name=""');
      if rs.Eof=false then
      syschecked('delete from 0 where name=""');
      rs:=getrst('select startp,endfile from sys');
      OpenListIndex:=rs.FieldValues['startp'];
      if OpenListIndex>-1 then
          f:=rs.FieldValues['endfile'];
      rs:=getrst('select name from 0 order by id');
      for i:=1 to rs.RecordCount do
      begin
        s:=rs.FieldValues['name'];
        Form1.listbox1.AddItem(extractfileName(s),Form1.listbox1);
        if f=s then Form1.openfiles(f);
        rs.Next;
      end;
    end;procedure SetMenuLists(s:string);
    var
      rs:TadoDataSet;
    begin
      rs:=getrst('select 1 from 1 where id>=(select id from 1 where name="'+s+'")');
      if rs.RecordCount>0 then
        Form1.MainMenu1.Items[0].Items[6].Delete(rs.RecordCount+3);
      SetWindowMenu(Form1.MainMenu1.Items[0].Items[6],Form1.MainMenu1.Items[0].Items[6].Items[3],s);
      syschecked('delete from 1 where name="'+s+'"');
      syschecked('insert into 1([name]) values("'+s+'")');
    end;
    end.