diff --git a/tim2view.dproj b/tim2view.dproj index f6923bc..fd6644d 100644 --- a/tim2view.dproj +++ b/tim2view.dproj @@ -83,8 +83,8 @@ false 3 true - CompanyName=;FileDescription=;FileVersion=1.0.0.492;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - 492 + CompanyName=;FileDescription=;FileVersion=1.0.0.504;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + 504 $(BDS)\bin\default_app.manifest false true diff --git a/units/uCommon.pas b/units/uCommon.pas index c9c721e..effa6b8 100644 --- a/units/uCommon.pas +++ b/units/uCommon.pas @@ -30,7 +30,7 @@ function GetStartDir: string; function GetFileSizeAPI(const FileName: string): Int64; function CheckFileExists(const FileName: string): boolean; // function cHex2Int( const Value : string) : Integer; -function ExtractFileNameWOext(const Path: string): string; +function ExtractJustName(const Path: string): string; procedure Text2Clipboard(const S: string); function Min(A, B: Integer): Integer; function Max(A, B: Integer): Integer; @@ -61,7 +61,7 @@ begin Clipboard.AsText := S; end; -function ExtractFileNameWOext(const Path: string): string; +function ExtractJustName(const Path: string): string; begin Result := ExtractFileName(Path); Result := Copy(Result, 1, Length(Result) - Length(ExtractFileExt(Result))); diff --git a/units/uMain.dfm b/units/uMain.dfm index 8996607..8fe4971 100644 --- a/units/uMain.dfm +++ b/units/uMain.dfm @@ -20,8 +20,8 @@ object frmMain: TfrmMain TextHeight = 13 object pnlStatus: TPanel Left = 0 - Top = 502 - Width = 738 + Top = 515 + Width = 746 Height = 30 Align = alBottom BevelOuter = bvLowered @@ -29,17 +29,17 @@ object frmMain: TfrmMain object lblStatus: TLabel Left = 76 Top = 1 - Width = 157 + Width = 165 Height = 28 Align = alClient Alignment = taRightJustify Layout = tlCenter - ExplicitLeft = 230 + ExplicitLeft = 238 ExplicitWidth = 3 ExplicitHeight = 13 end object pbProgress: TProgressBar - Left = 233 + Left = 241 Top = 1 Width = 504 Height = 28 @@ -63,7 +63,7 @@ object frmMain: TfrmMain object cbbFiles: TComboBox Left = 0 Top = 0 - Width = 738 + Width = 746 Height = 21 Align = alTop AutoDropDown = True @@ -77,23 +77,24 @@ object frmMain: TfrmMain object pnlMain: TPanel Left = 0 Top = 21 - Width = 738 - Height = 481 + Width = 746 + Height = 494 Align = alClient BevelOuter = bvNone TabOrder = 1 object splMain: TSplitter Left = 233 Top = 0 - Height = 481 + Height = 494 ResizeStyle = rsUpdate ExplicitLeft = 201 + ExplicitHeight = 481 end object pnlList: TPanel Left = 0 Top = 0 Width = 233 - Height = 481 + Height = 494 Align = alLeft BevelOuter = bvNone TabOrder = 0 @@ -101,7 +102,7 @@ object frmMain: TfrmMain Left = 0 Top = 0 Width = 233 - Height = 481 + Height = 494 Align = alClient Columns = < item @@ -118,6 +119,7 @@ object frmMain: TfrmMain end> ColumnClick = False DoubleBuffered = True + Enabled = False GridLines = True HideSelection = False OwnerData = True @@ -130,33 +132,36 @@ object frmMain: TfrmMain OnClick = lvListClick OnData = lvListData OnSelectItem = lvListSelectItem + ExplicitLeft = -2 + ExplicitTop = -5 end end object pnlImage: TPanel Left = 236 Top = 0 - Width = 502 - Height = 481 + Width = 510 + Height = 494 Align = alClient BevelOuter = bvLowered TabOrder = 1 object splImageClut: TSplitter Left = 1 Top = 1 - Width = 500 + Width = 508 Height = 3 Cursor = crVSplit Align = alTop Beveled = True ResizeStyle = rsUpdate ExplicitTop = 274 + ExplicitWidth = 500 end object pbTim: TImage AlignWithMargins = True Left = 4 Top = 7 - Width = 494 - Height = 290 + Width = 502 + Height = 303 Align = alClient Center = True IncrementalDisplay = True @@ -169,8 +174,8 @@ object frmMain: TfrmMain end object grdCurrClut: TDrawGrid Left = 1 - Top = 330 - Width = 500 + Top = 343 + Width = 508 Height = 150 Align = alBottom ColCount = 1 @@ -190,8 +195,8 @@ object frmMain: TfrmMain end object pnlImageOptions: TPanel Left = 1 - Top = 300 - Width = 500 + Top = 313 + Width = 508 Height = 30 Align = alBottom BevelOuter = bvLowered @@ -206,6 +211,7 @@ object frmMain: TfrmMain AutoDropDown = True AutoCloseUp = True Style = csDropDownList + Enabled = False TabOrder = 0 OnChange = cbbCLUTChange end @@ -217,6 +223,7 @@ object frmMain: TfrmMain Height = 21 Align = alLeft Style = csDropDownList + Enabled = False ItemIndex = 0 TabOrder = 1 Text = 'Full transparence' @@ -235,6 +242,7 @@ object frmMain: TfrmMain Height = 21 Align = alLeft Style = csDropDownList + Enabled = False ItemIndex = 0 TabOrder = 2 Text = 'Real' @@ -245,16 +253,16 @@ object frmMain: TfrmMain '8 BPP' '16 BPP' '24 BPP') - ExplicitTop = 3 end object chkStretch: TCheckBox AlignWithMargins = True Left = 407 Top = 4 - Width = 89 + Width = 97 Height = 22 Action = actStretch Align = alClient + Enabled = False TabOrder = 3 end end diff --git a/units/uMain.pas b/units/uMain.pas index 2f7a0db..5e4e2a3 100644 --- a/units/uMain.pas +++ b/units/uMain.pas @@ -118,6 +118,7 @@ type LastDir: string; WaitThread: TEventWaitThread; + function ScanRes: TScanResult; procedure SetListCount(Count: Integer); procedure ScanFinished(Sender: TObject); function CheckForFileOpened(const FileName: string): boolean; @@ -125,16 +126,11 @@ type procedure ScanPath(const Path: string); procedure ScanFile(const FileName: string); procedure ScanDirectory(const Directory: string); - function CurrentFileName: string; - function CurrentTimPos(Index: Integer): Integer; - function CurrentTimSize(Index: Integer): Integer; - function CurrentTimBitMode(Index: Integer): Byte; - function CurrentTimWidth(Index: Integer): Word; - function CurrentTimHeight(Index: Integer): Word; - function CurrentFileIsImage: boolean; - function CurrentTIM(NewBitMode: Integer = $FF): PTIM; - function CurrentTIMName(Index: Integer): string; - procedure DrawCurrentTIM; + function ListIdx: Integer; + function TimIdx(Index: Integer): TScanTim; + function SelTim(NewBitMode: Integer = $FF): PTIM; + function SelTimName: string; + procedure DrawSelTim; procedure DrawCurrentCLUT; procedure UpdateCLUTInfo; procedure SetCLUTListToNoCLUT; @@ -271,7 +267,7 @@ end; procedure TfrmMain.actCloseFileExecute(Sender: TObject); begin - ScanResult[cbbFiles.ItemIndex].Free; + ScanRes.Free; ScanResult.Delete(cbbFiles.ItemIndex); lvList.Items.BeginUpdate; lvList.Items.Count := 0; @@ -280,7 +276,7 @@ begin actTimInfo.Enabled := False; actTimInfo.Caption := 'TIM Info'; lvList.Column[0].Caption := '# / 0'; - DrawCurrentTIM; + DrawSelTim; DrawCurrentCLUT; cbbCLUT.Items.BeginUpdate; @@ -293,9 +289,13 @@ begin cbbFiles.Items.Delete(cbbFiles.ItemIndex); cbbFiles.Items.EndUpdate; - cbbFiles.Enabled := cbbFiles.Items.Count <> 0; - CheckButtonsAndMainMenu; + + if cbbFiles.Enabled then + begin + cbbFiles.ItemIndex := cbbFiles.Items.Count - 1; + cbbFilesChange(Self); + end; end; procedure TfrmMain.actCloseFilesExecute(Sender: TObject); @@ -322,17 +322,17 @@ var begin lblStatus.Caption := sStatusBarTimsExtracting; - FName := ScanResult[cbbFiles.ItemIndex].ScanFile; - IsImage := ScanResult[cbbFiles.ItemIndex].IsImage; + FName := ScanRes.ScanFile; + IsImage := ScanRes.IsImage; - for I := 1 to ScanResult[cbbFiles.ItemIndex].Count do + for I := 1 to ScanRes.Count do begin - ScanTim := ScanResult[cbbFiles.ItemIndex].ScanTim[I - 1]; + ScanTim := TimIdx(I - 1); OFFSET := ScanTim.Position; SIZE := ScanTim.Size; BIT_MODE := ScanTim.BitMode; - TIM_NAME := Format(cAutoExtractionTimFormat, [ExtractFileNameWOext(FName), I, BIT_MODE]); + TIM_NAME := Format(cAutoExtractionTimFormat, [ExtractJustName(FName), I, BIT_MODE]); Path := IncludeTrailingPathDelimiter(GetStartDir + cExtractedTimsDir); CreateDir(Path); @@ -351,11 +351,11 @@ procedure TfrmMain.actExtractTimExecute(Sender: TObject); var TIM: PTIM; begin - dlgSaveTIM.FileName := CurrentTIMName(lvList.Selected.Index); + dlgSaveTIM.FileName := SelTimName; if not dlgSaveTIM.Execute then Exit; - TIM := CurrentTIM; + TIM := SelTim; SaveTimToFile(dlgSaveTIM.FileName, TIM); FreeTIM(TIM); end; @@ -376,7 +376,7 @@ begin if GetFileSizeAPI(dlgOpenFile.FileName) > cTIMMaxSize then Exit; - ReplaceTimInFile(CurrentFileName, dlgOpenFile.FileName, CurrentTimPos(lvList.Selected.Index), CurrentFileIsImage); + ReplaceTimInFile(ScanRes.ScanFile, dlgOpenFile.FileName, TimIdx(ListIdx).Position, ScanRes.IsImage); lvListClick(Self); MessageBeep(MB_ICONINFORMATION); end; @@ -405,14 +405,14 @@ end; procedure TfrmMain.actStretchExecute(Sender: TObject); begin - DrawCurrentTIM; + DrawSelTim; end; procedure TfrmMain.actTim2PngExecute(Sender: TObject); var FName: string; begin - FName := CurrentTIMName(lvList.Selected.Index); + FName := SelTimName; FName := ChangeFileExt(FName, '.png'); dlgSavePNG.FileName := FName; @@ -432,8 +432,8 @@ var begin if actTimInfo.Enabled then begin - Index := lvList.Selected.Index; - TIM := CurrentTIM; + Index := ListIdx; + TIM := SelTim; if TIMIsGood(TIM) then IsGoodTIM := 'YES' @@ -445,7 +445,7 @@ begin + Tab + '%s' + Row + Row + 'HEADER INFO' + Row + 'Version:' + Tab + '%d' + Row + 'BPP:' + Tab + '%d' - + Row + Row, [CurrentTIMName(Index), Index + 1, CurrentTimPos(Index), + + Row + Row, [SelTimName, Index + 1, TimIdx(Index).Position, BppToBitMode(TIM), IsGoodTIM, GetTimVersion(TIM), GetTimBPP(TIM)]); @@ -487,77 +487,81 @@ end; procedure TfrmMain.cbbFilesChange(Sender: TObject); begin - lvList.Items.Count := ScanResult[cbbFiles.ItemIndex].Count; + lvList.Items.Count := ScanRes.Count; lvList.Column[0].Caption := Format('# / %d', [lvList.Items.Count]); lvList.Invalidate; - lvListClick(Self); + lvList.Items[0].Selected := True; + lvList.Items[0].Focused := True; + lvList.SetFocus; end; procedure TfrmMain.cbbTransparenceModeChange(Sender: TObject); begin - DrawCurrentTIM; + DrawSelTim; end; procedure TfrmMain.cbbBitModeChange(Sender: TObject); begin - DrawCurrentTIM; + DrawSelTim; end; procedure TfrmMain.cbbCLUTChange(Sender: TObject); begin - DrawCurrentTIM; + DrawSelTim; DrawCurrentCLUT; end; function TfrmMain.CheckForFileOpened(const FileName: string): boolean; +var + I: Integer; begin - Result := (cbbFiles.Items.IndexOf(ExtractFileName(FileName)) <> -1); + Result := False; + + for I := 1 to ScanResult.Count do + if ExtractFileName(ScanResult[I - 1].ScanFile) = ExtractFileName(FileName) then + begin + Result := True; + Exit; + end; end; procedure TfrmMain.CheckButtonsAndMainMenu; begin - actCloseFile.Enabled := (cbbFiles.Items.Count <> 0); - actCloseFiles.Enabled := (cbbFiles.Items.Count <> 0); - actTim2Png.Enabled := (PNG^ <> nil); + cbbFiles.Enabled := (cbbFiles.Items.Count <> 0); + + lvList.Enabled := cbbFiles.Enabled; + actExtractList.Enabled := cbbFiles.Enabled; + actCloseFile.Enabled := cbbFiles.Enabled; + actCloseFiles.Enabled := cbbFiles.Enabled; actReplaceTim.Enabled := (lvList.SelCount = 1); - actExtractTim.Enabled := (lvList.SelCount = 1); + actTim2Png.Enabled := (PNG^ <> nil) and actReplaceTim.Enabled; + actExtractTim.Enabled := actReplaceTim.Enabled; + + cbbCLUT.Enabled := actReplaceTim.Enabled; + cbbTransparenceMode.Enabled := actReplaceTim.Enabled; + cbbBitMode.Enabled := actReplaceTim.Enabled; + chkStretch.Enabled := actReplaceTim.Enabled; end; -function TfrmMain.CurrentTIM(NewBitMode: Integer = $FF): PTIM; +function TfrmMain.SelTIM(NewBitMode: Integer = $FF): PTIM; var - OFFSET, SIZE: Integer; + P: Integer; begin Result := nil; if lvList.Selected = nil then Exit; - OFFSET := CurrentTimPos(lvList.Selected.Index); - SIZE := CurrentTimSize(lvList.Selected.Index); - Result := LoadTimFromFile(CurrentFileName, OFFSET, CurrentFileIsImage, SIZE); + P := TimIdx(ListIdx).Position; + Result := LoadTimFromFile(ScanRes.ScanFile, P, ScanRes.IsImage, TimIdx(ListIdx).Size); if NewBitMode = $FF then Exit; Result^.HEAD^.bBPP := NewBitMode; end; -function TfrmMain.CurrentTimBitMode(Index: Integer): Byte; +function TfrmMain.SelTimName: string; begin - Result := ScanResult[cbbFiles.ItemIndex].ScanTim[Index].BitMode; -end; - -function TfrmMain.CurrentTimHeight(Index: Integer): Word; -begin - Result := ScanResult[cbbFiles.ItemIndex].ScanTim[Index].Height; -end; - -function TfrmMain.CurrentTIMName(Index: Integer): string; -begin - Result := Format(cAutoExtractionTimFormat, [ExtractFileNameWOext(CurrentFileName), Index + 1, CurrentTimBitMode(Index)]); -end; - -function TfrmMain.CurrentTimWidth(Index: Integer): Word; -begin - Result := ScanResult[cbbFiles.ItemIndex].ScanTim[Index].Width; + Result := Format(cAutoExtractionTimFormat, [ExtractJustName(ScanRes.ScanFile), ListIdx + 1, TimIdx(ListIdx).BitMode]); end; procedure TfrmMain.DrawCurrentCLUT; @@ -566,7 +570,7 @@ var begin ClearGrid(@grdCurrCLUT); - TIM := CurrentTIM; + TIM := SelTim; if TIM = nil then begin grdCurrCLUT.ColCount := 1; @@ -587,7 +591,7 @@ begin FreeTIM(TIM); end; -procedure TfrmMain.DrawCurrentTIM; +procedure TfrmMain.DrawSelTim; var TIM: PTIM; Index: Integer; @@ -604,7 +608,7 @@ begin mode := $FF; end; - TIM := CurrentTIM(mode); + TIM := SelTim(mode); if TIM = nil then Exit; if PNG^ <> nil then @@ -626,24 +630,9 @@ begin pbTim.Invalidate; end; -function TfrmMain.CurrentFileIsImage: boolean; +function TfrmMain.ScanRes: TScanResult; begin - Result := ScanResult[cbbFiles.ItemIndex].IsImage; -end; - -function TfrmMain.CurrentFileName: string; -begin - Result := ScanResult[cbbFiles.ItemIndex].ScanFile; -end; - -function TfrmMain.CurrentTimPos(Index: Integer): Integer; -begin - Result := ScanResult[cbbFiles.ItemIndex].ScanTim[Index].Position; -end; - -function TfrmMain.CurrentTimSize(Index: Integer): Integer; -begin - Result := ScanResult[cbbFiles.ItemIndex].ScanTim[Index].Size; + Result := ScanResult[cbbFiles.ItemIndex]; end; procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction); @@ -657,7 +646,15 @@ begin end; procedure TfrmMain.FormCreate(Sender: TObject); +var + hGridRect: TGridRect; begin + hGridRect.Top := -1; + hGridRect.Left := -1; + hGridRect.Right := -1; + hGridRect.Bottom := -1; + grdCurrClut.Selection := hGridRect; + ScanThreads := TList.Create; ScanResult := TList.Create; New(PNG); @@ -681,7 +678,7 @@ var R, G, B: Byte; CLUT_COLOR: TCLUT_COLOR; begin - TIM := CurrentTIM; + TIM := SelTim; if TIM = nil then Exit; SELECTED_CELL := grdCurrCLUT.Row * grdCurrCLUT.ColCount + grdCurrCLUT.Col; @@ -725,11 +722,11 @@ begin WriteCLUTColor(TIM, CLUT_NUM, SELECTED_CELL, CLUT_COLOR); - ReplaceTimInFileFromMemory(CurrentFileName, TIM, CurrentTimPos(lvList.Selected.Index), CurrentFileIsImage); + ReplaceTimInFileFromMemory(ScanRes.ScanFile, TIM, TimIdx(ListIdx).Position, ScanRes.IsImage); FreeTIM(TIM); - DrawCurrentTIM; + DrawSelTim; DrawCurrentCLUT; end; @@ -738,7 +735,7 @@ procedure TfrmMain.grdCurrClutDrawCell(Sender: TObject; ACol, ARow: Integer; var TIM: PTIM; begin - TIM := CurrentTIM; + TIM := SelTim; if TIM = nil then Exit; if not TIMHasCLUT(TIM) then @@ -752,6 +749,11 @@ begin FreeTIM(TIM); end; +function TfrmMain.ListIdx: Integer; +begin + Result := lvList.Selected.Index; +end; + procedure TfrmMain.ScanDirectory(const Directory: string); var sRec: TSearchRec; @@ -775,33 +777,34 @@ begin end; procedure TfrmMain.lvListClick(Sender: TObject); -var - OFFSET, SIZE: Integer; begin if (lvList.Selected = nil) then Exit; if (lvList.Items.Count = 0) then Exit; cbbBitMode.ItemIndex := 0; - OFFSET := CurrentTimPos(lvList.Selected.Index); - SIZE := CurrentTimSize(lvList.Selected.Index); UpdateCLUTInfo; - DrawCurrentTIM; + DrawSelTim; DrawCurrentCLUT; - actTimInfo.Caption := Format('[OFFSET: 0x%x | SIZE: 0x%x]', [OFFSET, SIZE]); + actTimInfo.Caption := Format('[OFFSET: 0x%x | SIZE: 0x%x]', [TimIdx(ListIdx).Position, TimIdx(ListIdx).Size]); actTimInfo.Enabled := True; + CheckButtonsAndMainMenu; end; procedure TfrmMain.lvListData(Sender: TObject; Item: TListItem); +var + W, H: Word; begin if cbbFiles.ItemIndex = -1 then Exit; - if ScanResult[cbbFiles.ItemIndex] = nil then Exit; + + W := TimIdx(Item.Index).Width; + H := TimIdx(Item.Index).Height; Item.Caption := Format('%.6d', [Item.Index + 1]); - Item.SubItems.Add(Format('%dx%d', [CurrentTimWidth(Item.Index), CurrentTimHeight(Item.Index)])); - Item.SubItems.Add(Format('%d', [CurrentTimBitMode(Item.Index)])); + Item.SubItems.Add(Format('%dx%d', [W, H])); + Item.SubItems.Add(Format('%d', [TimIdx(Item.Index).BitMode])); end; procedure TfrmMain.lvListSelectItem(Sender: TObject; Item: TListItem; @@ -817,13 +820,17 @@ begin lvList.Column[0].Caption := Format('# / %d', [Count]); end; +function TfrmMain.TimIdx(Index: Integer): TScanTim; +begin + Result := ScanRes.ScanTim[Index]; +end; + procedure TfrmMain.ScanFile(const FileName: string); begin if CheckForFileOpened(FileName) then begin - cbbFiles.ItemIndex := cbbFiles.Items.IndexOf(ExtractFileName(FileName)); + cbbFiles.ItemIndex := cbbFiles.Items.IndexOf(FileName); btnStopScan.Enabled := False; - cbbFiles.Enabled := True; CheckButtonsAndMainMenu; Exit; end; @@ -833,36 +840,26 @@ begin ScanThreads.Last.Priority := tpNormal; ScanThreads.Last.OnTerminate := ScanFinished; - if not ScanThreads.First.Started then - ScanThreads.First.Start; + ScanThreads.Last.Start; end; procedure TfrmMain.ScanFinished(Sender: TObject); begin - ScanThreads.Delete(0); + ScanThreads.Remove(Sender as TScanThread); - if ScanResult.Last.Count > 0 then - cbbFiles.Items.Add(ScanResult.Last.ScanFile) - else - ScanResult.Delete(ScanResult.Count - 1); + if ScanThreads.Count <> 0 then Exit; - if ScanThreads.Count > 0 then + if ScanResult.Count <> 0 then SetListCount(ScanResult.Last.Count); + + CheckButtonsAndMainMenu; + + if cbbFiles.Enabled then begin - ScanThreads.First.Start; - Exit; + cbbFiles.ItemIndex := cbbFiles.Items.Count - 1; + cbbFilesChange(Self); end; - SetListCount(ScanResult.Last.Count); - cbbFiles.ItemIndex := cbbFiles.Items.Count - 1; - lblStatus.Caption := ''; - cbbFiles.Enabled := True; - pnlList.Enabled := True; - actExtractList.Enabled := True; btnStopScan.Enabled := False; - - lvList.Items[0].Selected := True; - lvList.Items[0].Focused := True; - lvList.SetFocus; end; procedure TfrmMain.ScanPath(const Path: string); @@ -889,7 +886,7 @@ var TIM: PTIM; I, CLUTS: Word; begin - TIM := CurrentTIM; + TIM := SelTim; if TIM = nil then Exit; CLUTS := GetTIMClutsCount(TIM); diff --git a/units/uScanThread.pas b/units/uScanThread.pas index af32711..3429a06 100644 --- a/units/uScanThread.pas +++ b/units/uScanThread.pas @@ -9,10 +9,7 @@ type TScanThread = class(Classes.TThread) private { Private declarations } - pScanFile: string; - pIsImage: boolean; pScanResult: TScanResult; - pTims: Integer; pFileSize: Integer; pFilePos: Integer; pStatusText: string; @@ -23,6 +20,7 @@ type pStopScan: boolean; procedure SetStatusText; procedure StartScan; + procedure FinishScan; procedure UpdateProgressBar; procedure AddResult(TIM: PTIM); procedure ClearSectorBuffer(SectorBuffer, ClearBuffer: PBytesArray); @@ -30,7 +28,7 @@ type procedure Execute; override; public constructor Create(const FileToScan: string; ImageScan: boolean); - property Terminated; + //property Started: boolean read pStarted write pStarted; property StopScan: boolean write pStopScan; end; @@ -52,13 +50,13 @@ begin FreeOnTerminate := True; pClearBufferPosition := 0; pFilePos := 0; - pTims := 0; pFileSize := GetFileSizeAPI(FileToScan); pStatusText := ''; pStopScan := False; - pScanFile := FileToScan; - pIsImage := ImageScan; + pScanResult := TScanResult.Create; + pScanResult.ScanFile := FileToScan; + pScanResult.IsImage := ImageScan; end; procedure TScanThread.AddResult(TIM: PTIM); @@ -74,7 +72,6 @@ begin pScanResult.Count := TIM^.dwTimNumber; pScanResult.ScanTim[pScanResult.Count - 1] := ScanTim; - Inc(pTims); end; procedure TScanThread.Execute; @@ -160,14 +157,21 @@ begin FreeMemory(SectorBuffer); FreeMemory(ClearBuffer); - Synchronize(UpdateProgressBar); - pSrcFileStream.Free; pFilePos := 0; - - Synchronize(UpdateProgressBar); pStatusText := ''; - Synchronize(SetStatusText); + + Synchronize(FinishScan); +end; + +procedure TScanThread.FinishScan; +begin + UpdateProgressBar; + SetStatusText; + + if pScanResult.Count = 0 then Exit; + frmMain.ScanResult.Add(pScanResult); + frmMain.cbbFiles.Items.Add(pScanResult.ScanFile); end; procedure TScanThread.SetStatusText; @@ -179,22 +183,17 @@ procedure TScanThread.StartScan; begin frmMain.btnStopScan.Enabled := True; frmMain.cbbFiles.Enabled := False; - frmMain.pnlList.Enabled := False; + frmMain.lvList.Enabled := False; frmMain.actExtractList.Enabled := False; - frmMain.pbProgress.Max := GetFileSizeAPI(pScanFile); + frmMain.pbProgress.Max := GetFileSizeAPI(pScanResult.ScanFile); frmMain.pbProgress.Position := 0; - - frmMain.ScanResult.Add(TScanResult.Create); - pScanResult := frmMain.ScanResult.Last; - pScanResult.ScanFile := pScanFile; - pScanResult.IsImage := pIsImage; end; procedure TScanThread.UpdateProgressBar; begin frmMain.pbProgress.Position := pFilePos; - frmMain.lvList.Column[0].Caption := Format('# / %d', [pTims]); + frmMain.lvList.Column[0].Caption := Format('# / %d', [pScanResult.Count]); end; procedure TScanThread.ClearSectorBuffer(SectorBuffer, ClearBuffer: PBytesArray);