Subversion Repositories musikbox

Rev

Rev 5 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 daniel-mar 1
unit Main;
2
 
3
interface
4
 
5
uses
6
  Windows, Messages, Forms, SysUtils, StdCtrls, IniFiles, MPlayer,
7
  Gauges, ComCtrls, ImgList, Controls, Classes, ExtCtrls,
8
  WaveControl, registry, Dialogs, math;
9
 
10
type
11
  TStringDynArray = array of string;
12
 
13
  TMainForm = class(TForm)
14
    lblOrdner: TLabel;
15
    lstSongs: TListBox;
16
    lblSongs: TLabel;
17
    sbrCopyright: TStatusBar;
18
    btnStart: TButton;
19
    BtnStopp: TButton;
20
    btnPause: TButton;
21
    btnOrdner: TButton;
22
    lstOrdner: TTreeView;
23
    ImgList: TImageList;
24
    MediaPlayer: TMediaPlayer;
25
    plyTimer: TTimer;
26
    grpPlayMode: TGroupBox;
27
    chkRepeatSong: TCheckBox;
28
    radPlayMode1: TRadioButton;
29
    radPlayMode2: TRadioButton;
30
    radPlayMode3: TRadioButton;
31
    grpRunMode: TGroupBox;
32
    radRunMode1: TRadioButton;
33
    radRunMode2: TRadioButton;
34
    radRunMode3: TRadioButton;
35
    grpVolume: TGroupBox;
36
    lblVolume: TLabel;
37
    pgrVolume: TProgressBar;
38
    btnBeenden: TButton;
39
    ggeProgress: TProgressBar;
40
    Status1: TLabel;
41
    Status2: TLabel;
42
    VolProc: TLabel;
43
    procedure FormShow(Sender: TObject);
44
    procedure lstSongsClick(Sender: TObject);
45
    procedure plyTimerTimer(Sender: TObject);
46
    procedure btnPauseClick(Sender: TObject);
47
    procedure BtnStoppClick(Sender: TObject);
48
    procedure btnStartClick(Sender: TObject);
49
    procedure pgrVolumeDragOver(Sender, Source: TObject; X, Y: Integer;
50
      State: TDragState; var Accept: Boolean);
51
    procedure lstOrdnerChange(Sender: TObject; Node: TTreeNode);
52
    procedure chkRepeatSongClick(Sender: TObject);
53
    procedure sbrCopyrightClick(Sender: TObject);
54
    procedure btnBeendenClick(Sender: TObject);
55
    procedure btnOrdnerClick(Sender: TObject);
56
    procedure FormResize(Sender: TObject);
57
    procedure FormCreate(Sender: TObject);
58
    procedure FormDestroy(Sender: TObject);
59
    procedure FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer;
60
      var Resize: Boolean);
61
    procedure ggeProgressMouseDown(Sender: TObject; Button: TMouseButton;
62
      Shift: TShiftState; X, Y: Integer);
63
  public
64
    // VCL-Ersatz start
65
    volWave: TWaveVolumeSetting;
66
    // VCL-Ersatz ende
67
    ini: TIniFile;
68
    MusikArray, FormatArray: TStringDynArray;
69
    ExtentionsArray: array of string;
70
    ActualPath: string;
71
    Playing: boolean;
72
    ActualVolume: integer;
73
    procedure ListeOrdner(ArrayElement: integer; zusatz: string; node: TTreeNode);
74
    procedure InitDirectories();
75
    procedure SchreibeEinstellung();
76
    procedure NextSong();
77
    function MCIExtensions(): string;
78
  end;
79
 
80
var
81
  MainForm: TMainForm;
82
 
83
implementation
84
 
85
uses Info, Config;
86
 
87
{$R *.dfm}
88
 
89
{$R windowsxp.res}
90
 
91
// http://www.delphipraxis.net/post592358.html
92
function IsFileDRMProtected(AFileName: String): Boolean;
93
var lCheckProc: function(const AFileName: PWideChar; var AIsProtected: Bool): HRESULT; stdcall;
94
    lLibHandle: Cardinal;
