Przesuwanie tekstu na przycisku paska zadań.

dział ogólny

Przesuwanie tekstu na przycisku paska zadań.

Nowy postprzez Cyfrowy Baron » czwartek, 19 listopada 2009, 11:58

Okna programów umieszczają przyciski z ikonami i tytułem okna na pasku zadań:

pasekzadan.png


Chciałbym zrobić przesuwanie tekstu na tym przycisku, gdy jest za długi. Zamiast zegara TTimer wykorzystam zdarzenie OnIdle aplikacji, dzięki czemu nie będzie to opóźniało w żaden sposób działania programu.

Ze zdarzeniem OnIdle nie ma problemu, jednak nie pamiętam jak dobrać się do tego tekstu na tym przycisku. Wydaje mi się, że już kiedyś coś takiego robiłem, wtedy z zegarem, lecz nie mogę sobie tego przypomnieć, a nie szczególnie chce mi się teraz wyciągać i przeglądać stare projekty.

Proszę o jakieś wskazówki.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Przesuwanie tekstu na przycisku paska zadań.

Nowy postprzez Pitek » czwartek, 19 listopada 2009, 16:11

Bezpośrednie odniesienie wygląda tak:
Kod: Zaznacz cały
Application->Title="Nazwa_programu";

Nie wiem czy o to chodzi ale pisze co wiem :)
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
PodziÄ™kowaÅ‚ : 43
OtrzymaÅ‚ podziÄ™kowaÅ„: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: Przesuwanie tekstu na przycisku paska zadań.

Nowy postprzez Cyfrowy Baron » czwartek, 19 listopada 2009, 16:56

To nie to. Na tym przycisku wyświetlana jest właściwość Caption formularza, ale nie mogę tym sterować, gdyż będzie się zmieniał nie tylko tekst na przycisku paska zadań, lecz również na belce tytułowej okna.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Przesuwanie tekstu na przycisku paska zadań.

Nowy postprzez Pitek » czwartek, 19 listopada 2009, 17:13

Nie zgodze się z tym ponieważ zrobiłem test nazwałem Form1 "Pasek góra" a w zdarzeniu OnCreate dałem:
Kod: Zaznacz cały
Application->Title="Pasek dół";

Efekt był taki że na psku okienka programu miałem napis "Pasek góra" a na pasku zadań "Pasek dół" jeżeli nie o to chodzi to nie rozumie wypowiedzi powyżej.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Ostatnio edytowano czwartek, 19 listopada 2009, 20:33 przez Pitek, Å‚Ä…cznie edytowano 1 raz
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
PodziÄ™kowaÅ‚ : 43
OtrzymaÅ‚ podziÄ™kowaÅ„: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: Przesuwanie tekstu na przycisku paska zadań.

Nowy postprzez Cyfrowy Baron » czwartek, 19 listopada 2009, 19:35

Po pierwsze, jeżeli chcesz, żeby Twoje aplikacje uruchamiały się nie tylko na Twoim komputerze, ale również na komputerach innych użytkowników, to musisz je kompilować razem z bibliotekami.

Co do Twojej uwagi to oczywiście stanie się tak tylko jeżeli z projektu np. Project1.cpp usuniesz wpis:

Kod: Zaznacz cały
SetApplicationMainFormOnTaskBar(Application, true);


Zawartość pliku Project1.cpp:
Kod: Zaznacz cały
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try
    {
         Application->Initialize();
         SetApplicationMainFormOnTaskBar(Application, true);
         Application->Title = "Testowa aplikacja";
         Application->CreateForm(__classid(TForm1), &Form1);
         Application->Run();
    }
    catch (Exception &exception)
    {
         Application->ShowException(&exception);
    }
    catch (...)
    {
         try
         {
             throw Exception("");
         }
         catch (Exception &exception)
         {
             Application->ShowException(&exception);
         }
    }
    return 0;
}
//---------------------------------------------------------------------------


Jeżeli ta funkcja znajduje się w tym pliku, to na przycisku paska zadań wyświetla się dokładnie to samo co na pasku tytułowym.

