Button grafika i naprzemienna instrukcja

0

Witajcie.
Jestem początkujący więc wybaczcie pytanie ale nie mam kogo zapytać.

Mam pytania odnośnie Buttona.
Jak zmienić grafikę Buttona po kliku (chodzi mi o button typu Start/Stop)

Jak zrobić wokół niego przeźroczystość
(wyczytałem tutaj w serwisie że musi być to BMP ż kanałem alfa 32 bity (A8R8G8B8)
lecz to było do przeźroczystości formy - może do buttona jest inaczej, albo ja coś źle zrobiłem lub we właściwościach Buttona musze coś jeszcze zmienić))

Jak zbudować instrukcje w procedurze
Pierwszy klik wykonuje coś tam
Drugi klik wykonuje coś innego
i tak na przemian
Chodzi mi o sam szkielet takiej instrukcji.

I ostatnie jest jakiś wbudowany edytor Buttonów W Delphi 10.1 Berlin
Przypadkiem raz mi się otwarło okienko na środku pod formą wyglądało ja 4 butony niebieskie jeden pod drugim.

0

Jestem początkujący więc wybaczcie pytanie ale nie mam kogo zapytać.

Wiemy kim jesteś, bo Twoje posty są bardzo charakterystyczne.

Jak zmienić grafikę Buttona po kliku (chodzi mi o button typu Start/Stop)

Klasa TButton nie obsługuje grafik, do tego celu możesz użyć np. klasy TBitButton lub TSpeedButton (ten drugi jest kontrolką graficzną, więc wyróżnia się brakiem obsługi focusa). Za wyświetlanie obrazka w obu tych przyciskach odpowiada właściwość Glyph, do której możesz załadować dowolny obrazek z dowolnego źródła.

Jak zrobić wokół niego przeźroczystość

Standardowe kontrolki posiadają standardowy mechanizm malowania swojej powierzchni, zgodny z bieżącym schematem systemu. Jeżeli potrzebujesz niestandardowego malowania to trzeba sobie taki komponent napisać. Albo zrobić protezę przycisku, np. używając komponentu typu TImage.

