Jak wymusić użycie własnych kolorów dla standardowych komponentów?

0

Od Delphi XE, po pojawieniu się możliwości wyboru stylu (Appearance) kolory wszystkich komponentów typu TEdit, TPanel, … zmieniane sa automatycznie na zgodne ze stylem. Jak można to ominąć i zmusić aplikację do ustawienia dowolnego koloru dla wybranych komponentów TPanel, TEdit, itp.?

0

Na początek spróbuj powyłączać Parent.Color.

0

To już przerabiałem, ta możliwość wyboru stylu jest bardzo fajna, ale nie pozwala ani na zmianę koloru tła, ani koloru napisów. TLabel pozwala, co prawda, na zmianę koloru gdy Transparent = False ale koloru napisu już nie...

0

Wsparceie stylów po to właśnie zostało wprowadzone, aby kontrolki dostosowywały swój wygląd do reszty systemu. Przeczytaj ten artykuł: Changing the color of Edit Controls with VCL Styles Enabled.

Jeśli o panele chodzi to możesz też skorzystać z tych podpowiedzi.

0

No to mam roboty w piguły. TEdity jakoś przeboleję. Spróbuję z TPanelami (druga podpowiedź). Zobaczę co z tego wyjdzie.
Dzięki za podpowiedź, nie potrafiłem sformułować pytania do wujka Google, żeby coś takiego wyłuskać.

0

Może FireMonkey rozwiąże twój problem. Otrzymasz o wiele większe możliwości dostosowania wyglądu, niestety są też i minusy, bardzo dużo zaawansowanych komponentów nie istnieje na tą technologię.

0

Podchodzę do tego FireMonkey jak pies do jeża. Mam dosyć rozbudowany projekt komponenty z różnych epok i nie zawsze to wszystko z sobą współgra. Chyba będę jednak musiał coś z tym zrobić bo to b. fajne narzędzie.
Dzięki za podpowiedź.
A tak z innej beczki. Wiesz może jak poszerzyć scrollbara w Delphi XE 10.2?

0

ale jak to poszerzyć? jego wielkość może być dowolna, ustawiasz myszką. Chyba że masz na myśli tą kreskę w środku? Jej szerokość zależy od PageSize

0

Chodzi mi o paski przewijania (pionowy i poziomy) w TScrollBox, TMemo, TListBox itp.

0
procedure System_ScrollBar_Set_Width(p_width: integer);
var
  s: string;
  r: TRegistry;
  value: Integer;
begin
  // http://winaero.com/blog/how-to-change-the-size-of-scrollbars-in-windows-10/
  if p_width <= 0 then  Exit;

  value := -15*p_width;
  

  s := uppercase( ComputerName() );
  // bez warunku !!!if Pos('OEM',s)=1 then
  begin
    r :=  TRegistry.Create;
    r.RootKey := HKEY_CURRENT_USER;

    if r.OpenKey('\Control Panel\Desktop\WindowMetrics',False) then
    begin
      r.WriteString('ScrollWidth',inttostr(value));
      r.WriteString('ScrollHeight',inttostr(value));
    end
    else
    begin
      showmessage('error  System_ScrollBar_Set_Width');
    end;
    r.free;
  end;
end;

Tylko że to działa na cały system operacyjny :(
(u mnie to dziala bo moja aplikacja jest jedyna w systemie ;) )

Alternatywne rozwiazanie to np. używanie AlphaSkin https://www.alphaskins.com (ja polecam)
I tam jest własciwość TsSkinManager.ScrollsOptions.ScrollSize

0
Adamek Adam napisał(a):

Tylko że to działa na cały system operacyjny :(

Przecież dłubiesz w rejestrze, to czego się spodziewałeś? ;)

Alternatywne rozwiazanie to np. używanie AlphaSkin https://www.alphaskins.com (ja polecam)
I tam jest własciwość TsSkinManager.ScrollsOptions.ScrollSize

Te kontrolki są świetne, jednak trochę kosztują. Na pewno za pomocą WinAPI da się zmienić rozmiar tych elementów – skoro system potrafi to zrobić podczas skalowania, to i samemu też można to zrobić. Trzeba tylko wiedzieć jak robi to system, więc trzeba by trochę poczytać i potestować.

0