Rzecz w tym, że ja zmieniam wartość paska tytułowego w zależności od operacji wykonywanych w programie, więc zawartość przycisku na pasku zadań też zmienia mi się automatycznie. To mi jednak przypomina, ze kiedyś robiłem to właśnie za pomocą funkcji Application->Title, w tej sytuacji nie pozostaje mi nic innego jak usunąć wspomnianą wyżej funkcję i przepisywać właściwość Caption formularza do właściwości Title aplikacji. W ten sposób Title będzie niezależne od Caption.

Pozostaje jednak nierozwiązana kwestia długości przycisku na przycisku paska zadań, a co za tym idzie długości wyświetlanego tekstu. Gdybym miał uchwyt do tego przycisku mógłbym sprawdzić jego rozmiar.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Przesuwanie tekstu na przycisku paska zadań.

Nowy postprzez Pitek » czwartek, 19 listopada 2009, 20:34

Teraz poprawiony zalÄ…cznik
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
PodziÄ™kowaÅ‚ : 43
OtrzymaÅ‚ podziÄ™kowaÅ„: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: Przesuwanie tekstu na przycisku paska zadań.

Nowy postprzez Cyfrowy Baron » czwartek, 19 listopada 2009, 22:11

To już bez znaczenia. Ta kwestia została wyjaśniona, chyba, że masz coś nowego?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Przesuwanie tekstu na przycisku paska zadań.

Nowy postprzez Cyfrowy Baron » piÄ…tek, 20 listopada 2009, 16:32

Problem rozwiązałem.
Podaję rozwiązanie, gdyby ktoś był zainteresowany:

Przed wszystkim należy z pliku projektu, no. Project1.cpp usunąć funkcję SetApplicationMainFormOnTaskBar(Application, true);

Do sterowania tekstem na przycisku paska zadań wykorzystałem zdarzenie OnIdle aplikacji, zamiast Timera, gdyż to zdarzenie wykorzystuje Proces bezczynności systemu, więc jest wywoływane tylko wtedy gdy procesor nie jest zajęty, czyli gdy pozostaje choć niewielki procent wolnego czasu procesora. Jeżeli więc aplikacja nie wykonuje żadnych działań lub wykonywane zadania zajmują mniej niż <100% czasu procesora. Proces bezczynności systemu dotyczy wszystkich uruchomionych programów i usług.
Zdarzenie OnIdle jest generowane przez system i wysyłane do aplikacji.

Być może mój opis tego zdarzenia nie jest zbyt dokładny, ale staram się to opisać w przystępny sposób bez recytowania regułek.

W celu utworzenia tego zdarzenia w pliku nagłówkowym formularza głównego w sekcji private lub public deklarujemy funkcje, której nazwa jest dowolna, lecz argumenty są ściśle zdefiniowane i nie mogą być inne:


plik nagłówkowy np. Unit1.h
Kod: Zaznacz cały
private:
        void __fastcall appIdle(TObject *Sender, bool &Done);


Następnie w konstruktorze klasy formularza głównego pliku źródłowego podpinamy zdarzenie OnIdle aplikacji pod tą właśnie funkcję, dokładnie tak jak się podpina zdarzenia pod obiekty tworzone dynamicznie. Następnie definiujemy funkcję:

plik źródłowy np. Unit1.cpp
Kod: Zaznacz cały
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    Application->OnIdle = appIdle;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::appIdle(TObject *Sender, bool &Done)
{
  static int t = 0;
  t++;
  String title = "                              " + this->Caption + "     ";
  if(t > title.Length()*3) t = 0;

  Application->Title = title.SubString(t/3, title.Length());
}
//---------------------------------------------------------------------------


I to wszystko. Funkcja zawiera już kod sterujący przesuwaniem tekstu. Do opóźnienia przesuwania nie można użyć funkcji Sleep gdyż wywoływałaby ona zawieszenie aplikacji mimo iż byłaby umieszczona w zdarzeniu OnIdle, gdyż nie należy mylić tego zdarzenia z odrębnym procesem. Do opóźnienia użyłem tutaj mnożnika w postaci liczby o wartości 3, czyli tekst jest przesuwany co trzecie tyknięcie zdarzenia. Zdarzenie OnIdle działa podobnie jak zegar TTimer, ale tyka chyba trochę szybciej, a na pewno nieregularnie. Można by z pomocą tego zdarzenia stworzyć zegar, lecz wymagałoby to użycia specjalnych funkcji synchronizujących odmierzany czas z zegarem BIOS'u. Co oczywiście da się zrobić.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 34 gości

cron