95
    lWideChar   : PWideChar;
96
    lRes        : HRESULT;
97
    lIsProtected: Bool;
98
begin
99
  lLibHandle := LoadLibrary('wmvcore.dll');
100
  if (lLibHandle > 0) then
101
  begin
102
    lCheckProc := GetProcAddress(lLibHandle, 'WMIsContentProtected');
103
    if Assigned(lCheckProc) then
104
    begin
105
      GetMem(lWideChar, MAX_PATH * SizeOf(WideChar));
106
      StringToWideChar(AFileName, lWideChar, MAX_PATH);
107
      lRes := lCheckProc(lWideChar, lIsProtected);
108
      case lRes of
109
        S_OK: result := lIsProtected
110
        else result := False;
111
      end;
112
    end
113
    else
114
      result := False;
115
  end
116
  else
117
    result := False;
118
end;
119
 
120
// http://www.luckie-online.de/Delphi/Sonstiges/Explode.html
121
function Explode(const Separator, S: string; Limit: Integer = 0):
122
  TStringDynArray;
123
var
124
  SepLen       : Integer;
125
  F, P         : PChar;
126
  ALen, Index  : Integer;
127
begin
128
  SetLength(Result, 0);
129
  if (S = '') or (Limit < 0) then
130
    Exit;
131
  if Separator = '' then
132
  begin
133
    SetLength(Result, 1);
134
    Result[0] := S;
135
    Exit;
136
  end;
137
  SepLen := Length(Separator);
138
  ALen := Limit;
139
  SetLength(Result, ALen);
140
 
141
  Index := 0;
142
  P := PChar(S);
143
  while P^ <> #0 do
144
  begin
145
    F := P;
146
    P := StrPos(P, PChar(Separator));
147
    if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then
148
      P := StrEnd(F);
149
    if Index >= ALen then
150
    begin
151
      Inc(ALen, 5); // mehrere auf einmal um schneller arbeiten zu können
152
      SetLength(Result, ALen);
153
    end;
154
    SetString(Result[Index], F, P - F);
155
    Inc(Index);
156
    if P^ <> #0 then
157
      Inc(P, SepLen);
158
  end;
159
  if Index < ALen then
160
    SetLength(Result, Index); // wirkliche Länge festlegen
161
end;
162
 
163
procedure TMainForm.InitDirectories();
164
var
165
  i: integer;
166
  mnod: TTreeNode;
167
begin
168
  if btnStopp.Enabled then btnStopp.Click;
169
  btnStart.Enabled := false;
170
  mediaplayer.FileName := '';
171
 
172
  lstSongs.Items.Clear;
173
  lblSongs.Caption := 'Songs';
174
 
175
  ActualPath := '';
176
  lstOrdner.Items.Clear;
177
  for i := 0 to length(MusikArray)-1 do
178
  begin
179
    if DirectoryExists(MusikArray[i]) then
180
    begin
181
      mnod := lstOrdner.Items.Add(nil, MusikArray[i]);
182
      ListeOrdner(i, '', mnod);
183
      mnod.ImageIndex := 0;
184
      mnod.Expand(false);
185
    end;
186
  end;
187
end;
188
 
189
function TMainForm.MCIExtensions(): string;
190
var
191
  Reg: TRegistry;
192
  inifile: TIniFile;
193
  sl: TStringList;
194
  WindowsDir: string;
195
  WinDir: String;
196
  WinLen: DWord;
197
  i: integer;
198
begin
199
  sl := TStringList.Create();
200
 
201
  // Registry prüfen (ab Windows NT)
202
  Reg := TRegistry.Create;
203
  Reg.RootKey := HKEY_LOCAL_MACHINE;
