home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / das_buch / windows / media / trackwin.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-06-04  |  8.2 KB  |  269 lines

  1. UNIT TrackWin;
  2.  
  3. {$R TrackWin}
  4.  
  5. INTERFACE
  6.  
  7. USES WinTypes, Objects, OWindows, ODialogs;
  8.  
  9. CONST
  10.   cm_LoadData = 121;
  11.   cm_SaveData = 122;
  12.   wm_UpdateCDTitle : WORD = 0;
  13.   ids_Filter  = 111;
  14.   DefExt      = '*.REE';
  15.  
  16. TYPE
  17.   pTrackCollection = ^tTrackCollection;
  18.   tTrackCollection = OBJECT (tStrCollection)
  19.     FUNCTION Compare(Key1, Key2: POINTER): INTEGER; VIRTUAL;
  20.   END;
  21.  
  22.   tTrackXferRec = RECORD
  23.     ListStrings: pTrackCollection;
  24.     ListSelect: INTEGER;
  25.   END;
  26.  
  27.   tTrackData = RECORD
  28.     TrackNo, LenMin, LenSec: WORD;
  29.     TrackName: LONGINT;
  30.   END;
  31.  
  32.   pTrackWindow = ^tTrackWindow;
  33.   tTrackWindow = OBJECT (tWindow)
  34.     aListBox: pListBox;
  35.     aStatic: pStatic;
  36.     TheFont: hFont;
  37.     Xfer: tTrackXferRec;
  38.     CONSTRUCTOR Init (aTitle: pChar);
  39.     DESTRUCTOR Done; VIRTUAL;
  40.     PROCEDURE SetupWindow; VIRTUAL;
  41.     PROCEDURE wmGetMinMaxInfo (VAR Msg: tMessage); VIRTUAL wm_First + wm_GetMinMaxInfo;
  42.     PROCEDURE wmCtlColor (VAR Msg: tMessage); VIRTUAL wm_First + wm_CtlColor;
  43.     PROCEDURE wmSize (VAR Msg: tMessage); VIRTUAL wm_First + wm_Size;
  44.     PROCEDURE LoadData (VAR Msg: tMessage); VIRTUAL cm_First + cm_LoadData;
  45.     PROCEDURE SaveData (VAR Msg: tMessage); VIRTUAL cm_First + cm_SaveData;
  46.   END;
  47.   tFileName = ARRAY [0..255] OF CHAR;
  48.  
  49. CONST
  50.   TrackWindow: pTrackWindow = NIL;
  51.  
  52. IMPLEMENTATION
  53.  
  54. USES WinProcs, Strings, CommDlg, MMSystem, CDAudio;
  55.  
  56. CONST
  57.   TrackBufLen = 12;
  58.   XSize = 360;
  59.   YSize = 200;
  60.   id_Box = 201;
  61.   id_Static = 202;
  62.   id_ScrollBar = 203;
  63.   StatTitle : pChar = 'Track==Length==Title===========================';
  64.  
  65. FUNCTION tTrackCollection.Compare(Key1, Key2: POINTER): INTEGER;
  66. BEGIN
  67.   Compare := -1;
  68. END;
  69.  
  70. PROCEDURE WalkOnTheWildSide (VAR ATrackCol: pTrackCollection);
  71. VAR
  72.   Buffer: ARRAY [0..TrackBufLen] OF CHAR;
  73.   TrackData: tTrackData;
  74.   Count: INTEGER;
  75.   ReturnCode, MSF: LONGINT;
  76. BEGIN
  77.   FOR Count := 1 TO HowManyTracks DO
  78.   BEGIN
  79.     MSF := GetTrackLen (Count);
  80.     TrackData.TrackNo := Count;
  81.     TrackData.LenMin  := mci_MSF_Minute (MSF);
  82.     TrackData.LenSec  := mci_MSF_Second (MSF);
  83.     wvSprintF (Buffer, ' %02i   %02i:%02i', TrackData);
  84.     ATrackCol^.Insert (StrNew (Buffer));
  85.   END;
  86. END;
  87.  
  88. CONSTRUCTOR tTrackWindow.Init (aTitle: pChar);
  89. BEGIN
  90.   tWindow.Init (NIL, aTitle);
  91.   Attr.w := XSize;
  92.   Attr.h := YSize;
  93.   Attr.Menu := LoadMenu (hInstance, 'TrackMenu');
  94.   aListBox := New (pListBox, Init (@Self, id_Box, 0, 16, XSize, YSize));
  95.   aListBox^.Attr.Style := ((aListBox^.Attr.Style AND NOT ws_Border)
  96.                 OR lbs_NoIntegralHeight) AND NOT lbs_Sort;
  97.   EnableKBHandler;
  98.   aStatic := New (pStatic, Init (@Self, id_Static, StatTitle, 0, 0, XSize, 15, StrLen(StatTitle)));
  99.   aStatic^.Attr.Style := aStatic^.Attr.Style OR ss_LeftNoWordWrap;
  100.   Xfer.ListStrings := New (pTrackCollection, Init (20, 2));
  101.   Xfer.ListStrings^.Duplicates := TRUE;
  102.   TransferBuffer := @Xfer;
  103. END;
  104.  
  105. DESTRUCTOR tTrackWindow.Done;
  106. BEGIN
  107.   inherited Done;
  108.   TrackWindow := NIL;
  109. END;
  110.  
  111. PROCEDURE tTrackWindow.SetupWindow;
  112. BEGIN
  113.   tWindow.SetupWindow;
  114.   (* mu▀ ein 13-Punkt Font sein, weil, sollten zusΣtzliche Windows-Fonts geladen sein, *)
  115.   (* nur Winz-Buchstaben zu sehen sind. Funktioniert auch mit geladenem ATM.           *)
  116.   TheFont := CreateFont (13, 0, 0, 0, 400, 0, 0, 0, ANSI_CharSet,
  117.              out_Default_Precis, clip_Default_Precis,
  118.              Default_Quality, 0, 'COURIER');
  119.  
  120.   SendMessage (aListBox^.hWindow, wm_SetFont, TheFont, 0);
  121.  
  122.   WalkOnTheWildSide (Xfer.ListStrings);
  123.   aListBox^.Transfer (@Xfer, tf_SetData);
  124. END;
  125.  
  126. PROCEDURE tTrackWindow.wmGetMinMaxInfo (VAR Msg: tMessage);
  127. TYPE
  128.   PInfo= ^TInfo;
  129.   TInfo= ARRAY [0..4] OF tPoint;
  130. BEGIN
  131.   PInfo(Msg.lParam)^[4].x := XSize;
  132. END;
  133.  
  134. PROCEDURE tTrackWindow.wmCtlColor (VAR Msg: tMessage);
  135. BEGIN
  136.   DefWndProc (Msg);
  137.   IF (Msg.lParamHi = ctlcolor_Static)
  138.     THEN BEGIN
  139.       SetTextColor (Msg.wParam, RGB(150, 0, 0));
  140.       SetBkColor (Msg.wParam, RGB(200, 200, 200));
  141.     END;
  142. END;
  143.  
  144. PROCEDURE tTrackWindow.wmSize (VAR Msg: tMessage);
  145. BEGIN
  146.   tWindow.wmSize (Msg);
  147.   MoveWindow (aListBox^.hWindow, 0, 16, Msg.lParamLo, Msg.lParamHi-16, TRUE);
  148. END;
  149.  
  150. FUNCTION Min (a,b: INTEGER): INTEGER;
  151. BEGIN
  152.   IF (a <= b) THEN Min := a ELSE Min := b;
  153. END;
  154.  
  155. PROCEDURE tTrackWindow.LoadData (VAR Msg: tMessage);
  156. VAR
  157.   OpenFN: TOpenFileName;
  158.   Filter: ARRAY [0..100] OF CHAR;
  159.   TitleLine: STRING[49];
  160.   PTitleLine, PLine, Temp: ARRAY [0..50] OF CHAR;
  161.   FullFileName, FileName: tFileName;
  162.   NewColl, TitleColl: pTrackCollection;
  163.   TrackFile: Text;
  164.   i: INTEGER;
  165. BEGIN
  166.   StrCopy(FullFileName, '');
  167.  
  168.   FillChar(Filter, SizeOf(Filter), #0);  { Set up for double null at end }
  169.   StrCopy(Filter, 'CD Data File (*.REE)');
  170.   StrCopy(@Filter[StrLen(Filter)+1], '*.ree');
  171.  
  172.   FillChar(OpenFN, SizeOf(TOpenFileName), #0);
  173.   WITH OpenFN DO BEGIN
  174.     hInstance     := hInstance;
  175.     hwndOwner     := hWindow;
  176.     lpstrDefExt   := DefExt;
  177.     lpstrFile     := FullFileName;
  178.     lpstrFilter   := Filter;
  179.     lpstrFileTitle:= FileName;
  180.     Flags         := ofn_FileMustExist;
  181.     lStructSize   := SizeOf(TOpenFileName);
  182.     nFilterIndex  := 1;       {Index into Filter String in lpstrFilter}
  183.     nMaxFile      := SizeOf(FullFileName);
  184.   END;
  185.   IF GetOpenFileName(OpenFN) THEN BEGIN
  186.     (* open selected file and interpret as track relevant data *)
  187.     NewColl := New (pTrackCollection, Init(20,2));
  188.     Assign (TrackFile, FullFileName);
  189.     Reset (TrackFile);
  190.     ReadLn (TrackFile, TitleLine);
  191.     StrPCopy (PTitleLine, TitleLine);
  192.     SetWindowText (hWindow, PTitleLine);
  193.     (* Send message to main dialog in order to set CD title *)
  194.     SendMessage (Application^.MainWindow^.hWindow, wm_UpdateCDTitle, 0, LONGINT(@PTitleLine));
  195.     (* insert lines from file into a temporary collection *)
  196.     REPEAT
  197.       ReadLn (TrackFile, TitleLine);
  198.       StrPCopy (PTitleLine, TitleLine);
  199.       NewColl^.Insert (StrNew(PTitleLine));
  200.     UNTIL (EoF(TrackFile));
  201.     Close (TrackFile);
  202.     (* create new collection with track/min:sec/title data *)
  203.     TitleColl := New (pTrackCollection, Init(20,2));
  204.     (* compute minimum to avoid collection index out of range *)
  205.     (* if chosen file & CD don't match                        *)
  206.     (*
  207.     FOR i := 0 TO Min((NewColl^.Count-1), (Xfer.ListStrings^.Count -1)) DO
  208.     *)
  209.     FOR i := 0 TO Xfer.ListStrings^.Count-1 DO
  210.     (* walk thru collections and merge entries *)
  211.     BEGIN
  212.       IF (StrLen (pChar(Xfer.ListStrings^.At(i))) > TrackBufLen) THEN
  213.       BEGIN
  214.         (* there is already title information in the collection *)
  215.         (* so get rid of it                                     *)
  216.         Xfer.ListStrings^.FreeAll;
  217.         (* get new track length information                     *)
  218.         WalkOnTheWildSide (Xfer.ListStrings);
  219.       END;
  220.       StrCopy (PLine, pChar(Xfer.ListStrings^.At(i)));
  221.       StrCat  (PLine, '  ');
  222.       IF (i <= NewColl^.Count-1)
  223.         THEN StrCat  (PLine, pChar(NewColl^.At(i)))
  224.         ELSE StrCat (PLine, ' ');
  225.       TitleColl^.Insert (StrNew(PLine));
  226.     END;
  227.     (* Swap collections & ReeDraw! *)
  228.     aListBox^.Transfer (@Xfer, tf_GetData);
  229.     aListBox^.ClearList;
  230.     Dispose (Xfer.ListStrings, Done);
  231.     Dispose (NewColl, Done);
  232.     Xfer.ListStrings := TitleColl;
  233.     aListBox^.Transfer (@Xfer, tf_SetData);
  234.   END;
  235. END;
  236.  
  237. PROCEDURE tTrackWindow.SaveData (VAR Msg: tMessage);
  238. VAR
  239.   OpenFN      : TOpenFileName;
  240.   Filter      : ARRAY [0..100] OF CHAR;
  241.   FullFileName, FileName: tFileName;
  242. BEGIN
  243.   StrCopy(FullFileName, '');
  244.  
  245.   FillChar(Filter, SizeOf(Filter), #0);  { Set up for double null at end }
  246.   StrCopy(Filter, 'CD Data File (*.REE)');
  247.   StrCopy(@Filter[StrLen(Filter)+1], '*.ree');
  248.  
  249.   FillChar(OpenFN, SizeOf(TOpenFileName), #0);
  250.   WITH OpenFN DO BEGIN
  251.     hInstance     := hInstance;
  252.     hwndOwner     := hWindow;
  253.     lpstrDefExt   := DefExt;
  254.     lpstrFile     := FullFileName;
  255.     lpstrFilter   := Filter;
  256.     lpstrFileTitle:= FileName;
  257.     Flags         := ofn_OverwritePrompt;
  258.     lStructSize   := SizeOf(TOpenFileName);
  259.     nFilterIndex  := 1;       {Index into Filter String in lpstrFilter}
  260.     nMaxFile      := SizeOf(FullFileName);
  261.   END;
  262.   IF GetSaveFileName(OpenFN) THEN
  263.     MessageBox (0, FullFileName, 'Hi', mb_OK);
  264. END;
  265.  
  266. BEGIN
  267.   wm_UpdateCDTitle := RegisterWindowMessage ('UpdateCDTitle');
  268. END.
  269.