home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 October / Chip_2001-10_cd1.bin / zkuste / delphi / navody / DICOMSRC.ZIP / MAIN.PAS < prev    next >
Pascal/Delphi Source File  |  2001-06-11  |  46KB  |  1,218 lines

  1. unit Main;
  2.  
  3. interface                                            
  4.  
  5. uses Windows, SysUtils, Classes, Graphics, Forms, Controls,
  6.      Menus, StdCtrls, Dialogs, Buttons, Messages, ExtCtrls,
  7.      ComCtrls,Registry,Analyze, ToolWin, ExtDlgs, Spin,dicom,JPEG,lsJPEG;
  8.              
  9. type
  10.   TMainForm = class(TForm)
  11.     MainMenu1 : TMainMenu;
  12.     FileMenu: TMenuItem;
  13.     FileOpenItem      : TMenuItem;
  14.     N1                : TMenuItem;
  15.     FileExitItem      : TMenuItem;
  16.     WindowMenu: TMenuItem;
  17.     WindowCascadeItem : TMenuItem;
  18.     WindowTileItem    : TMenuItem;
  19.     WindowArrangeItem : TMenuItem;
  20.     WindowMinimizeItem: TMenuItem;
  21.     HelpMenu: TMenuItem;
  22.     HelpAboutItem     : TMenuItem;
  23.     OpenDialog: TOpenDialog;
  24.     Opengraphic1: TMenuItem;
  25.     PGOpenDialog: TOpenDialog;
  26.     OpenAnz: TMenuItem;
  27.     ToolBar1: TToolBar;
  28.     WinCenEdit: TSpinEdit;
  29.     WinWidEdit: TSpinEdit;
  30.     SliceSlider: TTrackBar;
  31.     ApplyCon: TSpeedButton;
  32.     Autobal: TSpeedButton;
  33.     OpenECAT: TMenuItem;
  34.     PGSaveDialog: TSaveDialog;
  35.     SchemeDrop: TComboBox;
  36.     ApplyBright: TSpeedButton;
  37.     FileContrast: TSpeedButton;
  38.     StatusBar: TStatusBar;
  39.     BestFitItem: TMenuItem;
  40.     Print1: TMenuItem;
  41.     Exportaspicture1: TMenuItem;
  42.     Close1: TMenuItem;
  43.     ZoomSlider: TTrackBar;
  44.     AutoFitBtn: TSpeedButton;
  45.     Pct100btn: TSpeedButton;
  46.     HdrBtn: TSpeedButton;
  47.     MaximizeAll1: TMenuItem;
  48.     OpenRaw1: TMenuItem;
  49.     ConverttoDICOM1: TMenuItem;
  50.     Convertto1: TMenuItem;
  51.     ConvertMenu: TMenuItem;
  52.     Convertraw1: TMenuItem;
  53.     Convert2Ana: TMenuItem;
  54.     VideoBtn: TSpeedButton;
  55.     Hints1: TMenuItem;
  56.     PrintDialog1: TPrintDialog;
  57.     function AddMRU (lFilename: string): boolean;
  58.     procedure FormCreate(Sender: TObject);
  59.     procedure WindowCascadeItemClick(Sender: TObject);
  60.     procedure UpdateMenuItems(Sender: TObject);
  61.     procedure WindowTileItemClick(Sender: TObject);
  62.     procedure WindowArrangeItemClick(Sender: TObject);
  63.     procedure AppLaunch;
  64.     procedure FileOpenItemClick(Sender: TObject);
  65.     procedure FileExitItemClick(Sender: TObject);
  66.     procedure WindowMinimizeItemClick(Sender: TObject);
  67.     procedure FormDestroy(Sender: TObject);
  68.     procedure HelpAboutItemClick(Sender: TObject);
  69.     procedure Opengraphic1Click(Sender: TObject);
  70.     procedure SliceSliderChange(Sender: TObject);
  71.     procedure ColUpdate;
  72.     procedure SchemeDropChange(Sender: TObject);
  73.     procedure ApplyConClick(Sender: TObject);
  74.     procedure LoadDropFile (var lFilename: string);
  75.     procedure PrintImg;
  76.     procedure ConLabelClick;
  77.     procedure BestFitItemClick(Sender: TObject);
  78.     procedure FormResize(Sender: TObject);
  79.     procedure Print1Click(Sender: TObject);
  80.     procedure Exportaspicture1Click(Sender: TObject);
  81.     procedure Close1Click(Sender: TObject);
  82.     procedure GetRegistryData;
  83.     procedure PutRegistryData;
  84.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  85.     procedure ZoomSliderChange(Sender: TObject);
  86.     procedure Pct100btnClick(Sender: TObject);
  87.     procedure HdrBtnClick(Sender: TObject);
  88.     procedure AutoFitBtnClick(Sender: TObject);
  89.     procedure MaximizeAll1Click(Sender: TObject);
  90.     procedure HintBtnClick(Sender: TObject);
  91.     procedure OpenRaw1Click(Sender: TObject);
  92.     procedure Convertto1Click(Sender: TObject);
  93.     procedure WinCenEditKeyDown(Sender: TObject; var Key: Word;
  94.       Shift: TShiftState);
  95.     procedure VideoBtnClick(Sender: TObject);
  96.     procedure VideoBtnMouseDown(Sender: TObject; Button: TMouseButton;
  97.       Shift: TShiftState; X, Y: Integer);
  98.   private
  99.     { Private declarations }
  100.     procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
  101.     procedure CreateMDIChild(Name: string; lAnz,lECAT,l2dImage,lRaw: boolean);
  102.     procedure MRUClick (Sender: TOBject);
  103.     procedure UpdateMRUMenu;    { Public declarations }
  104.     function ConvertImg (lInName: string; lDICOMdata: DICOMdata; l3ForInterfile4ForAna: integer): boolean;
  105.  
  106.   end;
  107. var
  108.   MainForm: TMainForm;
  109.  
  110. implementation
  111. uses ChildWin, About,ShellAPI,printers, Raw;
  112. const
  113.   kMaxMRU = 8;
  114.   gMRUra: array [1..kMaxMRU] of string=('','','','','','','','');
  115.   knMenup1 = 11;
  116.   gKeyRoot: string = '\Software\ezDICOM';
  117. {$R *.DFM}
  118.  
  119. procedure TMAinForm.MRUClick (Sender: TOBject);
  120. var lFilename: string;
  121. begin;
  122.     lFileName := gMRUra[(Sender as TMenuItem).tag];
  123.     if AddMRU (lFileName) then
  124.        LoadDropFile (lFileName)
  125.     else showmessage('Unable to find the file '+OpenDialog.FileName);
  126. end;
  127. procedure TMAinForm.UpdateMRUMenu;
  128. var lF,lN: integer;
  129.   NewItem: TMenuItem;
  130. begin
  131.      lF := FileMenu.Count;
  132.      if lF > (knMenup1-1) then
  133.         for lN := lF downto knMenup1 do
  134.           FileMenu.Delete(lN-1);
  135.      lF := 0;
  136.      repeat
  137.            inc(lF);
  138.      until (lF = kMaxMRU) or (gMRUra[lF] = '');
  139.      if gMRUra[lF] = '' then
  140.         lF := lF - 1;
  141.      if lF = 0 then exit;
  142.      NewItem := TMenuItem.Create(Self);
  143.         NewItem.Caption := '-';
  144.         FileMenu.Add(NewItem);
  145.      for lN := 1 to lF do begin
  146.         NewItem := TMenuItem.Create(Self);
  147.         NewItem.Caption := gMRUra[lN];
  148.         NewItem.Tag := lN;
  149.         NewItem.Onclick := MRUClick;
  150.         FileMenu.Add(NewItem);
  151.     end;
  152. end;
  153. procedure TMainForm.WMDropFiles(var Msg: TWMDropFiles);
  154. var
  155. lInc: integer;
  156. lFileName: string;
  157.   CFileName: array[0..MAX_PATH] of Char;
  158. begin
  159.   try
  160.     lInc := 0;
  161.     while DragQueryFile(Msg.Drop, lInc, CFileName, MAX_PATH) > 0 do
  162.     begin
  163.          lFileName := CFileName;
  164.          if AddMRU (lFileName) then
  165.             LoadDropFile(lFileName);
  166.       Msg.Result := 0;
  167.       inc(lInc);
  168.     end;
  169.   finally
  170.     DragFinish(Msg.Drop);
  171.   end;
  172. end;
  173. (*procedure TMainForm.WMDropFiles(var Msg: TWMDropFiles);
  174. var
  175. lInc: integer;
  176.   CFileName: array[0..MAX_PATH] of Char;
  177. begin
  178.   try
  179.     if DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH) > 0 then
  180.     begin
  181.          OpenDialog.FileName := CFileName;
  182.          LoadDropFile;
  183.       Msg.Result := 0;
  184.     end;
  185.   finally
  186.     DragFinish(Msg.Drop);
  187.   end;
  188. end;
  189. *)
  190. procedure TMainForm.AppLaunch;
  191. var
  192. lStr: String;
  193. I: integer;
  194. begin
  195.   if (ParamCount > 0) then begin
  196.     I := 0;
  197.     repeat
  198.      lStr := '';
  199.      repeat
  200.         inc(I);
  201.         if I = 1 then
  202.             lStr := ParamStr(I)
  203.         else begin
  204.             if lStr <> '' then
  205.                lStr := lStr +' '+ ParamStr(I)
  206.             else
  207.                 lStr := ParamStr(I);
  208.         end;
  209.      until (I=ParamCount) or (fileexists(lStr));
  210.      if fileexists(lStr) then begin
  211.         LoadDropFile(lStr);
  212.      end
  213.      else ShowmEssage('Unable to find the file: *'+lStr+'*');
  214.     until I >= ParamCount;
  215.   end;{param count > 0}
  216.   {lStr := 'C:\TEST.DCM';
  217.   if fileexists(lStr) then
  218.      LoadDropFile(lStr); {}
  219.  
  220. end;
  221. function ParseFileName (lFilewExt:String): string;
  222. var
  223.    lLen,lInc: integer;
  224.    lName: String;
  225. begin
  226.     lName := '';
  227.      lLen := length(lFilewExt);
  228.     lInc := lLen+1;
  229.      if  lLen > 0 then
  230.        repeat
  231.               dec(lInc);
  232.         until (lFileWExt[lInc] = '.') or (lInc = 1);
  233.      if lInc > 1 then
  234.         for lLen := 1 to (lInc - 1) do
  235.             lName := lName + lFileWExt[lLen]
  236.      else
  237.          lName := lFilewExt; //no extension
  238.         ParseFileName := lName;
  239. end;
  240.  
  241. function TMainForm.AddMRU (lFilename: string): boolean;
  242. var
  243.     lI,lSlot: integer;
  244.     lAbort: boolean;
  245. begin
  246.   if not fileexists(lFilename) then begin
  247.       //showmessage('Unable to find the file '+ lHdrName);
  248.       lAbort := true;
  249.   end else
  250.       lAbort := false;{}
  251.   lSlot := 1;
  252.   for lI := 1 to kMaxMRU do begin
  253.       if (gMRUra[lI] <> '') and(gMRUra[lI] <> lFilename) and (lSlot <= kMaxMRU) then begin
  254.          gMRUra[lSlot] := gMRUra[lI];
  255.          inc(lSlot);
  256.       end;
  257.   end;
  258.   if lSlot < kMaxMRU then
  259.   for lI := lSLot to kMAxMRU do
  260.       gMRUra[lI] :='';
  261.   if lAbort then begin
  262.       UpdateMRUmenu;
  263.       result := false;
  264.       exit;
  265.   end;
  266.   result := true;
  267.   for lI := (kMAxMRU) downto 2 do
  268.       gMRUra[lI] :=gMRUra[lI-1];
  269.   gMRUra[1] := lFilename;
  270.   UpdateMRUMenu;
  271. end;
  272. procedure TMainForm.LoadDropFile (var lFilename: string);
  273. var lExt,lHDrName: string;
  274. lF: file of byte;
  275.     lI,lLen: integer;
  276. begin
  277.      lExt := ExtractFileExt(lFilename);
  278.      if length(lExt) > 0 then
  279.  
  280.         for lI := 1 to length(lExt) do
  281.             lExt[lI] := upcase(lExt[lI]);
  282.      if (lExt ='.BMP') or (lExt ='.JPG') then begin
  283.           PGOpenDialog.FileName := '';
  284.           PGOpenDialog.InitialDir := extractfiledir(lFilename);
  285.           CreateMDIChild(lFilename,false,false,true,false);
  286.           exit;
  287.      end;
  288. OpenDialog.InitialDir := extractfiledir(lFilename);
  289. if (lExt ='.IMG') or (lExt ='.HDR') then begin
  290.      lHdrName :=ExtractFilePath(lFilename)+ParseFileName(ExtractFileName(lFilename))+'.hdr';
  291.      if fileexists(lHdrName) then begin
  292.             AssignFile(lf, lFIlename);
  293.             Reset(lf);
  294.             lLen := filesize(lf);
  295.             closefile(lf);
  296.             if lLen=(348) then begin
  297.                CreateMDIChild(lHdrName,true,false,false,false);
  298.                exit;
  299.             end;
  300.      end;
  301. end; //try analyze format
  302. CreateMDIChild(lFilename,false,false,false,false);
  303. end;
  304.  
  305. procedure TMainForm.FormCreate(Sender: TObject);
  306.   var
  307.   lSearchRec: TSearchRec;
  308.   lB,lB2: byte;
  309. begin
  310.      {lB := 158;
  311.      lB2 := 47;
  312.      lB := lB+lB2;
  313.      showmessage(inttostr(lB));{}
  314.   DecimalSeparator := '.';
  315.   SchemeDrop.Items.Clear;
  316.   SchemeDrop.Items.Add('White & Black');
  317.   SchemeDrop.Items.Add('Black & White');
  318.   SchemeDrop.Items.Add('Hot Metal');
  319.   SchemeDrop.ItemIndex := 1;
  320.   //ZoomBox.itemindex := 1;
  321.   Screen.OnActiveFormChange := UpdateMenuItems;
  322.   DragAcceptFiles(Handle, True);
  323.   GetRegistryData;
  324.     if BestFitItem.checked then begin
  325.      ZoomSLider.enabled := false;
  326.      Pct100btn.enabled := false;
  327.   end else begin
  328.       ZoomSlider.enabled := true;
  329.       Pct100btn.enabled := true;
  330.   end;
  331.   if FindFirst(extractfilepath(paramstr(0))+'\*.lut', faAnyFile, lSearchRec) <> 0 then begin
  332.      FindClose(lSearchRec);
  333.      exit;
  334.   end;
  335.   SchemeDrop.Items.Add(ParseFileName(ExtractFileName(lSearchRec.Name)));
  336.   while (FindNext(lSearchRec) = 0)  do begin
  337.         SchemeDrop.Items.Add(ParseFileName(ExtractFileName(lSearchRec.Name)));
  338.   end;
  339.   FindClose(lSearchRec);
  340.   UpdateMenuItems(nil);
  341. end;
  342.  
  343. procedure TMainForm.CreateMDIChild(Name: string;lAnz,lECAT,l2dImage,lRaw: boolean);
  344. var
  345.   Child: TMDIChild;
  346. begin
  347.   LockWindowUpdate(MainForm.Handle);
  348.   Child := TMDIChild.Create( Application );
  349.   Child.Caption := Name;
  350.   if lRaw then begin
  351.       clear_dicom_data(Child.gDicomData);
  352.       Child.gDicomData.XYZdim[1] := RawForm.WidEdit.value;
  353.       Child.gDicomData.XYZdim[2] := RawForm.HtEdit.value;
  354.       Child.gDicomData.XYZdim[3] := RawForm.SliceEdit.value;
  355.       Child.gDicomData.XYZdim[4] := 1;
  356.       Child.gDicomData.ImageStart := RawForm.OffsetEdit.value;
  357.       if RawForm.LittleEndCheck.checked then
  358.          Child.gDicomData.little_endian := 1
  359.       else
  360.          Child.gDicomData.little_endian := 0;
  361.       Child.gDicomData.Allocbits_per_pixel := RawForm.BitsEdit.value;
  362.       Child.gDicomData.Storedbits_per_pixel := RawForm.BitsEdit.value;
  363.   end;
  364.   if NOT Child.LoadData( Name,lAnz,lECAT,l2dImage,lRaw ) then
  365.   begin
  366.       Child.free;
  367.     exit;
  368.   end;
  369.     TMDIChild(MainForm.ActiveMDIChild).LoadFileList;
  370.   LockWindowUpdate(0);
  371. end;
  372.  
  373. procedure TMainForm.FormDestroy(Sender: TObject);
  374. begin
  375.   Screen.OnActiveFormChange := nil;
  376.  
  377. end;
  378.  
  379. procedure TMainForm.UpdateMenuItems(Sender: TObject);
  380. begin
  381.   WindowCascadeItem.Enabled  := MDIChildCount > 0;
  382.   WindowTileItem.Enabled     := MDIChildCount > 0;
  383.   WindowArrangeItem.Enabled  := MDIChildCount > 0;
  384.   WindowMinimizeItem.Enabled := MDIChildCount > 0;
  385.   Print1.enabled := MDIChildCount > 0;
  386.   Exportaspicture1.enabled := MDIChildCount > 0;
  387.   Close1.enabled := MDIChildCount > 0;
  388.   ColUpdate;
  389.   //CycleWindowItem.Enabled := MDIChildCount > 1;
  390. end;
  391.  
  392. procedure TMainForm.FileOpenItemClick(Sender: TObject);
  393. var I,lLen,lTag : Integer;
  394. lF: file of byte;
  395. begin
  396.        lTag := (Sender as TMEnuItem).Tag;
  397.        if lTag = 1 then
  398.           OpenDialog.Filter := 'Analyze Header (*.hdr)|*.hdr'
  399.        {else
  400.            OpenDialog.Filter := 'Medical Image|*.*'};
  401.        if OpenDialog.Execute then  begin
  402.            for I:=0 to OpenDialog.Files.Count-1 do begin
  403.                if AddMRU (OpenDialog.Files[i]) then begin
  404.                   OpenDialog.InitialDir := extractfiledir(OpenDialog.Files[i]);
  405.                   Filemode := 0;
  406.                   AssignFile(lf,OpenDialog.Files[i]);
  407.                   Reset(lf);
  408.                   lLen := filesize(lf);
  409.                   closefile(lf);
  410.                   Filemode := 2;
  411.                   if lTag = 2 then //ecat
  412.                      CreateMDIChild(OpenDialog.Files[i],false,true,false,false)
  413.                   else if (lLen = 348) and (ExtractFileExt(OpenDialog.Filename)='.hdr') then
  414.                        CreateMDIChild(OpenDialog.Files[i],true,false,false,false)
  415.                   else
  416.                       CreateMDIChild(OpenDialog.Files[i],false,false,false,false);
  417.                end; //fileexists
  418.            end;
  419.     end;
  420.         //OpenDialog.Filter := 'Medical Image|*.*';
  421.         OpenDialog.Filter := 'Medical Image|*.*';
  422.         ConLabelClick;
  423. end;
  424.  
  425.  
  426. procedure TMainForm.FileExitItemClick(Sender: TObject);
  427. begin
  428.   Close;
  429. end;
  430.  
  431. procedure TMainForm.WindowCascadeItemClick(Sender: TObject);
  432. begin
  433.   Cascade;
  434.   //if (not BestFitItem.checked) or (MainForm.MDIChildCount = 0) then exit;
  435.   {for I :=  (MDIChildCount - 1) downto 0 do
  436.         MDIChildren[I].}
  437.         //AutoMaximise;
  438. end;
  439.  
  440. procedure TMainForm.WindowTileItemClick(Sender: TObject);
  441. begin
  442.   Tile;
  443. end;
  444.  
  445. procedure TMainForm.WindowArrangeItemClick(Sender: TObject);
  446. begin
  447.   ArrangeIcons;
  448. end;
  449.  
  450. procedure TMainForm.WindowMinimizeItemClick(Sender: TObject);
  451. var
  452.   I: Integer;
  453. begin
  454.   if MDIChildCount = 0 then exit;
  455.   for I := MDIChildCount - 1 downto 0 do
  456.     MDIChildren[I].WindowState := wsMinimized;
  457. end;
  458.  
  459. procedure TMainForm.HelpAboutItemClick(Sender: TObject);
  460. begin
  461.   AboutBox.ShowModal;
  462. end;
  463.  
  464. procedure TMainForm.Opengraphic1Click(Sender: TObject);
  465. var I: integer;
  466. begin
  467.      //PGOpenDialog1.filename := '';
  468.      //OpenDialog.Filter := 'Images (*.bmp;*.jpg)|*.bmp;*.jpg|Bitmaps (*.bmp)|*.bmp|JPEGs (*.jpg]|*.jpg';
  469.      //PGOpenDialog.Filter := GraphicFilter(TGraphic);
  470.      if PGOpenDialog.Execute then begin
  471.            for I:=0 to PGOpenDialog.Files.Count-1 do begin
  472.                if AddMRU (PGOpenDialog.Files[i]) then begin
  473.                   PGOpenDialog.InitialDir := extractfilepath(PGOpenDialog.Files[i]);
  474.                   PGSaveDialog.InitialDir := PGOpenDialog.InitialDir;
  475.                   //PGSaveDialog.FileName := extractfilename(PGOpenDialog.FileName);
  476.                   //PGOpenDialog.FileName := extractfilename(PGOpenDialog.FileName);
  477.                   CreateMDIChild(PGOpenDialog.Files[i],false,false,true,false);
  478.                end;
  479.            end; //for I..nfiles
  480.      end; //if execute
  481.      //OpenDialog.Filter :='Medical Image|*.*';
  482. end;
  483.  
  484. procedure TMainForm.SliceSliderChange(Sender: TObject);
  485. begin
  486.   if MDIChildCount = 0 then exit;
  487. //LockWindowUpdate(MainForm.Handle);
  488.      TMDIChild(MainForm.ActiveMDIChild).DisplayImage(false,false,SliceSlider.position,TMDIChild(MainForm.ActiveMDIChild).gWinWid,
  489.      TMDIChild(MainForm.ActiveMDIChild).gWinCen{WinWidEdit.value,WincenEdit.value});
  490.      conlabelclick;
  491. //LockWindowUpdate(0);
  492.  
  493. end;
  494. procedure TMainForm.ColUpdate;
  495. //var lVox: integer;
  496. begin
  497. if MainForm.MDIChildCount = 0 then begin
  498.      ApplyCon.enabled := false;
  499.      ApplyBright.enabled := false;
  500.      FileContrast.enabled := false;
  501.      AutoBal.enabled := false;
  502.      SchemeDrop.enabled:= false;
  503.      WinWidEdit.enabled := false;
  504.      WinCenEdit.enabled := false;
  505.      VideoBtn.Enabled := false;
  506.      SliceSlider.Enabled := false;
  507.    exit;
  508. end;
  509. (*StatusBar.Panels[1].text := inttostr(MainForm.MDIChildCount)+'x'+inttostr(random(255));
  510. if MainForm.MDIChildCount = 0 then begin
  511.      ApplyCon.visible := false;
  512.      ApplyBright.visible := false;
  513.      FileContrast.visible := false;
  514.      AutoBal.visible := false;
  515.      SchemeDrop.visible:= false;
  516.      WinWidEdit.visible := false;
  517.      WinCenEdit.visible := false;
  518.      exit;
  519. end; *)
  520.      //MainForm.ZoomBox.ItemIndex := TMDIChild(MainForm.ActiveMDIChild).gZoom;
  521. if TMDIChild(MainForm.ActiveMDIChild).Memo1.visible then
  522.    HdrBtn.Down := true
  523. else
  524.     HdrBtn.Down := false;
  525. if (not TMDIChild(MainForm.ActiveMDIChild).FDICOM ) or  (TMDIChild(MainForm.ActiveMDIChild).gDICOMdata.SamplesPerPixel > 1) or (TMDIChild(MainForm.ActiveMDIChild).gCustomPalette > 0) {or ((lVox > 7) and (lVox < 17)) }then begin
  526.      ApplyCon.enabled := false;
  527.      ApplyBright.enabled := false;
  528.      FileContrast.enabled := false;
  529.      AutoBal.enabled := false;
  530.      SchemeDrop.enabled:= false;
  531.      WinWidEdit.enabled := false;
  532.      WinCenEdit.enabled := false;
  533. end else begin
  534.       MainForm.SchemeDrop.ItemIndex := TMDIChild(MainForm.ActiveMDIChild).gScheme;
  535.       WinCenEdit.value := TMDIChild(MainForm.ActiveMDIChild).gWinCen;
  536.       WinWidEdit.value := TMDIChild(MainForm.ActiveMDIChild).gWinWid;
  537.       if (TMDIChild(MainForm.ActiveMDIChild).gDICOMdata.Allocbits_per_pixel < 9) then begin
  538.          FileCOntrast.enabled := false;
  539.          ApplyCon.enabled := false;
  540.          ApplyBright.enabled := false;
  541.          WinWidEdit.enabled := false;
  542.          WinCenEdit.enabled := false;
  543.       end else begin
  544.          if TMDIChild(MainForm.ActiveMDIChild).gDicomData.WindowWidth <> 0 then
  545.             FileCOntrast.enabled := true
  546.          else
  547.              FileCOntrast.enabled := false;
  548.          ApplyCon.enabled := true;
  549.          ApplyBright.enabled := true;
  550.          WinWidEdit.enabled := true;
  551.          WinCenEdit.enabled := true;
  552.       end;
  553.       AutoBal.enabled :=true;
  554.       SchemeDrop.enabled:= true;
  555.   end;
  556.   ConLabelClick;
  557.   //if TMDIChild(MainForm.ActiveMDIChild).gWinWid = 0 then   ConLabel.caption := '';
  558.  if (not TMDIChild(MainForm.ActiveMDIChild).FDICOM ) or(TMDIChild(MainForm.ActiveMDIChild).gDicomdata.XYZdim[3] < 2) then begin
  559.      SliceSlider.enabled := false;
  560.      VideoBtn.enabled := false;
  561.      //VideoBtn.down := false;
  562.       SliceSlider.position := 1;
  563.   end else begin
  564.       SliceSlider.enabled := true;
  565.      VideoBtn.caption := inttostr(TMDIChild(MainForm.ActiveMDIChild).gVideoSpeed);
  566.      VideoBtn.enabled := true;
  567.       SliceSlider.Max := TMDIChild(MainForm.ActiveMDIChild).gDICOMdata.XYZdim[3];
  568.       SliceSlider.position := TMDIChild(MainForm.ActiveMDIChild).gSlice;
  569.       //showmessage(inttostr(TMDIChild(MainForm.ActiveMDIChild).gSlice)+'.'+inttostr(SliceSlider.Max));
  570.   end;
  571.  
  572. end;
  573. procedure TMainForm.SchemeDropChange(Sender: TObject);
  574. var lStr: string;
  575. lSearchRec: TSearchRec;
  576. begin
  577. if MainForm.MDIChildCount = 0 then exit;
  578.      if SchemeDrop.ItemIndex > 2 then begin
  579.        lStr := extractfilepath(paramstr(0)){+'\'}+SchemeDrop.Items.Strings[SchemeDrop.ItemIndex]+'.lut';
  580.        if FindFirst(lStr, faAnyFile, lSearchRec) <> 0 then begin
  581.           SchemeDrop.ItemIndex := 0;
  582.           FindClose(lSearchRec);
  583.           exit;
  584.        end;
  585.        FindClose(lSearchRec);
  586.        TMDIChild(MainForm.ActiveMDIChild).LoadColorScheme(lStr,SchemeDrop.ItemIndex);
  587.      end else
  588.          TMDIChild(MainForm.ActiveMDIChild).LoadColorScheme('',SchemeDrop.ItemIndex);
  589.      TMDIChild(MainForm.ActiveMDIChild).UpdatePalette(true,0);
  590.      //TMDIChild(MainForm.ActiveMDIChild).DisplayImage(false,SliceSlider.position,WinWidEdit.value,WincenEdit.value,MainForm.SchemeDrop.itemindex);
  591.      //zap conlabelclick;
  592. end;
  593.  
  594. (*procedure TMainForm.ApplyConClick(Sender: TObject);
  595. //var lCen,lWid: integer;
  596. begin
  597. if MainForm.MDIChildCount = 0 then exit;
  598. case (sender as TSpeedButton).tag of
  599.      1: begin
  600.      WinWidEdit.value :=-1;
  601.  
  602.      end;
  603.      //TMDIChild(MainForm.ActiveMDIChild).DisplayImage(false,SliceSlider.position,0,0,SchemeDrop.itemindex);
  604.      2: begin
  605.      WinWidEdit.value :=(TMDIChild(MainForm.ActiveMDIChild).gDICOMdata.WindowWidth);
  606.      WinCenEdit.value :=(TMDIChild(MainForm.ActiveMDIChild).gDICOMdata.WindowCenter);
  607.      end;
  608.      {else begin
  609.           lWid := abs(WinWidEdit.value div 2);
  610.           lCen := WinCenEdit.value;
  611.      end;}
  612.      end;
  613.      TMDIChild(MainForm.ActiveMDIChild).RefreshZoom;
  614.      //TMDIChild(MainForm.ActiveMDIChild).DisplayImage(true,false,SliceSlider.position,WinWidEdit.value,WincenEdit.value);
  615.      ConLabelClick;
  616. end;*)
  617. procedure TMainForm.ApplyConClick(Sender: TObject);
  618. var lMin,Max,lWid,lCen: integer;
  619. begin
  620. if MainForm.MDIChildCount = 0 then exit;
  621. case (sender as TSpeedButton).tag of
  622.      1: begin
  623.      lMin := TMDIChild(MainForm.ActiveMDIChild).gImgMin;
  624.      lWid := TMDIChild(MainForm.ActiveMDIChild).gImgMax - lMin;
  625.      lCen := lMin + (lWid shr 1);
  626.      if TMDIChild(MainForm.ActiveMDIChild).gBuff16sz > 0 then
  627.          TMDIChild(MainForm.ActiveMDIChild).Scale16to8bit(lCen,lWid)
  628.      else begin
  629.      //TMDIChild(MainForm.ActiveMDIChild).gWinCen := lMin + (lWid shr 1);
  630.      TMDIChild(MainForm.ActiveMDIChild).gFastCen := lMin + (lWid shr 1);
  631.      //TMDIChild(MainForm.ActiveMDIChild).gWinWid :=lWid;
  632.      TMDIChild(MainForm.ActiveMDIChild).UpdatePalette(true,lWid);
  633.      end;
  634.      ConLabelClick;
  635.      exit;
  636. //showmessage('abba'+inttostr(TMDIChild(MainForm.ActiveMDIChild).gWinWid)+':'+inttostr(lWid));
  637. //showmessage(inttostr(lMin)+':'+inttostr(lWid));
  638.  
  639.      end;
  640.      //TMDIChild(MainForm.ActiveMDIChild).DisplayImage(false,SliceSlider.position,0,0,SchemeDrop.itemindex);
  641.      2: begin
  642.      WinWidEdit.value :=(TMDIChild(MainForm.ActiveMDIChild).gDICOMdata.WindowWidth);
  643.      WinCenEdit.value :=(TMDIChild(MainForm.ActiveMDIChild).gDICOMdata.WindowCenter);
  644.      TMDIChild(MainForm.ActiveMDIChild).gWinWid :=(TMDIChild(MainForm.ActiveMDIChild).gDICOMdata.WindowWidth);
  645.      TMDIChild(MainForm.ActiveMDIChild).gWinCen :=(TMDIChild(MainForm.ActiveMDIChild).gDICOMdata.WindowCenter);
  646.      end;
  647.      else begin
  648.           TMDIChild(MainForm.ActiveMDIChild).gWinWid :=WinWidEdit.value ;
  649.           TMDIChild(MainForm.ActiveMDIChild).gWinCen :=WinCenEdit.value ;
  650.      end;
  651.      end;
  652.      TMDIChild(MainForm.ActiveMDIChild).RefreshZoom;
  653.      //TMDIChild(MainForm.ActiveMDIChild).DisplayImage(true,false,SliceSlider.position,WinWidEdit.value,WincenEdit.value);
  654.      ConLabelClick;
  655. end;
  656. PROCEDURE PrintBitmap(Canvas:  TCanvas; DestRect:  TRect;  Bitmap:  TBitmap);
  657.   VAR
  658.     BitmapHeader:  pBitmapInfo;
  659.     BitmapImage :  POINTER;
  660.     HeaderSize  :  DWORD;    // Use DWORD for D3-D5 compatibility
  661.     ImageSize   :  DWORD;
  662. BEGIN
  663.   GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize);
  664.   GetMem(BitmapHeader, HeaderSize);
  665.   GetMem(BitmapImage,  ImageSize);
  666.   TRY
  667.     GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^);
  668.     StretchDIBits(Canvas.Handle,
  669.                   DestRect.Left, DestRect.Top,     // Destination Origin
  670.                   DestRect.Right  - DestRect.Left, // Destination Width
  671.                   DestRect.Bottom - DestRect.Top,  // Destination Height
  672.                   0, 0,                            // Source Origin
  673.                   Bitmap.Width, Bitmap.Height,     // Source Width & Height
  674.                   BitmapImage,
  675.                   TBitmapInfo(BitmapHeader^),
  676.                   DIB_RGB_COLORS,
  677.                   SRCCOPY)
  678.   FINALLY
  679.     FreeMem(BitmapHeader);
  680.     FreeMem(BitmapImage)
  681.   END
  682. END {PrintBitmap};
  683. procedure TMainForm.PrintImg;
  684. VAR
  685.   Bitmap             :  TBitmap;
  686.   liHt,liWid,iFromLeftMargin,iPrintedImageWidth,jDelta,jFromTopOfPage,jPrintedImageHeight:  INTEGER;
  687. begin
  688.   if MainForm.MDIChildCount = 0 then exit;
  689.   if not PrintDialog1.Execute then exit;
  690.   liHt := TMDIChild(MainForm.ActiveMDIChild).image.Picture.Height;
  691.   liWid := TMDIChild(MainForm.ActiveMDIChild).image.Picture.Width;
  692.   if (liHt = 0) or (liWid = 0) then exit;
  693.   Screen.Cursor := crHourGlass;
  694.   TRY
  695.     {if liHt >= liWid then
  696.         Printer.Orientation := poPortrait //image is taller than wide
  697.     else
  698.         Printer.Orientation := poLandscape; //image is wider than tall
  699.      }
  700.       Printer.BeginDoc;
  701.       Printer.Canvas.Font.Size := 12;
  702.       Printer.Canvas.Font.Name := 'Arial';
  703.       jDelta := Printer.Canvas.TextHeight('X');
  704.       //jFromTopOfPage := 3*jDelta;
  705.       //s := 'Image Title';
  706.       //Printer.Canvas.TextOut(CenterText(s), jFromTopOfPage, s);
  707.       // 5th line from top
  708.       jFromTopOfPage := 5*jDelta;
  709.  
  710.       // Image position and size
  711.       // 12% left and right margin
  712.       iFromLeftMargin    := MulDiv(Printer.PageWidth,12,100);  // 12%
  713.       if (liHt/liWid) > (Printer.PageHeight/Printer.PageWidth) then begin
  714.          //Paper HEIGHT is constrained aspect ration
  715.          // Set printed bitmap with to be 76% of paper HEIGHT
  716.          jPrintedImageHeight := MulDiv(Printer.PageHeight,76,100);  // 76%
  717.          // Set printed bitmap WIDTH to maintain aspect ratio
  718.          iPrintedImageWidth:= liWid*jPrintedImageHeight DIV liHt;
  719.          // maintain aspect ratio of bitmap
  720.       end else begin
  721.          //Paper WIDTH is constrained aspect ration
  722.         // Set printed bitmap with to be 76% of paper WIDTH
  723.            iPrintedImageWidth := MulDiv(Printer.PageWidth,76,100);  // 76%
  724.            // Set printed bitmap height to maintain aspect ratio
  725.            jPrintedImageHeight := liHt*iPrintedImageWidth DIV liWid;
  726.       end;
  727.       Bitmap := TBitmap.Create;
  728.       TRY
  729.         Bitmap.Width  := liWid;
  730.         Bitmap.Height := liHt;
  731.         Bitmap.PixelFormat := pf24bit;
  732.         // Convert JPEG to BMP
  733.         Bitmap.Canvas.Draw(0,0, TMDIChild(MainForm.ActiveMDIChild).image.Picture.Graphic);
  734.         PrintBitmap (Printer.Canvas,
  735.                     Rect(iFromLeftMargin, jFromTopOfPage,
  736.                         iFromLeftMargin + iPrintedImageWidth,
  737.                          jFromTopOfPage  + jPrintedImageHeight),
  738.                     Bitmap)
  739.       FINALLY
  740.         Bitmap.Free
  741.       END;
  742.     Printer.EndDoc;
  743.   FINALLY
  744.     Screen.Cursor := crDefault
  745.   END;
  746. end;
  747.  
  748. procedure TMainForm.ConLabelClick;
  749. //var lWid,lCen: integer;
  750. begin
  751.  
  752.   if (MainForm.MDIChildCount = 0) then exit;
  753.   StatusBar.Panels[1].text := inttostr(TMDIChild(MainForm.ActiveMDIChild).gZoomPct)+'%';
  754.   if TMDIChild(MainForm.ActiveMDIChild).gDICOMData.XYZdim[3] < 2 then
  755.      StatusBar.Panels[2].text := inttostr(TMDIChild(MainForm.ActiveMDIChild).gDICOMData.XYZdim[1])+'x'+inttostr(TMDIChild(MainForm.ActiveMDIChild).gDICOMData.XYZdim[2])
  756.   else
  757.      StatusBar.Panels[2].text := inttostr(TMDIChild(MainForm.ActiveMDIChild).gSlice)+'/'+ inttostr(TMDIChild(MainForm.ActiveMDIChild).gDICOMData.XYZdim[3])+' '+inttostr(TMDIChild(MainForm.ActiveMDIChild).gDICOMData.XYZdim[1])+'x'+inttostr(TMDIChild(MainForm.ActiveMDIChild).gDICOMData.XYZdim[2]);
  758.   if (TMDIChild(MainForm.ActiveMDIChild).gimgmin=0)and (TMDIChild(MainForm.ActiveMDIChild).gimgmax=0) then
  759.      StatusBar.Panels[3].text := ''
  760.   else
  761.       StatusBar.Panels[3].text := 'Image  Cen/Wid: '
  762.      +inttostr(TMDIChild(MainForm.ActiveMDIChild).gimgCen)+'/'+inttostr(TMDIChild(MainForm.ActiveMDIChild).gimgWid);
  763.  StatusBar.Panels[4].text := TMDIChild(MainForm.ActiveMDIChild).gContrastStr;
  764. end;
  765.  
  766. procedure TMainForm.BestFitItemClick(Sender: TObject);
  767. begin
  768.   BestFitItem.checked := not BestFitItem.checked;
  769.   AutoFitBtn.Down := BestFitItem.checked;
  770.   if BestFitItem.checked then begin
  771.      ZoomSLider.enabled := false;
  772.      Pct100btn.enabled := false;
  773.   end else begin
  774.       ZoomSlider.enabled := true;
  775.       Pct100btn.enabled := true;
  776.   end;
  777.   if MainForm.MDIChildCount = 0 then exit;
  778.   if BestFitItem.checked then
  779.      TMDIChild(MainForm.ActiveMDIChild).AutoMaximise;
  780. end;
  781.  
  782. procedure TMainForm.FormResize(Sender: TObject);
  783. begin
  784.   if (MainForm.MDIChildCount = 0) or (not BestFitItem.checked) then exit;
  785.   TMDIChild(MainForm.ActiveMDIChild).AutoMaximise; 
  786. end;
  787.  
  788. procedure TMainForm.Print1Click(Sender: TObject);
  789. begin
  790. PrintImg;
  791. end;
  792.  
  793. procedure TMainForm.Exportaspicture1Click(Sender: TObject);
  794. var
  795.    JPG : TJPEGImage;
  796.    BMP: TBitmap;
  797.    lExt: string;
  798.    lS: integer;
  799. begin
  800.      //TMDIChild(MainForm.ActiveMDIChild).Image = nil then exit;
  801.      if not MainForm.PGSaveDialog.Execute then exit;
  802.      PGOpenDialog.InitialDir := extractfilepath(PGSaveDialog.FileName);
  803.      PGSaveDialog.InitialDir := PGOpenDialog.InitialDir;
  804.      lExt := ExtractFileExt(MainForm.PGSaveDialog.FileName);
  805.      if length(lExt) > 0 then
  806.         for lS := 1 to length(lExt) do
  807.             lExt[lS] := upcase(lExt[lS]);
  808.      if ('.JPG'= lExt) or (lExt='.JPEG') then begin
  809.            JPG := TJPEGImage.Create;
  810.            TRY
  811.               JPG.CompressionQuality := 80;
  812.               //if TMDIChild(MainForm.ActiveMDIChild).FDICOM and TMDIChild(MainForm.ActiveMDIChild).gImgOK then
  813.               //TMDIChild(MainForm.ActiveMDIChild).DisplayImage(true,false,false,SliceSlider.position,WinWidEdit.value,WincenEdit.value{,MainForm.SchemeDrop.itemindex});
  814.               //JPG.Assign(TMDIChild(MainForm.ActiveMDIChild).Image.Picture.Bitmap);
  815.               //following code ensures color palette is saved
  816.               BMP := TBitmap.create;
  817.               try
  818.                  BMP.Height := TMDIChild(MainForm.ActiveMDIChild).image.Picture.Height;
  819.                  BMP.Width := TMDIChild(MainForm.ActiveMDIChild).image.Picture.Width;
  820.                  BMP.PixelFormat := pf24bit;
  821.                  BMP.Canvas.Draw(0,0, TMDIChild(MainForm.ActiveMDIChild).image.Picture.Graphic);
  822.                  JPG.Assign(BMP);
  823.               finally
  824.                         BMP.Free;
  825.               end;
  826.               JPG.SaveToFile(ChangeFileExt(MainForm.PGSaveDialog.FileName,'.jpg'));
  827.            FINALLY
  828.                JPG.Free
  829.            END;
  830.      end else
  831.       TMDIChild(MainForm.ActiveMDIChild).Image.Picture.Bitmap.SaveToFile( ChangeFileExt(MainForm.PGSaveDialog.FileName,'.bmp' ));
  832.      PGSaveDialog.Filename := '';   
  833. end;
  834.  
  835. procedure TMainForm.Close1Click(Sender: TObject);
  836. begin
  837. if MainForm.MDIChildCount = 0 then UpdateMenuItems(nil);
  838. TMDIChild(MainForm.ActiveMDIChild).close;
  839. end;
  840. procedure TMainForm.GetRegistryData;
  841.   var
  842.     reg: TRegistry;
  843.     lInc: integer;
  844.     lStr: STRING;
  845.   begin
  846.   reg := TRegistry.Create;
  847.   try
  848.     reg.RootKey := HKEY_CURRENT_USER;
  849.     if reg.OpenKey( gKeyRoot, true ) then begin
  850.       if reg.ValueExists( 'OpenDir' ) then
  851.         lStr := reg.ReadString( 'OpenDir' );
  852.       OpenDialog.InitialDir := lStr;
  853.       if reg.ValueExists( 'PixDir' ) then
  854.         lStr := reg.ReadString( 'PixDir' );
  855.       PGOpenDialog.InitialDir := lStr;
  856.       PGSaveDialog.InitialDir := lStr;
  857.       if reg.ValueExists( 'RawWid' ) then gRawWid := reg.ReadInteger('RawWid');
  858.       if reg.ValueExists( 'RawHt' ) then gRawHt := reg.ReadInteger('RawHt');
  859.       if reg.ValueExists( 'RawSlice' ) then gRawSlice := reg.ReadInteger('RawSlice');
  860.       if reg.ValueExists( 'RawOffset' ) then gRawOffset := reg.ReadInteger('RawOffset');
  861.       if reg.ValueExists( 'RawBits' ) then gRawBits := reg.ReadInteger('RawBits');
  862.       if reg.ValueExists( 'RawLittleEnd' ) then gRawLittleEnd := reg.ReadBool('RawLittleEnd');
  863.       if reg.ValueExists( 'Maximize' ) then
  864.         BestFitItem.checked := reg.ReadBool( 'Maximize' );
  865.       AutoFitBtn.Down := BestFitItem.checked;
  866.       for lInc := 1 to kMaxMRU do
  867.           if reg.ValueExists( 'MRU'+inttostr(lInc) ) then begin
  868.              lStr := reg.ReadString('MRU'+inttostr(lInc) );
  869.              if (length(lStr)>0)  {and (fileexistsex(lStr))} then begin
  870.                 gMRUra[lInc] := lStr;
  871.              end;
  872.           end;
  873.       end;
  874.   finally
  875.     reg.Free;
  876.     end;
  877.   UpdateMRUMenu;
  878.  
  879.   end;
  880.  
  881.   procedure TMainForm.PutRegistryData;
  882.   var
  883.     reg: TRegistry;
  884.     lInc: integer;
  885.   begin
  886.   reg := TRegistry.Create;
  887.   try
  888.     reg.RootKey := HKEY_CURRENT_USER;
  889.     if reg.OpenKey( gKeyRoot, true ) then
  890.       begin
  891.       reg.WriteString( 'OpenDir', OpenDialog.INitialDir );
  892.       reg.WriteString( 'PixDir', PGOpenDialog.InitialDir );
  893.       reg.WriteInteger('RawWid',gRawWid);
  894.       reg.WriteInteger('RawHt',gRawHt);
  895.       reg.WriteInteger('RawSlice',gRawSlice);
  896.       reg.WriteInteger('RawOffset',gRawOffset);
  897.       reg.WriteInteger('RawBits',gRawBits);
  898.       reg.WriteBool( 'RawLittleEnd',gRawLittleEnd);
  899.  
  900.       reg.WriteBool( 'Maximize',BestFitItem.checked );
  901.       for lInc := 1 to kMaxMRU do begin
  902.                 reg.WriteString( 'MRU'+inttostr(lInc), gMRUra[lInc] );
  903.       end;
  904.       reg.CloseKey;
  905.       end;
  906.   finally
  907.     reg.Free;
  908.     end;
  909.   end;
  910.  
  911. procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
  912. begin
  913. PutRegistryData;
  914. end;
  915.  
  916. procedure TMainForm.ZoomSliderChange(Sender: TObject);
  917. var lZoomPct:integer;
  918. begin
  919.      //gZoomSlider := true;
  920.      //lTMp := WindowmaximizeItem.checked;
  921.      //WindowmaximizeItem.checked := false;
  922.      if MainForm.MDIChildCount = 0 then exit;
  923.      lZoomPct := ZoomSlider.Position;
  924.      if TMDIChild(MainForm.ActiveMDIChild).gZoomPct = lZoomPct then exit;
  925.      TMDIChild(MainForm.ActiveMDIChild).gZoomPct := lZoomPct;
  926.      TMDIChild(MainForm.ActiveMDIChild).RefreshZoom;
  927. {     TMDIChild(MainForm.ActiveMDIChild).gZoomPct := lZoomPct;
  928.      TMDIChild(MainForm.ActiveMDIChild).image.Height:= round(TMDIChild(MainForm.ActiveMDIChild).image.Picture.Height * (lZoomPct/100));
  929.      TMDIChild(MainForm.ActiveMDIChild).image.Width := round(TMDIChild(MainForm.ActiveMDIChild).image.Picture.Width * (lZoomPct/100));
  930.      StatusBar.Panels[1].text := inttostr(TMDIChild(MainForm.ActiveMDIChild).gZoomPct)+'%';
  931.  }    //TMDIChild(MainForm.ActiveMDIChild).image.refresh;
  932.      //WindowmaximizeItem.checked := lTmp;
  933.      //gZoomSlider := false;
  934. end;
  935.  
  936. procedure TMainForm.Pct100btnClick(Sender: TObject);
  937. begin
  938.      ZoomSlider.Position := 100;
  939.      ZoomSliderChange(nil);
  940. end;
  941.  
  942. procedure TMainForm.HdrBtnClick(Sender: TObject);
  943. begin
  944.      if MainForm.MDIChildCount = 0 then exit;
  945.      //HdrBtn.Down := not HdrBtn.Down;
  946.      //if HdrBtn.Down then
  947.      TMDIChild(MainForm.ActiveMDIChild).Memo1.visible := HdrBtn.Down;
  948. end;
  949.  
  950. procedure TMainForm.AutoFitBtnClick(Sender: TObject);
  951. begin
  952.   BestFitItem.Click;
  953. end;
  954.  
  955. procedure TMainForm.MaximizeAll1Click(Sender: TObject);
  956. var I: integer;
  957. begin
  958.   if MainForm.MDIChildCount = 0 then exit;
  959.   for I :=  (MDIChildCount - 1) downto 0 do
  960.          MDIChildren[I].WindowState := wsMaximized;
  961.  {}
  962. end;
  963.  
  964. procedure TMainForm.HintBtnClick(Sender: TObject);
  965. begin
  966. Showmessage('You can drag the mouse over an image to change the view. '+kCR+
  967. ' Dragging changes the contrast.'+kCR+
  968. ' Alt+dragging pans the scrollbars.'+kCR+
  969. ' Shift+dragging magnifies the region under the mouse.'+kCR+
  970. ' Ctrl+dragging selects a region for contrast optimization.'+kCR+
  971. 'When multiple windows are open, use Ctrl+Tab to select an image.');
  972. end;
  973.  
  974. procedure TMainForm.OpenRaw1Click(Sender: TObject);
  975. var I: integer;
  976. lConv, lConvAny: boolean;
  977. lDICOMdata: DICOMdata;
  978. begin
  979.      //RawForm.WidEditChange(nil);
  980.      RawForm.showmodal;
  981.      if gRawOK = 0 then exit;  //cancel
  982.      if gRawOK > 1 then //user wants to convert file
  983.         showmessage('Note that ezDICOM does not same voxel size [mm] for converted raw files. If required, use MRIcro to convert files.');
  984.      lConvAny := false;
  985.      if OpenDialog.Execute then  begin
  986.            for I:=0 to OpenDialog.Files.Count-1 do begin
  987.                if Fileexists (OpenDialog.Files[i]) then begin //do NOT add to MRU!
  988.                   OpenDialog.InitialDir := extractfiledir(OpenDialog.Files[i]);
  989.                   if gRawOK = 1 then //view
  990.                      CreateMDIChild(OpenDialog.Files[i],false,false,false,true)
  991.                   else begin //convert raw to dicom or interfile
  992.                      clear_dicom_data(lDICOMdata);
  993.                      lDicomData.XYZdim[1] := RawForm.WidEdit.value;
  994.                      lDicomData.XYZdim[2] := RawForm.HtEdit.value;
  995.                      lDicomData.XYZdim[3] := RawForm.SliceEdit.value;
  996.                      lDicomData.XYZdim[4] := 1;
  997.                      lDicomData.ImageStart := RawForm.OffsetEdit.value;
  998.                      if RawForm.LittleEndCheck.checked then
  999.                         lDicomData.little_endian := 1
  1000.                      else
  1001.                          lDicomData.little_endian := 0;
  1002.                      lDicomData.Allocbits_per_pixel := RawForm.BitsEdit.value;
  1003.                      lDicomData.Storedbits_per_pixel := RawForm.BitsEdit.value;
  1004.                      lDicomData.ImageSz := ((lDicomData.XYZdim[1]* lDicomData.XYZdim[2]*lDicomData.Allocbits_per_pixel+7) div 8  )*lDicomData.XYZdim[3];
  1005.                      lConv := ConvertImg (OpenDialog.Files[i],lDICOMdata,gRawOK);
  1006.                      if lConv then lConvANy := true;
  1007.                   end; //convert raw
  1008.                end; //fileexists
  1009.            end;
  1010.     end;
  1011.         ConLabelClick;
  1012.         if lConvAny then begin
  1013.             showmessage('Converted images have been placed in the folder '+extractfilepath(OpenDialog.Filename));
  1014.         end;
  1015. end;
  1016. function TMainForm.ConvertImg (lInName: string; lDICOMdata: DICOMdata; l3ForInterfile4ForAna: integer): boolean;
  1017. var lOffset,lSliceSz,lOutHdrSz,lInc : Integer;
  1018. lHdrOK: boolean;
  1019. lOutHdr,lOutImg: String;
  1020. lF,lOutF: file of byte;
  1021. lBuff: bytep0;
  1022. begin
  1023.      result := false;
  1024.      lOffset := lDicomdata.ImageStart;
  1025.      lDicomData.ImageStart := 0;
  1026.      if l3ForInterfile4ForAna = 4 then begin //interfile
  1027.         lOutHdr := changefileext(lInname,'.hdr');
  1028.         lOutImg := changefileext(lInname,'.img');
  1029.      end else if l3ForInterfile4ForAna = 3 then begin //interfile
  1030.         lOutHdr := changefileext(lInname,'.i3h');
  1031.         lOutImg := changefileext(lInname,'.i3i');
  1032.      end else begin //tag <> interfile
  1033.          lOutHdr := changefileext(lInName,'.dcm');
  1034.          lOutImg := lOutHdr;
  1035.      end; //save DCM
  1036.      if fileexists(lOutHdr) then showmessage ('The file '+lOutHdr+' already exists.')
  1037.      else if fileexists(lOutImg) then showmessage ('The file '+lOutImg+' already exists.')
  1038.      else begin  //file does not exist
  1039.           lOutHdrSz := 0;
  1040.           lHdrOK := true;
  1041.           if l3ForInterfile4ForAna = 4 then
  1042.              lHdrOK := SaveAnalyzeHdr (lOutHdr, lDicomData)
  1043.              //write_interfile_hdr (lOutHdr,lOutImg, lDICOMdata)
  1044.           else if l3ForInterfile4ForAna = 3 then
  1045.              write_interfile_hdr (lOutHdr,lOutImg, lDICOMdata)
  1046.           else
  1047.               write_dicom (lOutHdr,lDICOMdata,lOutHdrSz, true);
  1048.           if (lDICOMdata.XYZdim[3] > 0) and (lHdrOK) then begin
  1049.              result := true;
  1050.              lSliceSz :=  (lDICOMdata.XYZdim[1]*lDICOMdata.XYZdim[2]{height * width} * lDICOMdata.Allocbits_per_pixel+7) div 8 ;
  1051.              AssignFile(lF,lInName);
  1052.              reset(lF);
  1053.              if ((lSliceSz * lDICOMdata.XYZdim[3])+lOffset) > filesize(lf) then begin
  1054.                 showmessage('The input file is too small. Unable to convert data.');
  1055.                 closefile(lf);
  1056.                 exit;
  1057.              end;
  1058.              GetMem( lBuff, lSliceSz);
  1059.              Seek(lF,lOffset);
  1060.              AssignFile(lOutF, lOutImg);
  1061.              if lOutHdrSz = 0 then
  1062.                 Rewrite(lOutF)
  1063.              else begin
  1064.                   Reset(lOutF);
  1065.                   Seek(lOutF,lOutHdrSz);
  1066.              end; //hdrsz
  1067.              for lInc := 1 to lDICOMdata.XYZdim[3] do begin
  1068.                  BlockRead(lF, lBuff^, lSliceSz);
  1069.                  BlockWrite(lOutF, lBuff^, lSliceSz);
  1070.              end; //for each slice
  1071.              CloseFile(lF);
  1072.              closeFile(lOutF);
  1073.           end; //if > 0 slices
  1074.      end; //filenames are unique
  1075. end;
  1076.  
  1077. procedure TMainForm.Convertto1Click(Sender: TObject);
  1078. var I,lLen,lTag : Integer;
  1079. lHdrOK,lImgOK,lConv,lConvAny: boolean;
  1080. lDICOMdata: DICOMdata;
  1081. lFileName{,lOutHdr,lOutImg},lDynStr: String;
  1082. lF: file of byte;
  1083. (*//FileSnooper => compares bytes of two files for differences
  1084. lF2: file of byte;
  1085. lBuff,lBuff2: bytep;
  1086. lStart,lEnd,lPos,lSz: integer; (**)
  1087. begin
  1088. (*//FileSnooper => compares bytes of two files for differences
  1089.      lStart := 0;
  1090.      lEnd := 2000;
  1091.      lSz :=  lEnd-lStart+1;
  1092.      AssignFile(lF,'C:\abba1.mr');
  1093.      reset(lF);
  1094.      GetMem( lBuff,lSz );
  1095.      Seek(lF,lStart);
  1096.      BlockRead(lF, lBuff^, lSz);
  1097.      CloseFile(lF);
  1098.  
  1099.      //start single file snoop
  1100.      for lPos := 1 to lEnd do
  1101.          if (lBuff[lPos] =$72) and( lBuff[lPos-1]=$FF) then
  1102.             showmessage(inttostr(lPos+lStart-1)+'abba:'+inttostr(lBuff[lPos]) +'/'+inttostr(lBuff2[lPos]));
  1103.             //showmessage(inttostr(lPos+lStart-1)+'abba:'+chr(lBuff[lPos]) +'/'+chr(lBuff2[lPos]));
  1104.  
  1105.  
  1106.      FreeMem( lBuff);
  1107.      exit; {end single file snoop}
  1108.  
  1109.  
  1110.      AssignFile(lF2,'C:\abba2.mr');
  1111.      reset(lF2);
  1112.      GetMem( lBuff2, lSz);
  1113.      Seek(lF2,lStart);
  1114.      BlockRead(lF2, lBuff2^, lSz);
  1115.      CloseFile(lF2);
  1116.  
  1117.      for lPos := 1 to lEnd do
  1118.          if (lBuff[lPos] =1) and ( lBuff2[lPos]=2) then
  1119.             showmessage(inttostr(lPos+lStart-1)+'abba:'+inttostr(lBuff[lPos]) +'/'+inttostr(lBuff2[lPos]));
  1120.             //showmessage(inttostr(lPos+lStart-1)+'abba:'+chr(lBuff[lPos]) +'/'+chr(lBuff2[lPos]));
  1121.      FreeMem( lBuff2);
  1122.      FreeMem( lBuff);
  1123.      exit;(**)
  1124.        lTag := (Sender as TMEnuItem).Tag;
  1125.        lConv := false;
  1126.        lConvAny := false;
  1127.        if OpenDialog.Execute then  begin
  1128.            for I:=0 to OpenDialog.Files.Count-1 do begin
  1129.                if AddMRU (OpenDialog.Files[i]) then begin
  1130.                   OpenDialog.InitialDir := extractfiledir(OpenDialog.Files[i]);
  1131.                   Filemode := 0;
  1132.                   AssignFile(lf,OpenDialog.Files[i]);
  1133.                   Reset(lf);
  1134.                   lLen := filesize(lf);
  1135.                   closefile(lf);
  1136.                   Filemode := 2;
  1137.                   lFileName :=  OpenDialog.Files[i];
  1138.                   if (lLen = 348) then
  1139.                        OpenAnalyze (lHdrOK,lImgOK,lDynStr,lFileName,lDicomData)
  1140.                   else
  1141.                        read_dicom_data(false,false,true,false,true,true,true, lDICOMdata, lHdrOK, lImgOK, lDynStr,lFileName );
  1142.                   if (not lImgOK) or (not lHdrOK) or (lDICOMdata.RunLengthEncoding) or(lDICOMdata.ElscintCompress) or(lDICOMdata.JPEGlosslessCpt) or (lDICOMdata.JPEGlossyCpt)  or(lDICOMdata.GenesisCpt) or (lDICOMdata.GenesisPackHdr<> 0) then begin
  1143.                      Showmessage('Unable to convert compressed image data: try using MRIcro.');
  1144.                   end else begin
  1145.                       if FileExists(lFileName) then
  1146.                          lConv := ConvertImg(lFileName, lDICOMdata,lTag);
  1147.                       if lConv then lConvAny := true;
  1148.                   end;
  1149.                end; //fileexists
  1150.            end;
  1151.     end;
  1152.         ConLabelClick;
  1153.         if lConvAny then begin
  1154.             showmessage('Converted images have been placed in the folder '+extractfilepath(OpenDialog.Filename));
  1155.         end;
  1156. end;
  1157.  
  1158. procedure TMainForm.WinCenEditKeyDown(Sender: TObject; var Key: Word;
  1159.   Shift: TShiftState);
  1160. begin
  1161. if MainForm.MDIChildCount = 0 then exit;
  1162. //if (ssShift in Shift) then StatusBar.Panels[1].text := inttostr(random(1024));
  1163. if key = 13 then
  1164.    ApplyCon.Click;
  1165. end;
  1166.  
  1167. procedure TMainForm.VideoBtnClick(Sender: TObject);
  1168. //var lSpeed: integer;
  1169. begin
  1170. (*  if MainForm.MDIChildCount > 0 then begin
  1171.      lSpeed := TMDIChild(MainForm.ActiveMDIChild).gvideospeed;
  1172.      if lSpeed > 4 then
  1173.         lSpeed := 0
  1174.      else
  1175.          inc(lSpeed);
  1176.      TMDIChild(MainForm.ActiveMDIChild).gMultiRow := 1;
  1177.      TMDIChild(MainForm.ActiveMDIChild).gMultiCol := 1;
  1178.      TMDIChild(MainForm.ActiveMDIChild).gVideoSpeed := lSpeed;
  1179.      if lSpeed > 0 then begin
  1180.         TMDIChild(MainForm.ActiveMDIChild).Timer1.Interval := 100 * lSpeed;
  1181.         TMDIChild(MainForm.ActiveMDIChild).Timer1.enabled := true;
  1182.      end else
  1183.         TMDIChild(MainForm.ActiveMDIChild).Timer1.enabled := false;
  1184.      VideoBtn.Caption := inttostr(lSpeed);
  1185.   end;*)
  1186. end;
  1187.  
  1188. procedure TMainForm.VideoBtnMouseDown(Sender: TObject;
  1189.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  1190. var lSpeed: integer;
  1191. begin
  1192.   if MainForm.MDIChildCount > 0 then begin
  1193.      lSpeed := TMDIChild(MainForm.ActiveMDIChild).gvideospeed;
  1194.      if Button = mbLeft then begin
  1195.         if lSpeed > 4 then
  1196.            lSpeed := 0
  1197.         else
  1198.          inc(lSpeed);
  1199.      end else begin
  1200.          if lSpeed < 1 then
  1201.             lSpeed := 5
  1202.          else
  1203.              dec(lSpeed);
  1204.      end;
  1205.      TMDIChild(MainForm.ActiveMDIChild).gMultiRow := 1;
  1206.      TMDIChild(MainForm.ActiveMDIChild).gMultiCol := 1;
  1207.      TMDIChild(MainForm.ActiveMDIChild).gVideoSpeed := lSpeed;
  1208.      if lSpeed > 0 then begin
  1209.         TMDIChild(MainForm.ActiveMDIChild).Timer1.Interval := 100 * lSpeed;
  1210.         TMDIChild(MainForm.ActiveMDIChild).Timer1.enabled := true;
  1211.      end else
  1212.         TMDIChild(MainForm.ActiveMDIChild).Timer1.enabled := false;
  1213.      VideoBtn.Caption := inttostr(lSpeed);
  1214.   end;
  1215. end;
  1216.  
  1217. end.
  1218.