Kezdőoldal » Számítástechnika » Programozás » Delphiben hogy kell használni...

Delphiben hogy kell használni a Timer-komponenst?

Figyelt kérdés
A feladat a következő: egy bekért szöveget kell kiíratni karakterenként. Az algoritmus nagyjából megvan, csak nem tudom, hogy a gomb vagy a timer alprogramjába írjam. Először a timerbe írtam, de csak az egész szöveget írta ki 1 mp késleltetéssel. Hogy lehet ezt megoldani?

2012. máj. 19. 10:39
1 2
 1/13 anonim ***** válasza:
Nem lenne egyszerűbb egy sima delay-t használni? Ciklussal végigmész a stringen, és minden karakter kiírása után vársz egy picit. Felesleges túlbonyolítani.
2012. máj. 19. 10:41
Hasznos számodra ez a válasz?
 2/13 A kérdező kommentje:
A Delphi-ben nem működik a delay. Itt elvileg a Timer van helyette, de abszolút kezelhetetlen.
2012. máj. 19. 10:45
 3/13 anonim ***** válasza:

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.

2012. máj. 19. 10:48
Hasznos számodra ez a válasz?
 4/13 anonim ***** válasza:

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

2012. máj. 19. 11:10
Hasznos számodra ez a válasz?
 5/13 anonim ***** válasza:

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

2012. máj. 19. 11:18
Hasznos számodra ez a válasz?
 6/13 A kérdező kommentje:

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!

2012. máj. 19. 11:21
 7/13 anonim ***** válasza:

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;

2012. máj. 19. 11:33
Hasznos számodra ez a válasz?
 8/13 anonim ***** válasza:

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

2012. máj. 19. 11:56
Hasznos számodra ez a válasz?
 9/13 zsomkovacs ***** válasza:

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.

2012. máj. 19. 12:03
Hasznos számodra ez a válasz?
 10/13 A kérdező kommentje:

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.

2012. máj. 19. 12:19
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!