| Autor | Správa |
petercvm
 Užívateľ
 Založený: 29.05.2011 Príspevky: 6
 | Zaslal: Ne 29.05.11 12:09 |   |
Dobrý deň.
Prosím vás potreboval by som poradiť.
Robím program, ktorý zobrazuje obrázky.Využívam pri tom aj Timer. Chcem aby si užívateľ sám zadal, po kolkých sekundách sa majú obrázky zmeniť no neviem ako na to.
Zatial som napísal toto:
var
Form1: TForm1;
implementation
var tm: integer = 0;
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var
V:integer;
begin
Timer1.Enabled:=false;
tm:= tm+1;
V:=StrToInt(Edit1.Text);
if tm = 1 then image1.Picture.LoadFromFile('1.bmp');
if tm = (2*V+1) then image1.Picture.loadfromfile('2.bmp');
if tm = (3*V+1) then image1.Picture.loadfromfile('3.bmp');
if tm = (4*V+1) then image1.Picture.loadfromfile('4.bmp');
if tm = (5*V+1) then image1.Picture.loadfromfile('5.bmp');
if tm = (6*V+1) then image1.Picture.loadfromfile('6.bmp');
if tm = (7*V+1) then close;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=true;
end;
end.
Možno že je to úplne zle, neviem, prosím vás pre to o radu ako to dosiahnuť. |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1044
 | Zaslal: Ne 29.05.11 12:35 |   |
Ved uz len za riadok:
| kód: | | V:=StrToInt(Edit1.Text); |
pridaj:
| kód: | | Timer1.Intervar := V * 1000; |
Urcite by som ti to ale oporucil este supnut do bloku try/except ak by bolo zadane nespravne cislo. |
| |
   |
 |
petercvm
 Užívateľ
 Založený: 29.05.2011 Príspevky: 6
 | Zaslal: Ne 29.05.11 14:11 |   |
Diki moc ale aj tak mi to nejde ked spustim program tak mi hned vyskoci chyba .... nevedel som ako to mam sem dat tak tu je link co mi vyskoci: http://imageshack.us/photo/my-images/807/chyba.jpg/
Vedel by si mi s tym pomoct?
...no a to co si mi odporucil tak nanestastie neviem ako sa to robi... |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1044
 | Zaslal: Ne 29.05.11 14:30 |   |
Ved prave to je chyba, ktora vznikne pri konverzii, co si mal obalit do bloku try/except. Nemam po ruke Delphi a uz dlho som v nom nerobil, takze skusim iba tak naslepo:
| kód: | var
Form1: TForm1;
implementation
var tm: integer = 0;
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var
V:integer;
begin
tm:= tm+1;
try
V:= StrToInt(Edit1.Text);
except
on E:exception do begin
ShowMessage( 'Neplatne cislo!' );
Timer1.Enabled := false;
exit;
end;
end;
Timer1.Intervar := V * 1000;
if tm = 1 then image1.Picture.LoadFromFile('1.bmp');
if tm = (2*V+1) then image1.Picture.loadfromfile('2.bmp');
if tm = (3*V+1) then image1.Picture.loadfromfile('3.bmp');
if tm = (4*V+1) then image1.Picture.loadfromfile('4.bmp');
if tm = (5*V+1) then image1.Picture.loadfromfile('5.bmp');
if tm = (6*V+1) then image1.Picture.loadfromfile('6.bmp');
if tm = (7*V+1) then close;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=true;
end;
end. |
Na zaciatku nastav v Object Inspectore Timer1.Enabled na false, ak nemas. Potom po kliknuti na Button1 sa spusti Timer1. Tie if-y si mozes zmenit na prepinac case, bolo by to prehladnejsie a tomu prepinaniu obrazkov som trocha nepochopil ako to riesis, takze som ti do toho nic nemenil. |
| |
   |
 |
shiro
 Skúsený užívateľ
 Založený: 12.10.2006 Príspevky: 9625
 | Zaslal: Ne 29.05.11 14:32 |   |
taka chyba hodne casto skace, ked program spustis napr. s prazdnym polom na zadavanie a nemas osetrenu vynimku.
A k tomu try/except...delphi ma tak fasa spravenu napovedu aj s prikladmi, ze to musi chapat kazdy. |
_________________ AMD Phenom II 955 BE 3.2GHz, 4GB RAM DDR3-1333 A-Data, MB Gigabyte MA-770T-UD3P, Kingston SSDNow V 64GB 2.Gen., WD 640GB + WD 1TB, Gigabyte GeForce GTX275 896MB, 2xDVD+-RW NEC 7173, LCD BenQ G2400Wa 24", MS Wireless optical mouse 2.0A, Keyboard Prestigio, Creative SBS 380 2.1 | |
  |
 |
petercvm
 Užívateľ
 Založený: 29.05.2011 Príspevky: 6
 | Zaslal: Ne 29.05.11 14:48 |   |
diki moc ... pomohlo to ... a hlavne to, ze som v Object Inspectore nastavil Timer na false ..... ale aj tak mi to nejde dobre - obrazky nehadze
Chcem to proste tak, ze ked si zadam do editu napr 2, tak kazde dve sekundy sa mi zobrazi iny obrazok, a ked prejdu vsetky tak sa program sam ukonci --- pomozete este? |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1044
 | Zaslal: Ne 29.05.11 14:54 |   |
