Migotanie przy przerysowywaniu TLabel

0

Hi!
Zrobilem za pomoca Timera i paru TLabeli calkiem ladny zegar cyfrowy, ale jest problem. Otoz przy odswiezaniu cyfr i pisaniu czasu, caly pisany napis nieprzyjemnie miga, bo label zmieniajac swoj caption chyba calosc zmazuje a potem dopiero rysuje nowa zawartosc. Jak mozna uniknac MIGANIA? Mozna poczekac na odswiezenie ekranu, lub jakos z bufora rysowac, hm? Pomozcie!

0

Zamiat labeli użyj canvas'a i na nim rysuj z użyciem buforowania.--W poszukiwaniu rozwiązania problemu, najbardziej pomocna jest znajomość odpowiedzi.

0

Hm, ok, ale jak to zrobić? Widziałem przykłady w gotowcach, ale tam zdaje się nie było o buforowaniu, ani o rysowaniu czcionek... HELP! Anyway, thx za szybka odpowiedz!

0

Jesli sie nie myle to label nie bedzie migal jesli bedziesz go wyswietlal na jakims image'u.--Source of life - Programming,
Skateboarding,
Metal.

0

Postanowilem zrobic to inaczej i ladniej. Zrobilem obrazki BMP z cyframi, i teraz mam kolejny problem: moge wstawic TImage do formy a potem odpowiednio wlaczac i wylaczac dla nich Visible. Ale to do bani pomysl, bo kazdy obrazek musze wstawic osobno (i na jednej pozycji zegara - 10 obrazkow z cyframi, i tylko jeden z visible), brrrrr... Mozna na pewno jakos to zrobic np. w tablicy obrazkow Digits jakiegos typu (ale tu utopilem sie w helpach - TPicture, TBitmap, TImage, zwariowac mozna).
Czy moze ktos podac jakis prosty sposob, zeby to zrobic?

Potrzebuje info o:

  • zbudowaniu tablicy obrazkow (czyli wczytanie z dysku lub jakos zrobienie TImageList tylko nie wiem jak jej potem uzyc, zrobic umiem)
  • wyswietleniu w odpowiedniej pozycji odpowiedniego obrazka z przygotowanej tablicy lub listy

Dzieki za odpowiedzi, to milo ze ktos czyta pytania i stara sie pomoc :) Taki newbie jak ja dzieki temu moze utrzymac sie przy zyciu! :)

0

a na moje to label Ci miga bo masz za maly interval, ja mam rowno na 1000 i nic mi nie miga..--Lardux

0

zapomnialem jeszcze napisac, ze jest problem z tym Ttimer, jak macie czysta forme, tylko z Tlabel i Ttimer, i procedurke typu

procedure dodaj;
begin
inc(a);
label1.caption:=inttostr(a);
end;

timer.interval:=1000;
ontimer:=dodaj;

wlaczamy programik, i wyswietla sie jakas tam liczba ktora zwieksza sie o jeden co sekunde, i teraz problem, jesli mamy windows 98 to w momencie gdy zlapiemy okno na ktorym to sie wyswietla za pasek tytulowy w celu np przesuniecia, i bedziemy tak trzymac przez powiedzmy 10 s. to przez te 10 s. nasze 'a' sie nie zwiekszy, na windows xp jest juz dobrze ale w 98 natrafilem na taki problemik...
rozwiazalem go, ale sposob ktorym to zrobilem nie jest dobry, czekam na propozycje rozwiazania tego problemu [cygaro] --Lardux

0

Tylko ze 1s interwal to za malo, chce miec zegar, ktory mierzy z dokladnoscia do 0.01 s i ktory mozna zatrzymac jak stoper.

0

Zatrzymanie to Zegarek.enabled := false;
A jak z dokładnością do 0.01 sec to Interval na 10

--
Nieważne czy producent jest z Ameryki czy z Niemiec i tak wszystko jest z Tajwanu

0

Ja bym to zrobił tak, że w jednej bitmapie umieścił wszystkei znaki pokolei tzn "01234567890:" każdy z tych znaków musi mieć identyczne rozmiaru :) Potem podczas rysowania niech odpowiedni znaczek będzie wycianany z tej matrycy, a potem umieszczany na canvasie bitmapy. Na koniec rysowania danej godziny wystarczy wyświetlic to w paintboxie :). Zadnego migania nie będzie ani problemów z używaniem zbyt dużej ilości kompoenentów :) Jak coś nie jeasne to prsze pytac bo może źle napsiałem o co mi chodzi :

0

Rozumiem o co Ci chodzi, ale chyba nie potrafie tego zrobic. Probowalem za to czegos innego (i tez nie udalo sie):

  1. Zrobilem dodatkowy typ:

type Tdigits = array[0..MaxDigits] of TBitmap;

i chce do zmiennej tego typu wczytac wszystkie literki/cyferki, jest ich 10 i sa w ladnych plikach BMP.

  1. Deklaruje zmienna w private ktora bedzie trzymala te bitmapy:
    ...
    private
    digits : Tdigits;

wszystko ladnie sie kompiluje (gdy digits byl w public, delphi sie czepial)

  1. W metodzie CreateForm robie cos takiego:

for i:=0 to MaxDigits do begin
digits[i].Create;
digits[i].LoadFromFile( path + intToStr(i) + '.bmp' );
end;

  1. Potem moge juz rysowac na Canvasie w okreslonej pozycji dana bitmape, i jest to chyba szybsze niz kazdorazowe wycinanie jej z wiekszej bitmapy i potem rysowanie.

