Programowanie w języku Delphi » Gotowce

Przesuwanie napisów do filmów

  • 2 komentarze
  • 524 odsłony
  • Oceń ten tekst jako pierwszy


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:


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 &#8222;et1&#8221; i powinno wszystko działać :):).


Natomiast dla napisów czasowych typu:


0:00:04:Napis1
0:00:15:Napis2
0:01:01:Napis3
&#8230; i tak dalej.


Gdzie godzinę zapisuję się przez jedną cyfrę, stosujemy podobną 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 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;



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).


2 komentarze

Deti 2003-02-18 22:20

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

rajdzen 2003-02-18 22:09

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ć.