Jasne, ze pomozeme. To som ti pisal, ze nechapem tomu postupu, ako ich menis. Uprav toto:
| kód: | if tm = 1 then image1.Picture.LoadFromFile('1.bmp');
if tm = (2*V+1) then image1.Picture.loadfromfile('2.bmp');
if tm = (3*V+1) then image1.Picture.loadfromfile('3.bmp');
if tm = (4*V+1) then image1.Picture.loadfromfile('4.bmp');
if tm = (5*V+1) then image1.Picture.loadfromfile('5.bmp');
if tm = (6*V+1) then image1.Picture.loadfromfile('6.bmp');
if tm = (7*V+1) then close; |
na toto:
| kód: | if tm = 1 then image1.Picture.LoadFromFile('1.bmp');
if tm = 2 then image1.Picture.loadfromfile('2.bmp');
if tm = 3 then image1.Picture.loadfromfile('3.bmp');
if tm = 4 then image1.Picture.loadfromfile('4.bmp');
if tm = 5 then image1.Picture.loadfromfile('5.bmp');
if tm = 6 then image1.Picture.loadfromfile('6.bmp');
if tm = 7 then begin
Timer1.Enabled := false;
tm := 0;
exit;
end; |
|
| |
   |
 |
walther
 Užívateľ
 Založený: 24.01.2008 Príspevky: 10194 Bydlisko: Bratislava Vek: 24
 | Zaslal: Ne 29.05.11 14:59 |   |
s delphi nerobím, ale jedna vec mi nedá pokoj - prečo Fico neodporúčaš použiť "else if"? Alebo ešte lepšie "switch", keďže tento príklad si o to priam žiada...? V teórii by mali byť oba prípady rýchlejšie ako toto.. (jasné, možno v tomto konkrétnom prípade by to bolo zanedbateľný zisk, ale nie je lepšie sa to naučiť raz a poriadne?) |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1044
 | Zaslal: Ne 29.05.11 15:06 |   |
| Fico napísal: | | Tie if-y si mozes zmenit na prepinac case, bolo by to prehladnejsie a tomu prepinaniu obrazkov som trocha nepochopil ako to riesis, takze som ti do toho nic nemenil. |
Nenapisal som mu presnu syntax, lebo som si nebol isty, aka je - som "preuceny" na C syntax. |
| |
   |
 |
petercvm
 Užívateľ
 Založený: 29.05.2011 Príspevky: 6
 | Zaslal: Ne 29.05.11 15:46 |   |
Obrazky vsak stale nejdu same od sema .... ked vsak klikam na tlacidlo po hodne dlhej chvili sa zmenia ... ale naozaj musim dost dlho klikat .... neviete co by s tym mohlo byt ?
Tu je cely zdrojovy ako ho mam:
var
Form1: TForm1;
implementation
var tm: integer = 0;
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var
V:integer;
begin
Timer1.Enabled:=false;
tm:= tm+1;
try
V:= StrToInt(Edit1.Text);
except
on E:exception do begin
ShowMessage( 'Neplatne cislo!' );
Timer1.Enabled := false;
exit;
end;
end;
Timer1.Interval := V * 1000;
if tm = 1 then image1.Picture.LoadFromFile('1.bmp');
if tm = 2 then image1.Picture.loadfromfile('2.bmp');
if tm = 3 then image1.Picture.loadfromfile('3.bmp');
if tm = 4 then image1.Picture.loadfromfile('4.bmp');
if tm = 5 then image1.Picture.loadfromfile('5.bmp');
if tm = 6 then image1.Picture.loadfromfile('6.bmp');
if tm = 7 then begin
Timer1.Enabled := false;
tm := 0;
exit;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=true;
end;
end. |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1044
 | Zaslal: Ne 29.05.11 15:59 |   |
1.) Videl si niekde v mojom kode, aby som ti tam dal do tela timer-u, aby sa ti hned po starte vypol?
| kód: | procedure TForm1.Timer1Timer(Sender: TObject);
var
V:integer;
begin
Timer1.Enabled:=false; |
Cize odstran riadok Timer1.Enabled:=false; a pozri si este raz pozornejsie, ako som ti to napisal predtym.
2.) Ked vkladas nejaky kod tu na forum, tak ho cely oznac a hore na paneli mas znacku "code", klikni na nu aby bol kod lepsie citatelny. |
| |
   |
 |
petercvm
 Užívateľ
 Založený: 29.05.2011 Príspevky: 6
 | Zaslal: Ne 29.05.11 16:18 |   |
Aha dakujem skusim to .... to som mal ja najprv tak spravene no potom som to musel v objectinpexctore vypat a zabudol som to dat prec ... vdaka za radu budem to tak robit
// pridané po 16 minútach od posledného príspevku
diki moc uz to slape jak hodinky
...este by som mal jednu otazku ... mam jeden Form na nom edit a tlacitko. do editu si zadam nejaku hodnotu. Ked kliknem na tlacitko tak sa mi vyvola druhy Form. na nom mam dalsie tlacitko, pod ktorym mam uz program. ako mam urobit aby si program zobral hodnotu z editu, ktory je na prvom Form-e?? Da sa to vobec nejako? alebo ten edit musim mat len na tom forme kde mam aj tlacitko s programom |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1044
 | Zaslal: Ne 29.05.11 16:25 |   |
Jasne, da sa to. Do uses jednoducho pridaj unit s druhym formularom, teda napr sme v Unit2:
a potom snim pracuj napr takto:
| kód: | procedure TForm2.Button1Click(Sender: TObject);
var
nejake_data: string;
begin
nejake_data := Form1.Edit1.Text;
end; |
Nieco podobne sa riesilo tu, mrkni na to:
http://www.pcforum.sk/post-vp1035469.html#1035469 |
| |
   |
 |
petercvm
 Užívateľ
 Založený: 29.05.2011 Príspevky: 6
 | Zaslal: Ne 29.05.11 17:27 |   |
Diki ide to. ... heh ale ved to je pochopitelne  |
| |
  |
 |
|