204
  if Reg.OpenKeyReadOnly('\SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions\') then
205
    Reg.GetValueNames(sl)
206
  else
207
  begin
208
    // Win.ini, wenn Registry fehlschlägt (ab Windows 95)
209
    SetLength(WinDir, MAX_PATH);
210
    WinLen := GetWindowsDirectory(PChar(WinDir), MAX_PATH);
211
    if WinLen > 0 then
212
    begin
213
      SetLength(WinDir, WinLen);
214
      WindowsDir := WinDir;
215
    end
216
    else
217
      RaiseLastOSError;
218
 
219
    if fileexists(WindowsDir+'\win.ini') then
220
    begin
221
      inifile := TIniFile.Create(WindowsDir+'\win.ini');
222
      try
223
        if inifile.SectionExists('mci extensions') then
224
          inifile.ReadSection('mci extensions', sl)
225
        else
226
          if inifile.SectionExists('MCI Extensions.BAK') then
227
            inifile.ReadSection('MCI Extensions.BAK', sl);
228
      finally
229
        inifile.Free;
230
      end;
231
    end;
232
  end;
233
  Reg.CloseKey;
234
  Reg.Free;
235
 
236
  if sl.count = 0 then
237
  begin
238
    showmessage('Warnung! Es konnten keine MCI-Erweiterungen gefunden werden. Das Programm wird beendet.');
239
    close;
240
  end
241
  else
242
  begin
243
    result := '';
244
    for i := 0 to sl.count-1 do
245
      result := result + lowercase(sl.strings[i]) + '|';
246
    result := copy(result, 0, length(result)-1);
247
  end;
248
end;
249
 
250
procedure TMainForm.FormShow(Sender: TObject);
251
var
252
  MusicPath, Formats: string;
253
  PlayMode, RunMode: integer;
254
  RepeatPlay: boolean;
255
begin
256
  // Lese INI-Einstellungen
257
  ini := TIniFile.Create(extractfilepath(application.ExeName)+'Settings.ini');
258
  try
259
    MusicPath := ini.ReadString('Configuration', 'Path', '');
260
    PlayMode := ini.ReadInteger('Configuration', 'PlayMode', 1);
261
    RunMode := ini.ReadInteger('Configuration', 'RunMode', 1);
262
    RepeatPlay := ini.ReadBool('Configuration', 'RepeatPlay', false);
263
    ClientWidth := ini.ReadInteger('Configuration', 'ClientWidth', ClientWidth);
264
    ClientHeight := ini.ReadInteger('Configuration', 'ClientHeight', ClientHeight);
265
  finally
266
    ini.Free;
267
  end;
268
 
269
  // MCI-Erweiterungen lesen
270
  Formats := MCIExtensions();
271
 
272
  // Anwenden von Einstellungen
273
  if PlayMode = 1 then radPlayMode1.Checked := true;
274
  if PlayMode = 2 then radPlayMode2.Checked := true;
275
  if PlayMode = 3 then radPlayMode3.Checked := true;
276
  if RunMode = 1 then radRunMode1.Checked := true;
277
  if RunMode = 2 then radRunMode2.Checked := true;
278
  if RunMode = 3 then radRunMode3.Checked := true;
279
  chkRepeatSong.Checked := RepeatPlay;
280
  chkRepeatSongClick(self);
281
 
282
  // Zerteile Verzeichnisliste
283
  MusikArray := Explode('|', MusicPath);
284
  FormatArray := Explode('|', Formats);
285
 
286
  InitDirectories();
287
end;
288
 
289
procedure TMainForm.ggeProgressMouseDown(Sender: TObject; Button: TMouseButton;
290
  Shift: TShiftState; X, Y: Integer);
291
begin
292
  if (mediaplayer.FileName <> '') and (not IsFileDRMProtected(mediaplayer.filename)) then
293
  begin
294
    btnstart.Click;
295
    mediaplayer.Position := round(x / ggeProgress.Width * mediaplayer.length);
296
    mediaplayer.play;
297
  end;
298
end;
299
 
300
procedure TMainForm.ListeOrdner(ArrayElement: integer; zusatz: string; node: TTreeNode);
301
var
302
  SR: TSearchRec;
303
  RootFolder: string;
304
  mnod: TTreeNode;
305
begin
306
  RootFolder := MusikArray[ArrayElement]+'\'+zusatz;
307
 
308
  if AnsiLastChar(RootFolder)^ <> '\' then
309
    RootFolder := RootFolder + '\';
310
 
311
    if FindFirst(RootFolder + '*.*', faDirectory, SR) = 0 then
312
    try
313
      repeat
314
        if ((SR.Attr and faDirectory) = faDirectory) and
315
           (SR.Name <> '.') and (SR.Name <> '..') then
316
        begin
317
          mnod := lstOrdner.Items.AddChild(node, SR.Name);
318
          ListeOrdner(ArrayElement, zusatz+SR.Name+'\', mnod);
319
          mnod.ImageIndex := 1;
320
          mnod.SelectedIndex := 1;
321
          mnod.Expand(false);
322
        end;
323
      until FindNext(SR) <> 0;
324
    finally
325
      FindClose(SR);
326
    end;
327
end;
328
 
329
procedure TMainForm.lstSongsClick(Sender: TObject);
330
begin
331
  if mediaplayer.filename <> ActualPath+lstsongs.Items.Strings[lstSongs.ItemIndex]+ExtentionsArray[lstSongs.ItemIndex] then
332
  begin
333
    mediaplayer.filename := ActualPath+lstsongs.Items.Strings[lstSongs.ItemIndex]+ExtentionsArray[lstSongs.ItemIndex];
334
    if BtnStopp.Enabled then BtnStopp.Click;
335
    btnStart.Enabled := true;
336
    if radRunMode2.Checked or radRunMode1.Checked then
337
      BtnStart.Click;
338
  end;
339
end;
340
 
341
function zweinull(inp: integer): string;
342
begin
343
  if inp >= 10 then
344
    result := inttostr(inp)
345
  else
346
    result := '0' + inttostr(inp);
347
end;
348
 
349
// Millisekunden zu hh:mm:ss
350
function mstotimestr(inp: integer): string;
351
var
352
  h, m, s: integer;
353
begin
354
  result := '';
355
  m := (inp div 1000) div 60;
356
  h := 0;
357
  while m >= 60 do
358
  begin
359
    inc(h);
360
    m := m - 60;
361
  end;
362
  s := (inp div 1000) - m * 60;
363
  result := zweinull(h)+':'+zweinull(m)+':'+zweinull(s);
364
end;
365
 
366
procedure TMainForm.plyTimerTimer(Sender: TObject);
367
begin
368
  pgrVolume.Position := 1000 - volWave.Position;
369
  VolProc.Caption := inttostr(100 - round(volWave.Position / 1000 * 100))+'%';
370
  if Playing then
371
  begin
372
    ggeProgress.Max := mediaplayer.Length;
373
    ggeProgress.Position := mediaplayer.Position;
374
    Status1.caption := mstotimestr(mediaplayer.Position) + ' / ' + mstotimestr(mediaplayer.Length);
375
    Status2.caption := inttostr(floor(ggeprogress.Position / ggeprogress.Max * 100)) + '%';
376
    if mediaplayer.Position >= mediaplayer.Length then
377
    begin
378
      mediaplayer.Rewind;
379
      nextsong;
380
    end;
381
  end;
382
end;
383
 
384
procedure TMainForm.btnPauseClick(Sender: TObject);
385
begin
386
  mediaplayer.Pause;
387
  btnStart.Enabled := true;
388
  btnPause.Enabled := false;
389
end;
390
 
391
procedure TMainForm.BtnStoppClick(Sender: TObject);
392
begin
393
  Playing := false;
394
 
395
  mediaplayer.Stop;
396
  mediaplayer.close;
397
 
398
  ggeProgress.Position := 0;
399
  ggeProgress.Max := 0;
400
  Status1.Caption := '00:00:00';
401
  Status2.Caption := '0%';
402
 
403
  BtnStopp.Enabled := false;
404
  BtnPause.Enabled := false;
405
  BtnStart.Enabled := true;
406
end;
407
 
408
// http://www.wer-weiss-was.de/theme159/article1483880.html
409
procedure delay(nDelay: Integer);
410
var
411
  nStart : Integer;
412
begin
413
  nStart := GetTickCount;
414
  while Integer(GetTickCount)-nStart < nDelay do
415
  begin
416
    Application.ProcessMessages;
417
    Sleep(0);
418
  end;
419
end;
420
 
421
procedure TMainForm.btnStartClick(Sender: TObject);
422
begin
423
  if IsFileDRMProtected(mediaplayer.filename) then
424
  begin
425
    delay(250);
426
    NextSong;
427
  end
428
  else
429
  begin
430
 
431
  if btnStopp.Enabled then
432
    mediaplayer.Play
433
  else
434
  begin
435
    mediaplayer.Open;
436
    mediaplayer.Play;
437
    playing := true;
438
  end;
439
 
440
  BtnStart.Enabled := false;
441
  BtnPause.Enabled := true;
442
  BtnStopp.Enabled := true;
443
  end;
444
 
445
end;
446
 
447
procedure TMainForm.pgrVolumeDragOver(Sender, Source: TObject; X,
448
  Y: Integer; State: TDragState; var Accept: Boolean);
449
begin
450
  pgrVolume.Position := round(pgrVolume.Max * (abs(x)/pgrVolume.Width));
451
  ActualVolume := round(1000 * (abs(x)/pgrVolume.Width));
452
  volWave.Position := 1000-ActualVolume;
453
end;
454
 
455
procedure TMainForm.lstOrdnerChange(Sender: TObject; Node: TTreeNode);
456
var
457
  Path, ext: string;
458
  Aktuell: TTreeNode;
459
  sr: TSearchRec;
460
  res, i: integer;
461
  FCheck: boolean;
462
begin
463
  if BtnStopp.Enabled then BtnStopp.Click;
464
  if BtnStart.Enabled then BtnStart.Enabled := false;
465
 
466
  // Pfad finden
467
  Aktuell := lstOrdner.Selected;
468
  lblSongs.caption := Aktuell.Text;
469
  Path := Aktuell.Text+'\';
470
  repeat
471
    try
472
      if Aktuell.Parent <> nil then
473
      begin
474
        Aktuell := Aktuell.Parent;
475
        Path := Aktuell.Text+'\'+Path;
476
      end
477
      else
478
        Break;
479
    except end;
480
  until false;
481
 
482
  if ActualPath <> Path then
483
  begin
484
    // Liste leeren
485
    lstSongs.Items.Clear;
486
    setlength(ExtentionsArray, 0);
487
 
488
    // Dateien auflisten
489
    res := FindFirst(Path+'*.*', faAnyFile, sr);
490
    try
491
      while (res = 0) do
492
      begin
493
        if (sr.name <> '.') and (sr.name <> '..') then
494
        begin
495
          try
496
            ext := lowercase(ExtractFileExt(sr.FindData.cFileName));
497
            FCheck := false;
498
            for i := 0 to length(FormatArray)-1 do
499
              if ext = '.'+FormatArray[i] then
500
                FCheck := true;
501
            if FCheck then
502
            begin
503
              setlength(ExtentionsArray, length(ExtentionsArray)+1);
504
              ExtentionsArray[length(ExtentionsArray)-1] := ext;
505
              lstSongs.items.Add(copy(sr.Name, 0, length(sr.name)-4));
506
            end;
507
          except
508
          end;
509
        end;
510
        res := FindNext(sr);
511
      end;
512
    finally
513
      FindClose(sr);
514
    end;
515
 
516
    ActualPath := Path;
517
  end;
518
 
519
  if (lstSongs.Items.Count > 0) and radRunMode1.Checked then
520
  begin
521
    lstSongs.ItemIndex := 0;
522
    lstSongs.Selected[0] := true;
523
    lstSongsClick(self);
524
    if radRunMode1.Checked then
525
      btnStart.Click;
526
  end;
527
end;
528
 
529
procedure TMainForm.chkRepeatSongClick(Sender: TObject);
530
begin
531
  radPlayMode1.Enabled := not chkRepeatSong.Checked;
532
  radPlayMode2.Enabled := not chkRepeatSong.Checked;
533
  radPlayMode3.Enabled := not chkRepeatSong.Checked;
534
end;
535
 
536
procedure TMainForm.SchreibeEinstellung();
537
var
538
  PlayMode, RunMode, i: integer;
539
  RepeatPlay: boolean;
540
  MusicPath: string;
541
begin
542
  // Erkenne Eigenschaften
543
  RepeatPlay := chkRepeatSong.Checked;
544
  PlayMode := 1;
545
  if radPlayMode1.Checked then PlayMode := 1;
546
  if radPlayMode2.Checked then PlayMode := 2;
547
  if radPlayMode3.Checked then PlayMode := 3;
548
  RunMode := 1;
549
  if radRunMode1.Checked then RunMode := 1;
550
  if radRunMode2.Checked then RunMode := 2;
551
  if radRunMode3.Checked then RunMode := 3;
552
 
553
  // Arrays zusammenfassen
554
  MusicPath := '';
555
  for i := 0 to length(MusikArray)-1 do
556
    MusicPath := MusicPath + '|' + MusikArray[i];
557
  MusicPath := copy(MusicPath, 2, length(MusicPath)-1);
558
 
559
  // Schreibe INI-Einstellungen
560
  ini := TIniFile.Create(extractfilepath(application.ExeName)+'Settings.ini');
561
  try
562
    ini.WriteString('Configuration', 'Path', MusicPath);
563
    ini.WriteInteger('Configuration', 'PlayMode', PlayMode);
564
    ini.WriteInteger('Configuration', 'RunMode', RunMode);
565
    ini.WriteBool('Configuration', 'RepeatPlay', RepeatPlay);
566
    ini.WriteInteger('Configuration', 'ClientWidth', ClientWidth);
567
    ini.WriteInteger('Configuration', 'ClientHeight', ClientHeight);
568
  finally
569
    ini.Free;
570
  end;
571
end;
572
 
573
procedure TMainForm.FormCanResize(Sender: TObject; var NewWidth,
574
  NewHeight: Integer; var Resize: Boolean);
575
begin
576
  if NewHeight < (grpVolume.Top + grpVolume.Height + 8 + btnStart.height + 8 + sbrcopyright.height + GetSystemMetrics(sm_cYsize) + 8) then
577
    NewHeight := (grpVolume.Top + grpVolume.Height + 8 + btnStart.height + 8 + sbrcopyright.height + GetSystemMetrics(sm_cYsize) + 8);
578
 
579
  if NewWidth <= 720 then NewWidth := 720;  
580
end;
581
 
582
procedure TMainForm.FormCreate(Sender: TObject);
583
begin
584
  volWave := TWaveVolumeSetting.Create(self);
585
  volWave.Parent := self;
586
  volWave.Max := 1000;
587
  volWave.Visible := false;
588
end;
589
 
590
procedure TMainForm.FormDestroy(Sender: TObject);
591
begin
592
  volWave.Free;
593
  ggeProgress.free;
594
end;
595
 
596
procedure TMainForm.sbrCopyrightClick(Sender: TObject);
597
begin
598
  InfoForm.PopupParent := Screen.ActiveForm; // http://www.delphipraxis.net/topic75743,0,asc,0.html
599
  InfoForm.showmodal();
600
end;
601
 
602
procedure TMainForm.btnBeendenClick(Sender: TObject);
603
begin
604
  close;
605
end;
606
 
607
procedure TMainForm.btnOrdnerClick(Sender: TObject);
608
begin
609
  ConfigForm.PopupParent := Screen.ActiveForm; // http://www.delphipraxis.net/topic75743,0,asc,0.html
610
  ConfigForm.showmodal();
611
end;
612
 
613
procedure TMainForm.FormResize(Sender: TObject);
614
begin
615
  // Höhenverwaltung
616
  lstOrdner.Height := MainForm.ClientHeight - lstOrdner.Top - 2 * lstOrdner.Left - sbrCopyright.Height - btnBeenden.Height;
617
  lstSongs.Height := lstOrdner.Height;
618
  btnBeenden.Top := lstOrdner.Top + lstOrdner.Height + lstOrdner.Left;
619
  btnOrdner.Top := btnBeenden.Top;
620
  ggeProgress.Top := lstSongs.Top + lstSongs.Height + lstOrdner.Left;
621
  btnStart.Top := ggeProgress.Top;
622
  btnPause.Top := btnStart.Top;
623
  btnStopp.Top := btnPause.Top;
624
  status1.top := ggeProgress.Top + ggeProgress.Height + 2;
625
  status2.top := status1.top;
626
 
627
  // Breitenverwaltung
628
  lstSongs.Width := round((MainForm.ClientWidth - 4 * lstOrdner.Left - grpPlayMode.Width) / 2);
629
  lstOrdner.Width := lstSongs.Width;
630
  lstSongs.Left := 2 * lstOrdner.Left + lstOrdner.Width;
631
  grpPlayMode.Left := lstOrdner.Left + lstSongs.Left + lstSongs.Width;
632
  grpRunMode.Left := grpPlayMode.Left;
633
  grpVolume.Left := grpPlayMode.Left;
634
  lblSongs.Left := lstSongs.Left;
635
  lblOrdner.Left := lstOrdner.Left;
636
  btnBeenden.Width := round((lstOrdner.Width - btnBeenden.Left) / 2);
637
  btnOrdner.Width := btnBeenden.Width;
638
  btnOrdner.Left := 2 * btnBeenden.Left + btnBeenden.Width;
639
  ggeProgress.Width := lstSongs.Width;
640
  ggeProgress.Left := lstSongs.Left;
641
  status1.left := ggeProgress.Left;
642
  status2.left := ggeProgress.left + ggeProgress.Width - status2.width;
643
  btnStart.Left := grpPlayMode.Left;
644
  btnStart.Width := round((grpPlayMode.Width - 2 * lstOrdner.Left) / 100 * 50);
645
  btnPause.Width := round((grpPlayMode.Width - 2 * lstOrdner.Left) / 100 * 25);
646
  btnStopp.Width := round((grpPlayMode.Width - 2 * lstOrdner.Left) / 100 * 25);
647
  btnPause.Left := btnBeenden.Left + btnStart.Left + btnStart.Width;
648
  btnStopp.Left := btnBeenden.Left + btnPause.Left + btnPause.Width;
649
end;
650
 
651
procedure TMainForm.NextSong();
652
var
653
  actrand: integer;
654
begin
655
  if chkRepeatSong.Checked then
656
    mediaplayer.Play
657
  else
658
  begin
659
    if radPlayMode2.Checked then
660
    begin
661
      randomize();
662
      repeat
663
        actrand := random(lstSongs.Items.Count);
664
      until actrand <> lstSongs.ItemIndex;
665
      lstSongs.ItemIndex := actrand;
666
      lstSongs.Selected[lstSongs.ItemIndex] := true;
667
      lstSongsClick(self);
668
      btnStart.Click;
669
    end;
670
    if radPlayMode1.Checked then
671
    begin
672
      if lstSongs.ItemIndex+1 = lstSongs.Items.Count then
673
        lstSongs.ItemIndex := 0
674
      else
675
        lstSongs.ItemIndex := lstSongs.ItemIndex+1;
676
      lstSongs.Selected[lstSongs.ItemIndex] := true;
677
      lstSongsClick(self);
678
      btnStart.Click;
679
    end;
680
    if radPlayMode3.Checked then
681
    begin
682
      ggeProgress.Position := ggeProgress.Min;
683
      BtnStart.Enabled := true;
684
      BtnStopp.Enabled := false;
685
      btnPause.Enabled := false;
686
    end;
687
  end;
688
end;
689
 
690
end.