⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.pas

📁 srt字幕文件时间校正工具
💻 PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Mask,
  XPMan;

type
  TForm1 = class(TForm)
    Panel_pyw_dj: TPanel;
    Edit_wjLJ: TComboBox;
    Panel51: TPanel;
    Edit_tzFW: TMaskEdit;
    Edit_tzLX: TComboBox;
    Button1: TButton;
    Panel1: TPanel;
    Edit_zmWZ: TEdit;
    Panel2: TPanel;
    Panel3: TPanel;
    Edit_zmSJ: TMaskEdit;
    Edit_tzSJ: TMaskEdit;
    Button2: TButton;
    procedure Edit_wjLJCloseUp(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure onKeyPress_Null(Sender: TObject; var Key: Char);
    procedure Edit_tzSJKeyPress(Sender: TObject; var Key: Char);
    procedure Edit_tzSJKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  stlTemp :TStringList;
implementation
uses
  Func_Add;
{$R *.dfm}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  stlTemp.Free;
end;

procedure getTimeInt(
  const oldTime:string;
    var intHour,intMinu,intSecd,intMill:integer);
var
  strTemp :string;
begin
  intMill := strtointDef(trim(strnget(oldTime, ',', 2, '')), 0);
  strTemp :=             trim(strnget(oldTime, ',', 1, ''));
  intSecd := strtointDef(trim(strnget(strTemp, ':', 3, '')), 0);
  intMinu := strtointDef(trim(strnget(strTemp, ':', 2, '')), 0);
  intHour := strtointDef(trim(strnget(strTemp, ':', 1, '')), 0);
end;

procedure TForm1.onKeyPress_Null(Sender: TObject; var Key: Char);
begin
  if(key in[#9,#13]) then else key := #0;
end;

procedure TForm1.Edit_tzSJKeyPress(Sender: TObject; var Key: Char);
begin
//
end;

procedure TForm1.Edit_tzSJKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  in1Hour,in1Minu,in1Secd,in1Mill :integer;
  in2Hour,in2Minu,in2Secd,in2Mill :integer;
  strTemp,strNext :string;
begin
  getTimeInt(Edit_zmSJ.Text, in1Hour,in1Minu,in1Secd,in1Mill); strTemp := format('%0.2d:%0.2d:%0.2d,%0.3d',[in1Hour,in1Minu,in1Secd,in1Mill]);
  getTimeInt(Edit_tzSJ.Text, in2Hour,in2Minu,in2Secd,in2Mill); strNext := format('%0.2d:%0.2d:%0.2d,%0.3d',[in2Hour,in2Minu,in2Secd,in2Mill]);
  in1Mill := in1Mill +(in1Secd +(in1Minu*60) +(in1Hour*3600)) *1000;
  in2Mill := in2Mill +(in2Secd +(in2Minu*60) +(in2Hour*3600)) *1000;
  Edit_tzLX.ItemIndex := integer(in1Mill < in2Mill);
  in1Mill := abs(in1Mill -in2Mill);
  in1Secd :=(in1Mill div 1000) mod 60;
  in1Minu :=(in1Mill div 1000) div 60;
  in1Mill :=(in1Mill mod 1000);
  Edit_tzFW.Text := format('%0.3d:%0.2d.%0.3d',[in1Minu, in1Secd, in1Mill]);
end;

procedure TForm1.Edit_wjLJCloseUp(Sender: TObject);
const
  FiltSRT :string = '字幕文件(*.srt)|*.srt';
var
  strTemp :string;
  intLoop,intErro :integer;
begin
  if(Sender <> nil) then
  begin
  strTemp := strOnly(Edit_wjLJ.Hint, ExtractFilePath(Application.ExeName));
  if not Diag_OpenFiles(strTemp, FiltSRT+'|'+FiltAll) then exit;
  end else
  if(Edit_wjLJ.Text = strNull) then exit else strTemp := Edit_wjLJ.Text;

  Edit_wjLJ.Clear;
  Edit_wjLJ.Items.Add(strTemp);
  Edit_wjLJ.ItemIndex := 0;
  Edit_wjLJ.Hint      := ExtractFilePath(strTemp);
  {}
  case (stlTemp=nil) of
    true: stlTemp := TStringList.Create;
    else  stlTemp.Clear;
  end;
  stlTemp.LoadFromFile(strTemp);
  intErro := 0;
  for intLoop:=0 to stlTemp.Count-1 do
  begin
    if(stlTemp.Strings[intLoop] = strNull) then continue;
    if(pos(':',   stlTemp.Strings[intLoop]) = 0)
    or(pos(',',   stlTemp.Strings[intLoop]) = 0)
    or(pos('-->', stlTemp.Strings[intLoop]) = 0) then
    begin
      inc(intErro);
      if(intErro > 10) then exit else continue;
    end;
    Edit_zmSJ.Text := trim(strnget(stlTemp.Strings[intLoop], '-->', 1, ''));
    Edit_zmWZ.Text := stlTemp.Strings[intLoop+1];
    break;
  end;
end;

function  newTimeStr(
  const oldTime:string;
  const newMinu,
        newSecd,
        newMill:integer;
  const typeFlg:boolean=true):string;
var
  intHour,intMinu,intSecd,intMill :integer;
begin{typeFlg:超前迨后标志}
  getTimeInt(oldTime, intHour,intMinu,intSecd,intMill);
  if(typeFlg = true) then
  begin{迨后}
  intMill := intMill +newMill;
  intSecd := intSecd +newSecd +(intMill div 1000);
  intMinu := intMinu +newMinu +(intSecd div   60);
  intHour := intHour          +(intMinu div   60);
  end else
  begin{超前}
  intMill := intMill -newMill;
  intSecd := intSecd -newSecd +intTrue((intMill div 1000)-1, 0, (intMill<0));
  intMinu := intMinu -newMinu +intTrue((intSecd div   60)-1, 0, (intSecd<0));
  intHour := intHour          +intTrue((intMinu div   60)-1, 0, (intMinu<0));

  intMill :=(intMill mod 1000);
  if(intMill < 0) then intMill :=1000 +(intMill mod 1000);
  if(intSecd < 0) then intSecd :=  60 +(intSecd mod   60);
  if(intMinu < 0) then intMinu :=  60 +(intMinu mod   60);
  if(intHour < 0) then intHour :=   0;
  end;

  intSecd :=(intSecd mod   60);
  intMinu :=(intMinu mod   60);
  intMill :=(intMill mod 1000);
  result := format('%0.2d:%0.2d:%0.2d,%0.3d',[intHour, intMinu, intSecd, intMill]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  intLoop,intErro :integer;
  intMinu,intSecd,intMill :integer;
  strTemp :string;
  flgTem :boolean;
begin
  if(Edit_wjLJ.Text = strNull) then exit;
  intMill := strtointDef(trim(strnget(Edit_tzFW.Text, '.', 2, '')), 0);
  strTemp :=             trim(strnget(Edit_tzFW.Text, '.', 1, ''));
  intSecd := strtointDef(trim(strnget(strTemp,        ':', 2, '')), 0);
  intMinu := strtointDef(trim(strnget(strTemp,        ':', 1, '')), 0);
  if(intMinu +intSecd +intMill = 0) then exit;
  flgTem  :=(Edit_tzLX.Text='迨后');
  intErro := 0;
  for intLoop:=0 to stlTemp.Count-1 do
  begin
    if(stlTemp.Strings[intLoop] = strNull) then continue;
    if(pos(':',   stlTemp.Strings[intLoop]) = 0)
    or(pos(',',   stlTemp.Strings[intLoop]) = 0)
    or(pos('-->', stlTemp.Strings[intLoop]) = 0) then
    begin
      inc(intErro);
      if(intErro > 10) then exit else continue;
    end;
    intErro := 0;
    stlTemp.Strings[intLoop] := format('%s --> %s', [
      newTimeStr(strnget(stlTemp.Strings[intLoop], ' --> ', 1, ''), intMinu,intSecd,intMill, flgTem),
      newTimeStr(strnget(stlTemp.Strings[intLoop], ' --> ', 2, ''), intMinu,intSecd,intMill, flgTem)]);
  end;
  strTemp := ChangeFileExt(Edit_wjLJ.Text, '.bak');
  if not fileExists(strTemp) then RenameFile(Edit_wjLJ.Text, strTemp);
  stlTemp.SaveToFile(Edit_wjLJ.Text);
  showMessage('更新完毕!');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin{重新载入}
  Edit_wjLJCloseUp(nil);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -