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!
Zamiat labeli użyj canvas'a i na nim rysuj z użyciem buforowania.--W poszukiwaniu rozwiązania problemu, najbardziej pomocna jest znajomość odpowiedzi.
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!
Jesli sie nie myle to label nie bedzie migal jesli bedziesz go wyswietlal na jakims image'u.--Source of life - Programming,
Skateboarding,
Metal.
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! :)
a na moje to label Ci miga bo masz za maly interval, ja mam rowno na 1000 i nic mi nie miga..--Lardux
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
Tylko ze 1s interwal to za malo, chce miec zegar, ktory mierzy z dokladnoscia do 0.01 s i ktory mozna zatrzymac jak stoper.
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
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 :
Rozumiem o co Ci chodzi, ale chyba nie potrafie tego zrobic. Probowalem za to czegos innego (i tez nie udalo sie):
- 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.
- Deklaruje zmienna w private ktora bedzie trzymala te bitmapy:
...
private
digits : Tdigits;
wszystko ladnie sie kompiluje (gdy digits byl w public, delphi sie czepial)
- W metodzie CreateForm robie cos takiego:
for i:=0 to MaxDigits do begin
digits[i].Create;
digits[i].LoadFromFile( path + intToStr(i) + '.bmp' );
end;
- 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? :)
Rozumiem o co Ci chodzi, ale chyba nie potrafie tego zrobic. Probowalem za to czegos innego (i tez nie udalo sie):
- 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.
- Deklaruje zmienna w private ktora bedzie trzymala te bitmapy:
...
private
digits : Tdigits;
wszystko ladnie sie kompiluje (gdy digits byl w public, delphi sie czepial)
- W metodzie CreateForm robie cos takiego:
for i:=0 to MaxDigits do begin
digits[i].Create;
digits[i].LoadFromFile( path + intToStr(i) + '.bmp' );
end;
- 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? :)
przepraszam za podwojnego posta :(
A czy utworzyłeś bitmapy w tej tablicy?
--
W poszukiwaniu rozwiązania problemu, najbardziej pomocna jest znajomość odpowiedzi.
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.
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-
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.
Spróbuje to napisać dosłownie :) W końcu się uda.
digits[ i ] := TBitmap.Create;
tak mam zrobić? Hm, spróbujemy :)
--
-Pio-
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
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-