Delphiben hogy kell használni a Timer-komponenst?
A delphi a teljes platform SDK-hoz hozzáfér. Ne mondd, hogy winapival se tudsz várakozni, mert az elég hihetetlen. Nézd csak meg ezt: [link]
Kell, hogy elérhető legyen a delphiben is.
@10:41 az nem igaz. Rég nem használtam Delphi-t, de tudom hogy úgy az lenne hogy az esetben annyi másodpere lefagyna a program ahány karakteres a bekért szöveg. A GUI addig nem kapja meg a vezérlést, amikor megkapja már a kész szöveg lesz ...
@10:48 Ez nem a Delphi sajátossága hanem a GUI-é. Ez pl c++-ban is így lenne, nem programoztál ezek szerint 4. Generációs grafikus felülető programot.
A megoldás: kezdetben a timer kikapcsolva, (enabled:=false) a gombnyomás eseményre (enabled:=true) kapcsoljuk be. A timer esemény-hez kell íni olyan kódot ami növel egy változót ami a karakter indexet növeli ha az index<=bekért szöveghossz akkor az aktuális pozíción lévő karaktert írjuk ki különben leállítjuk a timer-t.
A gombnyomás eseményre a timer elindítása előtt az index változónak kezdőértéket adunk.
"Rég nem használtam Delphi-t..."
Igen, látszik. Míg C++-ban külön kódot írunk a message-ek feldolgozására, hogy a GUI ne fagyjon, addig a delphiben van egy ProcessMessages nevű függvény, ami éppen erre való.
"Ez nem a Delphi sajátossága hanem a GUI-é. Ez pl c++-ban is így lenne, nem programoztál ezek szerint 4. Generációs grafikus felülető programot."
Lásd fent. Erre mondják, hogy ha hallgattál volna...
"A megoldás: kezdetben a timer kikapcsolva, (enabled:=false) a gombnyomás eseményre (enabled:=true) kapcsoljuk be. A timer esemény-hez kell íni olyan kódot ami növel egy változót ami a karakter indexet növeli ha az index<=bekért szöveghossz akkor az aktuális pozíción lévő karaktert írjuk ki különben leállítjuk a timer-t.
A gombnyomás eseményre a timer elindítása előtt az index változónak kezdőértéket adunk."
Na, ez a túlbonyolítás.
Nem igazán akar működni. Így valahogy néz ki:
procedure TForm1.Button1Click(Sender: TObject);
begin
i:=0;
Timer1.Enabled:=True;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var x:integer;
s:string;
begin
s:=Edit1.Text;
inc(i);
if i<=length(s) then begin
Image1.Canvas.TextOut(x,3,s[i]);
x:=x+10;
end
else Timer1.Enabled:=False;
end;
meg még van egy globális i változó.
És még egy kérdés: az s változóhoz melyik alprogramban rendeljem hozzá a beviteli mezőz? Köszönöm az eddigi válaszokat is!
A te kódod rövid és egyszerűsített alakja az én módszeremmel. Nem ellenőrzött, mert nincs fent a gépemen delphi, úgyhogy nem garantálom, hogy elsőre lefut, csak ötletadásnak szánom:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer; x: integer;
begin
x := 10;
for i:= 0 to length(Edit1.Text)-1 do
begin
Image1.Canvas.TextOut(x,3,Edit1.Text[i]);
x:=x+10;
Sleep(200);
ProcessMessages;
end;
end;
@11:21
x inicializálatlan változó.
s:=Edit1.Text ezt lehetne már Button1Click-be is.
..."delphiben van egy ProcessMessages nevű függvény, ami éppen erre való. "
@11:33
Írhattad volna előbb is ... azt hittem bonyolultabb lenne sleep-el ilyen kis programra, mint timer-el.
Azért meg lehet csinálni timer-el is gyakorlásként.
Utolsó: nem vagyok benne teljesen biztos, de a Delphi (a Pascalhoz hasonlóan) 1-től indexeli a Stringek karaktereit, tehát a ciklus 1-től n-ig fut, de amúgy nem látok hibát benne.
Viszont felteszem, hogy a kérdező azért a Timer objektummal kérdezi, mert azzal kell megcsinálnia, és persze, lehet a ProcessMessage-t használni, de amíg nem tudja, mi az az üzenetsor, addig szerintem nem célszerű ilyeneket javasolni neki.
Kérdező:
Nem tudom, ez megoldja-e a gondot, de elég komoly hiba: x lokális változó, ráadásul inicializálás nélkül használod. Szerintem töröld ki az x-et mindenhonnan, semmi szükség rá, a Textout-ba meg írj 10*i-t.
Köszönöm az eddigi válaszokat!
Lehet, hogy hülye kérdés, de mi az, hogy inicializált? Nekem is kiírta a Delphi, de nem nagyon figyeltem rá... Megpróbálom.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!