Discussion:
Jak zmienić kolor komponentu TPanel
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
s s
2007-07-25 20:39:44 UTC
Permalink
Napisałem program na pewną linię produkcyjną, który ma na formatce panel
(TPanel) (zmianą koloru sygnalizuje stany programu).
W odpowiednich miejscach programu zmianiam kolor i po tym ludzie wiedzą "o co
chodzi" w danej chwili.
Skrupulatnie klikałem na swoim kompie algorytmy, wszystko mi działało.
Działało na służbowym kompie, laptopie, na swoim domowym i na wszystkich
innych komputerach.
Nie działa tylko na tym docelowym.
W domu nawet zasymulowałem identyczną instalację jak na kompie docelowym.
Komp to jakiś Dell z Celeronem 1,7 GHz, WXP + SP2 + poprawki, zainstalowany
BDE oraz OpenOffice.
Soft napisany w TDP 2006 (legalnym oczywiście).
Procedury zmiany koloru wyglądaja następująco:
[code]
procedure TForm1.Panels_Red();
begin
Panel1.Color:= clRed;
end;
[/code]
[code]

procedure TForm1.Panels_Green();
begin
Panel1.Color:= clLime;
end;
[/code]
No i nie działa ...
Dodałem na główną formę komponent ListBox, przepisałem procedury jak poniżej:
[code]
procedure TForm1.Panels_Red();
begin
Panel1.Color:= clRed;
ListBox1.Items.Add('Zmiana na czerwony, wywołanie z PanelRed');
end;
[/code]
[code]

procedure TForm1.Panels_Green();
begin
Panel1.Color:= clLime;
ListBox1.Items.Add('Zmiana na zielony, wywołanie z PanelGreen');
end;
[/code]
Dalej nie działa ..., ale do listbox dopisywane sa komunikaty z wnętrza
procedury, czyli procedura się wykonuje.

Wreszcie napisałem malutką wprawkę, która zmienia kolor tylko na pustej
formatce.
Kod mniej więcej taki:
[code]procedure TForm1.RadioButton2Click(Sender: TObject);
begin
Panel1.Color:= clBlue;
end;

procedure TForm1.RadioButton3Click(Sender: TObject);
begin
Panel1.Color:= clYellow;
end;
[/code]
He, działa!

No więc w swoim sofcie zmieniam ręcznie kolor panelu na clLime, aby domyślnie
po uruchomieniu był zielony.
Uruchamiam na docelowym kompie i .... nie działa !
Kolor panelu szary!

Nie poddaję sie, dopisuję do procedury kolejny kod:
[code]
procedure TForm1.Panels_Red();
begin
Panel1.Color:= clRed;
Panel1.Caption:= 'CZERWONY';
ListBox1.Items.Add('Zmiana na czerwony, wywołanie z PanelRed');
end;
[/code]
[code]

procedure TForm1.Panels_Green();
begin
Panel1.Color:= clLime;
Panel1.Caption:= 'ZIELONY';
ListBox1.Items.Add('Zmiana na zielony, wywołanie z PanelGreen');
end;
[/code]
He, działa, ale tylko w połowie!
Zmienia Caption na panelu, do listboksa dodaje mi ładnie wpisy, a kolor się
nie zmiania!

Co jest do ch...ry?
Zgłupiałem!

Może ktoś coś mądrego wymyśli?
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
zeman
2007-07-25 20:49:51 UTC
Permalink
Juz mialem zaproponowac po Panel.Colot:= kolor; dac dodatkowo Panel.Repaint,
ale mowi Pan, ze Caption sie zmienia, no to ciekawe dosyc. A tak:
procedure TForm1.Panels_Green();
begin
ShowMessage(IntToStr(Panel1.Color));
Panel1.Color:= clLime;
ShowMessage(IntToStr(Panel1.Color));
end;

Zmienia sie wartosc ?
Nic innego mi go glowy nie przychodzi poki co.. a moze Panels_Green
wywolywane jest w innym watku ?
--
Pozwiodronka,
Zeman.
www.web2biz.pl - strony www z uwzględnieniem web-usability
apl
2007-07-26 20:07:32 UTC
Permalink
Post by zeman
Juz mialem zaproponowac po Panel.Colot:= kolor; dac dodatkowo Panel.Repaint,
procedure TForm1.Panels_Green();
begin
ShowMessage(IntToStr(Panel1.Color));
Panel1.Color:= clLime;
ShowMessage(IntToStr(Panel1.Color));
end;
Zmienia sie wartosc ?
Nic innego mi go glowy nie przychodzi poki co.. a moze Panels_Green
wywolywane jest w innym watku ?
--
Pozwiodronka,
Zeman.www.web2biz.pl- strony www z uwzględnieniem web-usability
dorzuć może Application.processMessages...
jh
2007-07-25 20:53:10 UTC
Permalink
Masz w uses XP Manifest?

jh
Grzegorz Skoczylas
2007-07-25 23:06:29 UTC
Permalink
Post by s s
Napisałem program na pewną linię produkcyjną, który ma na formatce panel
(TPanel) (zmianą koloru sygnalizuje stany programu).
W odpowiednich miejscach programu zmianiam kolor i po tym ludzie wiedzą "o co
chodzi" w danej chwili.
Skrupulatnie klikałem na swoim kompie algorytmy, wszystko mi działało.
Działało na służbowym kompie, laptopie, na swoim domowym i na wszystkich
innych komputerach.
Nie działa tylko na tym docelowym.
[...]
Może ktoś coś mądrego wymyśli?
Jeżeli na tym docelowym komputerze jest Vista to, o ile się nie mylę,
zmiana koloru zacznie działać gdy właściwość Panel.ParentBackground
zmienisz na True.