Ta podmiana kolorów Wg https://stackoverflow.com/questions/10309190/how-i-can-change-the-color-of-a-tpanel-with-the-vcl-styles-enabled działa be zarzutu. Dalej jednak nie wiem jak TEdita zmusić do przybrania oczekiwanej barwy....

1

@furious programming: można za pomocą winapi, ale też zmieniasz dla całego systemu:

var
  NCMet: TNonClientMetrics;
begin
  FillChar(NCMet, SizeOf(NCMet), 0);
  NCMet.cbSize:=SizeOf(NCMet);
  SystemParametersInfo(SPI_GETNONCLIENTMETRICS, SizeOf(NCMet), @NCMet, 0);
  NCMet.iScrollWidth:=120;
  SystemParametersInfo(SPI_SETNONCLIENTMETRICS, SizeOf(NCMet), @NCMet, SPIF_SENDCHANGE);
end;  
0

jednak dalej będę obstawał że w przypadku gdy aplikacja ma mieć niestandardowy interfejs to lepszym rozwiązaniem będzie FireMonkey (no w ostateczności skórkowanie). Sam szczerze nie za bardzo lubię to rozwiązanie ale jednak daje dużo większe możliwości sterowania wyglądem, prostej animacji czy też efektów graficznych (chociażby efekt ramki w przypadku błędnego wypełnienia pola edycyjnego). Nawet nie chcę wspominać o możliwości tworzenia aplikacji wieloplatformowej (jestem właśnie po pierwszym prostym komercyjnym projekcie i dałem jakoś radę).
Niestety większość standardowych kontrolek dziedziczy po WinAPI i dużo nie da się zrobić bez wpływania na system a to zazwyczaj nie jest wskazane.
Inna możliwość to tworzenie własnych kontrolek ale to już inna kwestia.

0

Dzięki, wypróbuję. Wolałbym mieć kontrolę nad każdym z komponentów z osobna. Trochę więcej pracy tylko będzie.

Do Paweł Dmitruk.
Działa to. Tylko nie wiem dlaczego program, po wykonaniu tej procedury się przywiesza

0

@robertz68: są trzy główne możliwości stworzenia własnego interfejsu: albo za pomocą VCL/FMX i wszelkich dobrodziejstw wbudowanych kontrolek (obsługa własnych stylów); albo za pomocą darmowych lub płatnych kontrolek firm trzecich, które też pozwalają na manipulowanie ich stylem i całych okien; albo za pomocą własnych komponentów, pisanych mniej więcej od absolutnych podstaw.

Oczywiście najlepszym rozwiązaniem jest skorzystanie z gotowego rozwiązania, które jest pisane przez ludzi znających się na rzeczy, działające prawidłowo i przetestowane przez tysiące użytkowników. Stworzenie komponentów od podstaw to robota trudna, żmudna i bardzo wymagająca – tym bardziej, jeśli oprócz tworzenia niestandardowych komponentów, trzeba też przerabiać te kontrolowane przez system. Trudno też jest zaimplementować w 100% poprawnie działające renderowanie obramowania okien, czyli elementów nie znajdujących się wewnątrz klienta – nawet Firefox momentami nie potrafi tego robić prawidłowo.

Co prawda można trochę pokombinować i stworzyć imitację własnego obramowania (ustawiając jego brak i malując własne wewnątrz klienta), jednak to zmniejsza funkcjonalność okna (brak wsparcia systemowego menu via Alt+Space i funkcji w nim dostępnych), a ich dorabianie wymaga znów sporo pracy i kombinacji, co niekoniecznie będzie działać na każdym systemie.

0

Do fp
korzystam z komponentów innych firm (TMS), ale one też poddają się stylizacji (nie wszystkie). Przy prostym projekcie podmiana kontrolki to pikuś. Przy rozbudowanych, to droga przez mękę. Delphi bardzo źle znosi dziedziczenie formatek a tworzenie wszystkiego dynamicznie (bez użycia *dfm) też proste nie jest. Na razie wystarcza mi to rozwiązanie, które na początku zaproponowałeś.

0

" Jak wymusić użycie własnych kolorów dla standardowych komponentów? " W inspektorze danej kontrolki - StyleElements: seFont, seClient, seBorder (True/False).

0

Ha,Ha, najprostsze z rozwiązań, tyle tego szukałem i nie znalazłem. Dzięki za pomoc:)

0

Sorka, ale rzeczywiście przeoczyłem. Dzięki:)

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