(wyczytałem tutaj w serwisie że musi być to BMP ż kanałem alfa 32 bity (A8R8G8B8)

Bitmapy 32-bitowe są bardzo rzadko wykorzystywane, natomiast dużo bardziej popularne są grafiki PNG, więc takie sugeruję wykorzystać. Bitmapa też mogła by być i niekoniecznie 32-bitowa. Dla tych obrazów przezroczystość da się ustalić w inny sposób - określając kolor, który na ekranie nie będzie malowany. Są do tego właściwości Transparent oraz TransparentColor.

Jak zbudować instrukcje w procedurze
Pierwszy klik wykonuje coś tam
Drugi klik wykonuje coś innego
i tak na przemian
Chodzi mi o sam szkielet takiej instrukcji.

Na podstawie wartośći logicznej, zapisanej np. w polu klasy formularza. W konstruktorze klasy okna należy ustawić jej początkową wartość, a po kliknięciu sprawdzić jaką ma wartość, wykonać odpowiedni jej kod, a na koniec zanegować jej wartość za pomocą operatora Not:

type
  TForm1 = class(TForm)
  {..}
  private
    FState: Boolean;
  private
    procedure DoIfTrue();
    procedure DoIfFalse();
  end;

{..}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FState := True;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if FState then
    DoIfTrue()
  else
    DoIfFalse();

  FState := not FState;
end;
  • pierwsze kliknięcie - FState zawiera wartość True, więc zostanie wykonana metoda DoIfTrue, na koniec wartość pola jest odwracana,
  • drugie kliknięcie - FState zawiera wartość False, więc zostanie wykonana metoda DoIfFalse, na koniec wartość pola jest odwracana,
  • trzecie kliknięcie - FState znów zawiera wartość True, więc znów zostanie wykonana metoda DoIfFalse, na koniec wartość pola jest odwracana,
  • czwarte kliknięcie - FState znów zawiera wartość True, więc znów zostanie wykonana metoda DoIfTure, i tak dalej, i tak dalej...
0

DZIEKUJĘ BARDZO
Przez Glyph nie wiem czemu mi grafiki PNG nie wchodzą JPG też mam problem wyskakuje: invalid Format
wchodzą tylko BMP
Chociaż mam w uses dodaną obsługę jpeg i png.
Normalnie do komponentu TImage ładują się grafiki tylko przez Glyph mam problem.

A co do konstrukcji procedury świetna sprawa dziękuje, na ty właśnie mi bardzo zależało, dziękuję.
Czy to tak miało by wyglądać?

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if FState then
  Label1.Caption:='instrukcja 1'';
  DoIfTrue()
  else
    DoIfFalse();
 Label1.Caption:='instrukcja 2'';
  FState := not FState;
end;
0

Wybacz zrozumiałem i już się poprawiam
Chyba o to chodziło.
Nie wiem czemu jeszcze mi tych plików przez Glyph nie przepuszcza

procedure TForm1.DoIfTrue();
begin
Label1.Caption:='Instrukcja1';
end;

procedure Tform1.DoIfFalse();
begin
    Label1.Caption:='Instrukcja2';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if FState then
    DoIfTrue()
 else
    DoIfFalse();
  FState := not FState;
end;

0

Przecież Glyph jest typu TBitmap, to jak chcesz do niego załadować JPEG?

Poza tym kody które podajesz nie mają żadnego sesnsu i nawet nie skompilują się (jak ten dwa posty wyżej). Po raz kolejny przypominam - nie posiadasz prawie żadnej wiedzy nawet z podstaw programowania, więc najpierw wypadało by przeczytać jakiś kurs i tę wiedzę sobie przyswoić.

0

Z pierwszym kodem się pośpieszyłem ale że drugi też nie ma racji bytu to już nie mam pojęcia jak to ma wyglądać mi się skompilował i działa ale skoro to też nie tak ma być hm...

A co do Glyph, opisałem że chodzi o zmianę grafiki na buttonie i przeźroczystość to podajesz obsługę grafiki mam Glyph no to próbuje a potem pretensje że pytam i odsyłanie do kursu.
Ach..
Bez nerwów i złości,
Dziękuję za pomoc

0

[...] ale że drugi też nie ma racji bytu to już nie mam pojęcia jak to ma wyglądać mi się skompilował i działa ale skoro to też nie tak ma być hm...

Co nie ma racji bytu? Ten drugi jest prawidłowy i na pewno działa prawidłowo, więc jak najbardziej ma rację bytu. Problem w tym, że kod ten nie służy do ładowania grafik, a do naprzemiennego wywoływania jednej spośród dwóch metod.

A co do Glyph, opisałem że chodzi o zmianę grafiki na buttonie i przeźroczystość to podajesz obsługę grafiki mam Glyph no to próbuje a potem pretensje że pytam i odsyłanie do kursu.

Ale nie opisałeś jakiej klasy używasz, więc podałem nazwy przykładowych klas dla przycisków (łącznie z TImage). Natomiast w kolejnym paragrafie zasugerowałem, że 32-bitowe bitmapy nie są powszechnie stosowane, więc można wykorzystać PNG. Przy czym ani nie kazałem Ci pakować PNG do TBitButton czy TSpeedButton, ani też nigdzie nie wymieniałem obrazów JPEG, które nie wiem po co w ogóle bierzesz pod uwagę.

Jak koniecznie chcesz wykorzystać przyciski typu TBitButton lub TSpeedButton to możesz skorzystać z 32-bitowych bitmap - pod warunkiem, że VCL w Delphi ktore posiadasz, ma zaimplementowaną obsługę takich bitmap oraz pod warunkiem, że masz program, w którym taką grafikę mógłbyś sobie przygotować.

A to że nie wiesz co robisz i nie znasz podstaw programowania wychodzi w każdym Twoim poście, a już szczególnie w tym, w którym dziwisz się, że JPEG nie ładuje się prawidłowo do TBitmap...

Jak chcesz konkretną odpowiedź to konkretnie opisz co masz i z czego korzystasz oraz zadaj konkretne pytanie.

0

To zapytam tak jak zrobić taki buton profesjonalnie.
w jakich właściwościach zamieścić instrukcje zmiany obrazka skoro
piszesz że ten kod nie jest do tego.

Cały czas chce uzyskać efekt zmiany grafiki buttona różni się nie wiele raz obwódka zielona raz czerwona
(start/stop) Chce tez zachować efekt kliknięcia, mogę przygotować taką grafikę. Chce tylko prosić o odpowiedz jak to fachowo zmontować

Docelowo chce okrągły button ale widzę że same z tym problemy udało mi się zrobić z kontrolką TButton ale ze TSpeedButtonem znów problem, może faktycznie nie robi się takich rzeczy w Delphi, może się Delphi z czymś łączy?
Wybacz pytania ale tego nie ma w kursach i książkach

procedure ButtonOkragly(Control: TWinControl);
var
   R: TRect;
   Rgn: HRGN;
begin
   with Control do
   begin
     R := ClientRect;
     rgn := CreateRoundRectRgn(R.Left, R.Top, R.Right, R.Bottom, 100, 100);
     Perform(EM_GETRECT, 0, lParam(@r));
     InflateRect(r,1,1);
     Perform(EM_SETRECTNP, 0, lParam(@r));
     SetWindowRgn(Handle, rgn, True);
     Invalidate;
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ButtonOkragly(SpeedButton1);
end;
Incompatible types: 'TWinControl' and 'TSpeedButton'
0

w jakich właściwościach zamieścić instrukcje zmiany obrazka skoro
piszesz że ten kod nie jest do tego.

Bo zastanawiasz się nad tym gdzie umieścić grafiki w kodzie który podałem, a ten króty podałem służy do odpalania naprzemian dwóch metod, o co pytałeś wcześniej.

Cały czas chce uzyskać efekt zmiany grafiki buttona różni się nie wiele raz obwódka zielona raz czerwona
(start/stop) Chce tez zachować efekt kliknięcia, mogę przygotować taką grafikę. Chce tylko prosić o odpowiedz jak to fachowo zmontować

Fachowo? Napisać komponent na bazie istniejącego, aby móc odziedziczyć całą podstawową funkcjonalność, a dodatkowo określić naprzemienną zmianę grafik i wywoływanie naprzemian dwóch metod (albo jednej z dodatkowym parametrem identyfikującym bieżący stan).

Zrobisz komponent? Nie zrobisz - jeszcze o wiele za wcześnie na to, czego dowodem jest poniższe.

Docelowo chce okrągły button ale widzę że same z tym problemy udało mi się zrobić z kontrolką TButton ale ze TSpeedButtonem znów problem, może faktycznie nie robi się takich rzeczy w Delphi, może się Delphi z czymś łączy?

Same z tym problemy, bo używasz komponentów bez żadnego zrozumienia - do tego bezmyślnie kopiujesz gotowce z sieci i nie starasz się zrozumieć treści błędów zgłaszanych przez kompilator. A błąd jasno mówi o co chodzi:

Incompatible types: 'TWinControl' and 'TSpeedButton'

Istnieje niezgodność typów obiektów - wymagany jest obiekt dziedziczący z TWinControl, a nie TSpeedButton.

Problemem jest to, że klasa TSpeedButton nie dziedziczy z klasy TWinControl, a z TGraphicControl, czyli jest kontrolką graficzną, a nie "okienkową". Dzięki temu kontrolka ta nie posiada uchwytu (graficzne nigdy go nie posiadają), a ten wymagany jest jako pierwszy argument w funkcji SetWindowRgn.

0

Nie zrobię masz racje ale bardzo cenie sobie Twoje rady nawet jak są krytyczne.
Za każdą dziękuje

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