Nie mam teraz pewności - nie mam tu Visty żeby to sprawdzić.
--
Pozdrawiam,

Grzegorz Skoczylas
http://gskoczylas.rekord.pl
----------------------------------------------
Sebcio
2007-07-26 11:09:40 UTC
Permalink
Post by Grzegorz Skoczylas
Jeżeli na tym docelowym komputerze jest Vista to, o ile się nie mylę,
zmiana koloru zacznie działać gdy właściwość Panel.ParentBackground
zmienisz na True.
Chyba odwrotnie, bo domyślnie ParentBackground = True. Dopiero zmiana
na False powoduje że Color ma znaczenie.
--
Pozdrawiam,
Sebcio
s s
2007-07-26 10:05:27 UTC
Permalink
Zmieniłem procedurę w sposób, jak zaproponowałeś:
procedure TForm1.Panels_Red();
begin
ListBox1.Items.Add(IntToStr(Panel1.Color));
Panel1.Color:= clRed;
ListBox1.Items.Add(IntToStr(Panel1.Color));
end;

Na list box jest wpis:
65280 //zielony
255 // czerwony
255
65280

Czyli, właściwość color jest zmieniana z zielonej na czerwoną, a następnie
drugie wywołanie funkcji zmienia czerwony na zielony, czyli tak, jak ma być.
Problem jest w tym, że zmiana koloru na panelu jest niewidoczna, panel
jest "naturalnie" szary.

Ja chyba odpuszczę temat. Prościej jest mi ładować bitmapy do kontrolki
TImage niż szukać błędu.
Wszystko oczywiście kosztem zużycia pamięci i wielkości pliku wynikowego.
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Marcin (news)
2007-07-26 15:12:29 UTC
Permalink
Post by s s
procedure TForm1.Panels_Red();
begin
ListBox1.Items.Add(IntToStr(Panel1.Color));
Panel1.Color:= clRed;
ListBox1.Items.Add(IntToStr(Panel1.Color));
end;
65280 //zielony
255 // czerwony
255
65280
Czyli, właściwość color jest zmieniana z zielonej na czerwoną, a następnie
drugie wywołanie funkcji zmienia czerwony na zielony, czyli tak, jak ma być.
Problem jest w tym, że zmiana koloru na panelu jest niewidoczna, panel
jest "naturalnie" szary.
Ja chyba odpuszczę temat. Prościej jest mi ładować bitmapy do kontrolki
TImage niż szukać błędu.
Wszystko oczywiście kosztem zużycia pamięci i wielkości pliku wynikowego.
W takim razie wina leży po stronie właściwości, o której ktoś tu
wspomniał ParentBackground, lub podobnej, która blokuje zmianę koloru.
Zrób też może:

Panel1.Color:= clRed;
Panel1.Invalidate;

Marcin
jh
2007-07-26 18:50:07 UTC
Permalink
Pisałem Ci o XP Manifest. Sprobuj go usunąć, jeśli jest w uses/jako
komponent na formie.

jh
utak3r
2007-08-01 06:09:42 UTC
Permalink
Post by jh
Pisałem Ci o XP Manifest. Sprobuj go usunąć, jeśli jest w uses/jako
komponent na formie.
tak btw, ja kiedyś w programie, który również używa kolorów paneli,
dodałem XP Manifest, zobaczyłem, że przestało działać, wyrzuciłem i...
już nigdy nie zadziałało ponownie ;)

pozdrawiam
--
Piotr "utak3r" Borys
http://utak3r.pl
jh
2007-08-01 21:26:47 UTC
Permalink
Post by utak3r
Post by jh
Pisałem Ci o XP Manifest. Sprobuj go usunąć, jeśli jest w uses/jako
komponent na formie.
tak btw, ja kiedyś w programie, który również używa kolorów paneli,
dodałem XP Manifest, zobaczyłem, że przestało działać, wyrzuciłem i...
już nigdy nie zadziałało ponownie ;)
Wyrzuciłeś sam komponent? A pozostał unit/dcu... ;)

Jacek
utak3r
2007-08-02 07:46:31 UTC
Permalink
Post by jh
Post by utak3r
tak btw, ja kiedyś w programie, który również używa kolorów paneli,
dodałem XP Manifest, zobaczyłem, że przestało działać, wyrzuciłem i...
już nigdy nie zadziałało ponownie ;)
Wyrzuciłeś sam komponent? A pozostał unit/dcu... ;)
no comment ;) o uses jakos nie pomyslalem :] zapodalem tylko pelnego builda.

pozdrawiam
--
Piotr "utak3r" Borys
http://utak3r.pl
s s
2007-07-27 09:39:32 UTC
Permalink
Panowie, próbuję wszystkie wasze rady i niestety, nie działa.
Nie mam róznież XPManifest na formatce ani w uses.
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Fox
2007-07-30 19:26:15 UTC
Permalink
Post by s s
Panowie, próbuję wszystkie wasze rady i niestety, nie działa.
Nie mam róznież XPManifest na formatce ani w uses.
Może kolory w karcie graficznej są ustawione na jakieś 256.
Misiekd
2007-08-06 21:31:17 UTC
Permalink
...
a zmień w OI właściwość ParentBackground Na True i na False. Ważne, żeby
najpierw przełączyć na true i z powrotem na false. To taki mały bug Delphi.
--
Pozdrawiam Misiekd
Loading...