Przesuwanie napisów do filmów

Deti
<font face="verdana" size="1" color="black">

W tym artykule w najprostszy sposób przedstawię, jak przesunąć napisy „czasowe” do filmów o określony czas.

Pierwsze czego będziemy potrzebować to RichEdit, gdzie napisy będą ładowane. Nazwijmy go „podglad”. Sami oczywiście zróbcie procedurę na ładowanie napisów do RichEdit przez „podglad.lines.loadfromFile()”. Będą tu ładowane napisy. Powiem jeszcze, że cały czas mówię o napisach czasowych typu:

00:00:04:Napis1 00:00:15:Napis2 00:01:01:Napis3 … i tak dalej.

Kiedy już poradzimy sobie z RichEditem, należy na formę wstawić dwa RadioBoxy. Będą one oznaczały wybór kierunku przesuwu napisów (jeden w przód, drugi w tył). Dlatego nazwijcie je odpowiednio: „przod” oraz „tyl”. Teraz jeszcze, aby mieć już wszystko przygotowane należy wstawić na formę Button, jako przycisk do samej już operacji. Nazwijmy go „Button1”. No i jeszcze Edit o nawie "ile" gdzie wpisujemy liczbę sekund.

Teraz, gdy już upewnimy się, że zostały wgrane do „podglądu” poprawne napisy czasowe, należy w zdarzeniu OnClick Button`a 1 napisać taką oto procedurę:


BEGIN
button1.Enabled:=false;
podglad.Lines.SaveToFile(plik tymczasowy1);
assignfile(t, plik tymczasowy1);
reset(t);
assignfile(g, plik tymczasowy2);
rewrite(g);

REPEAT
FOR i:=1 TO 9 DO
BEGIN
read(t,s[i]);
IF (i<>3) AND (i<>6) AND (i<>9) THEN z[i]:=ord(s[i])-48;
END;
suma:=(z[1]*10+z[2])*3600;
suma:=suma+(z[4]*10+z[5])*60;
suma:=suma+z[7]*10+z[8];
p1:=strtoint(ile.text);

IF (tyl.Checked=true) AND (suma-p1<0) THEN begin u:=false; goto et1; end;

IF przod.Checked=true THEN suma:=suma+p1;
IF tyl.checked=true THEN suma:=suma-p1;
h:=suma div 3600;
n:=(suma mod 3600) div 60;
sek:=(suma mod 3600) mod 60;
h1:=inttostr(h);
n1:=inttostr(n);
sek1:=inttostr(sek);

IF length(h1)=1 THEN h1:='0' +h1;
IF length(n1)=1 THEN n1:='0' +n1;
IF length(sek1)=1 THEN sek1:='0' +sek1;

write(g,h1);
write(g,':');
write(g,n1);
write(g,':');
write(g,sek1);
write(g,':');

readln(t,m);
write(g,m);
write(g,chr(13));

UNTIL EOF(t);

closefile(t);
closefile(g);
podglad.lines.clear;
podglad.lines.loadfromfile(plik tymczasowy2);
button1.Enabled:=true;
et1:
IF (tyl.Checked=true) AND (suma-p1<0) AND (u=false) THEN
BEGIN
closefile(t);
closefile(g);
messagebox(handle,'Nie można dalej cofnąć napisów !','Ostrzeżenie !',MB_OK);
button1.Enabled:=true;
END;
END;

Pliki tymczasowe (1 i 2) mogą być dowolnymi plikami tekstowymi (nieistniejącymi). Może można to zrobić w prostszy sposób (bez dodatkowego zaśmiecania plikami), ale ten jest w 100% sprawny.

Oczywiście do tej procedury należy jeszcze dodać zmienne. A są to:


```delphi VAR X,I,suma,p1,h,n,sek: Integer; T,G: textfile; S:array[1..10]of char; Z:array[1..10]of Integer; U:Boolean; M,h1,n1,sek1:string; ```

I jeszcze do tego kotwica o nazwie „et1” i powinno wszystko działać :):).

Natomiast dla napisów czasowych typu:

0:00:04:Napis1 0:00:15:Napis2 0:01:01:Napis3 … i tak dalej.

Gdzie godzinę zapisuję się przez jedną cyfrę, stosujemy podobną procedurę:


```delphi BEGIN button1.Enabled:=false; podglad.Lines.SaveToFile(plik tymczasowy1); assignfile(t, plik tymczasowy1); reset(t); assignfile(g, plik tymczasowy2); rewrite(g);

REPEAT
FOR i:=1 TO 8 DO
BEGIN
read(t,s[i]);
IF (i<>2) AND (i<>5) AND (i<>8) THEN z[i]:=ord(s[i])-48;
END;
suma:=z[1]*3600;
suma:=suma+(z[3]*10+z[4])*60;
suma:=suma+z[6]*10+z[7];
p1:=strtoint(ile.text);

IF (tyl.Checked=true) AND (suma-p1<0) THEN begin u:=false; goto et2; end;

IF przod.Checked=true THEN suma:=suma+p1;
IF tyl.checked=true THEN suma:=suma-p1;
h:=suma div 3600;
n:=(suma mod 3600) div 60;
sek:=(suma mod 3600) mod 60;
h1:=inttostr(h);
n1:=inttostr(n);
sek1:=inttostr(sek);

IF length(n1)=1 THEN n1:='0' +n1;
IF length(sek1)=1 THEN sek1:='0' +sek1;

write(g,h1);
write(g,':');
write(g,n1);
write(g,':');
write(g,sek1);
write(g,':');

readln(t,m);
writeln(g,m);

UNTIL EOF(t);

closefile(t);
closefile(g);
podglad.lines.clear;
podglad.lines.loadfromfile(plik tymczasowy2);
button1.Enabled:=true;

et2:
IF (tyl.Checked=true) AND (suma-p1<0) AND (u=false) THEN
BEGIN
closefile(t);
closefile(g);
messagebox(handle,'Nie można dalej cofnąć napisów !','Ostrzeżenie !',MB_OK);
button1.Enabled:=true;
END;
END;

<hr color=blue noshade size=1>

Z tym, że tutaj jest kotwica o nazwie &#8220;et2&#8221;. 

Dla napisów klatkowych nie pisałem już procedury, gdyż każdy sam potrafi sobie taką wymyślić (nie ma tam problemów z minutami i godzinami, po prostu jest zwykłe przesunięcie liczb). 

</span>

2 komentarzy

Nie można tylko sekund dodawać, bo co jeśli ich ilośc przekroczy 59 ???

Troche duzo pisania. Czy nielepiej zamienić na sekundy i odpowiednio dodawać lud odejmować kilka sekund? No i jeszcze jakiś warunek sprawdzający by się mógł przydać. Jeżeli podejdziemy w ten sposób do tego problemu to i okaże się że napisy postaci {123}{127} można w podobny sposób przesuwać.