NIE DZIALA MI W PKT. 3. Nie wiem, co robie zle - program pada na segmetation fault, i tracing pokazuje tylko na Application.Run, czyli w sumie nigdzie.
Moze ktos madrzejszy ode mnie popatrzy na to z uniesionymi brwiami i wyjasni gdzie robie ten cholerny podstawowy blad? :)

0

Rozumiem o co Ci chodzi, ale chyba nie potrafie tego zrobic. Probowalem za to czegos innego (i tez nie udalo sie):

  1. Zrobilem dodatkowy typ:

type Tdigits = array[0..MaxDigits] of TBitmap;

i chce do zmiennej tego typu wczytac wszystkie literki/cyferki, jest ich 10 i sa w ladnych plikach BMP.

  1. Deklaruje zmienna w private ktora bedzie trzymala te bitmapy:
    ...
    private
    digits : Tdigits;

wszystko ladnie sie kompiluje (gdy digits byl w public, delphi sie czepial)

  1. W metodzie CreateForm robie cos takiego:

for i:=0 to MaxDigits do begin
digits[i].Create;
digits[i].LoadFromFile( path + intToStr(i) + '.bmp' );
end;

  1. Potem moge juz rysowac na Canvasie w okreslonej pozycji dana bitmape, i jest to chyba szybsze niz kazdorazowe wycinanie jej z wiekszej bitmapy i potem rysowanie.

NIE DZIALA MI W PKT. 3. Nie wiem, co robie zle - program pada na segmetation fault, i tracing pokazuje tylko na Application.Run, czyli w sumie nigdzie.
Moze ktos madrzejszy ode mnie popatrzy na to z uniesionymi brwiami i wyjasni gdzie robie ten cholerny podstawowy blad? :)

0

przepraszam za podwojnego posta :(

0

A czy utworzyłeś bitmapy w tej tablicy?

--
W poszukiwaniu rozwiązania problemu, najbardziej pomocna jest znajomość odpowiedzi.

0

Oto tak jak ja bym to zrobił mniej więcej :)
[code]
...
const
X=40;
Y=40;
...
private
Digits: array [0..9] of TBitmap;
...
procedure TForm1.FormCreate(Sender: TObject);
var
n: Integer;
Bmp: TBitmap;
begin
Bmp:=TBitmap.Create;
Bmp.LoadFromFile('image2.bmp');
for n:=0 to 9 do
begin
Digits[n]:=TBitmap.Create;
Digits[n].Width:=X;
Digits[n].Height:=Y;
Digits[n].Canvas.CopyRect(Rect(0,0,X,Y),Bmp.Canvas,Rect(Xn,0,Xn+40,40));
end;
Bmp.Free;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
n: Integer;
begin
for n:=0 to 9 do
begin
Digits[n].Free;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
S: String;
n: Integer;
begin
S:=TimeToStr(Now);
for n:=1 to Length(S) do
begin
if S[n]':' then Canvas.Draw(40+(40*n),40,Digits[StrToInt(S[n])]);
end;
end;
[/code]

--
W poszukiwaniu rozwiązania problemu, najbardziej pomocna jest znajomość odpowiedzi.

0

Acha... w ten sposób. Ale widze, ze chyba traktujesz obrazki tak, jakby byly w jednym wiekszym, a ja mam je w osobnych pliczkach. Poza tym, zapomnialem o dodaniu w poprzednich postach indeksu tablicy [i] w digits uzywanym w petli.

Rzecz w tym, ze nie wiem czemu wywala mi sie program po czyms takim:

digits[i].Create; ---> tu jest tworzenie i-tej bitmapy
digits[i].LoadFromFile.... ---> no i wczytywanie... czy to kiszka?

Oczywiscie, wyprobuje Twoj sposob i sprawdze czy dziala. :) Mam nadzieje, ze jakos to rozwiaze...

--
-Pio-

0

digits[i].Create;

powinno być digits[i]:=TBitmap.Create; :)

hehe bug w forum, albo kolizja digits[i] włacza podkreślenie :D [/i][/i][/i] i w nawiasach kwadrtowych o to mi chodzi to powinno byc zaraz po digits ale wcina ze wzgledu na BBCode :) Także uwaga nie używac zmiennych i, b, u, code, url, email, qute i img w odwołaniu do elementu tablicy :D

--
W poszukiwaniu rozwiązania problemu, najbardziej pomocna jest znajomość odpowiedzi.

0

Spróbuje to napisać dosłownie :) W końcu się uda.

digits[ i ] := TBitmap.Create;

tak mam zrobić? Hm, spróbujemy :)

--
-Pio-

0

Wyłącz przezroczystość na Labelu, a powinno być bez migania:
Label1.Transparent := False;

Więcej nad to nie osiągnieszraczej.

--
Jest jeszcze jeden błąd ... :)
--------Oficjalny kanał----------
Service for programmers w IRC:
Kanał: #4programmers.net
Serwer: warszawa.ircnet.pl
Sieć: POLNet
Port: 6667

0

zrobilem tak. miga jak swietlowka...

zrobilem tez dwa labele, i kazdy ustawialem na odpowiednia tresc, potem visible=true, a poprzedniemu labelowi visible=false

ale to tez miga, bo glupi visible=false powoduje dziwne przerysowanie czegos przy znikaniu.

Dlatego zrezygnowalem z tekstowego licznika i kombinuje z bitmapami :/

--
-Pio-

1 użytkowników online, w tym zalogowanych: 0, gości: 1