unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.Permissions, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base, FMX.ListView, FMX.ScrollBox, FMX.Memo,FMX.Layouts, FMX.ListBox, System.ImageList, FMX.ImgList, FMX.Ani, FMX.Objects, FMX.Effects, FMX.Memo.Types, FMX.Edit, FMX.Media, FMX.MediaLibrary.Actions, FMX.Filter.Effects, FMX.Filter; type TForm5 = class(TForm) StyleBook1: TStyleBook; Panel1: TPanel; opd_names: TOpenDialog; mem_names: TMemo; lsb_names: TListBox; ListBoxItem1: TListBoxItem; ListBoxItem2: TListBoxItem; ListBoxItem3: TListBoxItem; ImageList1: TImageList; spb_loadname: TSpeedButton; spb_go: TSpeedButton; lbl_winner: TLabel; Timer1: TTimer; FloatAnimation1: TFloatAnimation; FloatAnimation2: TFloatAnimation; mem_winners: TMemo; Image1: TImage; GlowEffect1: TGlowEffect; FloatAnimation3: TFloatAnimation; ShadowEffect1: TShadowEffect; Edit1: TEdit; spb_loadmusic: TSpeedButton; MediaPlayer1: TMediaPlayer; opd_music: TOpenDialog; procedure spb_loadnameClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure spb_goClick(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure spb_loadmusicClick(Sender: TObject); private tmpi:Integer; musicName:String; FPermissionReadExternalStorage, FPermissionWriteExternalStorage: string; procedure DisplayRationale(Sender: TObject; const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc); procedure LoadListPermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray); procedure LoadSongPermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray); procedure MyListFile(ASelectedItem: String); procedure MySongFile(ASelectedItem: String); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure LoadList(ASelectedItem: String); end; var Form5: TForm5; implementation uses {$IFDEF ANDROID} Androidapi.Helpers, Androidapi.JNI.JavaTypes, Androidapi.JNI.Os, {$ENDIF} System.IOUtils, FMX.DialogService, ufmSelect; {$R *.fmx} constructor TForm5.Create(AOwner: TComponent); begin inherited Create(AOwner); {$IFDEF ANDROID} FPermissionReadExternalStorage := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE); FPermissionWriteExternalStorage := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE); {$ENDIF} end; destructor TForm5.Destroy; begin inherited Destroy; end; // Optional rationale display routine to display permission requirement rationale to the user procedure TForm5.DisplayRationale(Sender: TObject; const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc); var I: Integer; RationaleMsg: string; begin for I := 0 to High(APermissions) do begin if APermissions[I] = FPermissionWriteExternalStorage then RationaleMsg := RationaleMsg + 'The app needs to save files to your device' + SLineBreak else if APermissions[I] = FPermissionReadExternalStorage then RationaleMsg := RationaleMsg + 'The app needs to load files from your device' + SLineBreak; end; // Show an explanation to the user *asynchronously* - don't block this thread waiting for the user's response! // After the user sees the explanation, invoke the post-rationale routine to request the permissions TDialogService.ShowMessage(RationaleMsg, procedure(const AResult: TModalResult) begin APostRationaleProc; end) end; procedure TForm5.LoadList(ASelectedItem: String); var i:Integer; aFStream:TFileStream; begin if FileExists(ASelectedItem) then begin FloatAnimation3.Enabled:=false; lbl_winner.Visible:=false; aFStream:=TFileStream.Create(ASelectedItem,fmOpenRead+fmShareDenyNone); mem_names.Lines.Clear; mem_names.Lines.LoadFromStream(aFStream,TEncoding.UTF8); mem_names.Text:= mem_names.Text.Trim; FreeAndNil(aFStream); lsb_names.Items.Clear; mem_winners.Lines.Clear; GlowEffect1.Enabled:=false; ShadowEffect1.Enabled:=false; for i := 0 to mem_names.Lines.Count -1 do begin lsb_names.Items.Add(mem_names.Lines[i]); lsb_names.ItemByIndex(i).ImageIndex:=0; end; TDialogService.MessageDialog('加载列表总共:'+IntToStr(lsb_names.Items.Count)+'个项目。' ,TMsgDlgType.mtInformation,[TMsgDlgBtn.mbOK], TMsgDlgBtn.mbOK, -1,nil); end else begin TDialogService.MessageDialog('加载文件取消!' ,TMsgDlgType.mtError,[TMsgDlgBtn.mbOK], TMsgDlgBtn.mbOK, -1,nil); end; end; procedure TForm5.FormCreate(Sender: TObject); begin mem_names.Lines.Clear; mem_winners.Lines.Clear; lsb_names.Items.Clear; lbl_winner.Visible:=false; GlowEffect1.Enabled:=false; ShadowEffect1.Enabled:=false; FloatAnimation3.Enabled:=false; musicName:='/storage/emulated/0/ACMusic.mp3'; Edit1.Text :='/storage/emulated/0/ACList.jpg'; end; procedure TForm5.spb_goClick(Sender: TObject); begin if spb_go.Text='开始摇奖' then begin if lsb_names.Items.Count<=0 then begin TDialogService.MessageDialog('请先加载抽奖人员名单!' ,TMsgDlgType.mtError,[TMsgDlgBtn.mbOK], TMsgDlgBtn.mbOK, -1,nil); end else if lsb_names.Items.Count<=1 then begin TDialogService.MessageDialog('仅有一个人无法抽奖哦!' ,TMsgDlgType.mtError,[TMsgDlgBtn.mbOK], TMsgDlgBtn.mbOK, -1,nil); end else begin if mem_winners.Lines.Count>=lsb_names.Items.Count then begin TDialogService.MessageDialog('所有人都中奖了!' ,TMsgDlgType.mtWarning,[TMsgDlgBtn.mbOK], TMsgDlgBtn.mbOK, -1,nil); end else begin lbl_winner.Visible:=true; spb_go.Text:='停止摇奖'; spb_go.Hint:='停止摇奖'; spb_loadname.Enabled:=false; spb_loadmusic.Enabled:=false; spb_go.StyleLookup:='pausetoolbuttonbordered'; GlowEffect1.Enabled:=false; ShadowEffect1.Enabled:=true; FloatAnimation1.Enabled:=true; FloatAnimation2.Enabled:=true; FloatAnimation3.Enabled:=false; GlowEffect1.Softness:=0.4; lbl_winner.TextSettings.Font.Size:=112; Timer1.Enabled:=true; if FileExists(MediaPlayer1.FileName) then begin MediaPlayer1.Play; end; end; end; end else begin MediaPlayer1.Stop(); spb_loadname.Enabled:=true; spb_loadmusic.Enabled:=true; spb_go.Text:='开始摇奖'; spb_go.Hint:='开始摇奖'; spb_go.StyleLookup:='playtoolbuttonbordered'; FloatAnimation1.Enabled:=false; FloatAnimation2.Enabled:=false; lbl_winner.RotationAngle:=0; Timer1.Enabled:=false; Randomize; repeat tmpi:=Random(lsb_names.Items.Count); until mem_winners.Lines.IndexOf(lsb_names.Items[tmpi])<0; lsb_names.ItemByIndex(tmpi).IsSelected:=true; lbl_winner.Text := lsb_names.Items[tmpi]; mem_winners.Lines.Add(lbl_winner.Text); lbl_winner.TextSettings.Font.Size:=168; GlowEffect1.Enabled:=true; ShadowEffect1.Enabled:=false; FloatAnimation3.Enabled:=true; end; end; procedure TForm5.spb_loadmusicClick(Sender: TObject); begin PermissionsService.RequestPermissions([FPermissionReadExternalStorage, FPermissionWriteExternalStorage], LoadSongPermissionRequestResult, DisplayRationale); end; procedure TForm5.spb_loadnameClick(Sender: TObject); begin PermissionsService.RequestPermissions([FPermissionReadExternalStorage, FPermissionWriteExternalStorage], LoadListPermissionRequestResult, DisplayRationale); end; procedure TForm5.Timer1Timer(Sender: TObject); begin Randomize; tmpi:=Random(lsb_names.Items.Count); lsb_names.ItemByIndex(tmpi).IsSelected:=true; lbl_winner.Text := lsb_names.Items[tmpi]; Application.ProcessMessages; end; procedure TForm5.LoadListPermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray); begin // 2 permissions involved: READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE if (Length(AGrantResults) = 2) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) then begin // if opd_names.Execute then // begin // Edit1.Text:=opd_names.FileName; // end; // LoadList(Edit1.Text); if fmSelect = nil then begin Application.CreateForm(TfmSelect, fmSelect); fmSelect.Callback := MyListFile; end; fmSelect.Show; fmSelect.CD(ExtractFilePath(Edit1.Text)); end else TDialogService.ShowMessage('Cannot load list, the required permissions are not granted'); end; procedure TForm5.LoadSongPermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray); begin // 2 permissions involved: READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE if (Length(AGrantResults) = 2) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) then begin // if opd_music.Execute then // begin // musicName:=opd_music.FileName; // end; // if FileExists(musicName) then // begin // MediaPlayer1.Stop; // MediaPlayer1.FileName:=musicName; // MediaPlayer1.Play; // end; if fmSelect2 = nil then begin Application.CreateForm(TfmSelect, fmSelect2); fmSelect2.Callback := MySongFile; end; fmSelect2.Show; fmSelect2.CD(ExtractFilePath(musicName)); end else TDialogService.ShowMessage('Cannot load song, the required permissions are not granted'); end; procedure TForm5.MyListFile(ASelectedItem: String); begin LoadList(ASelectedItem); // end; procedure TForm5.MySongFile(ASelectedItem: String); begin MediaPlayer1.Stop; MediaPlayer1.FileName:=ASelectedItem; MediaPlayer1.Play; end; end.