CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Screenshot z okna

Screenshot z okna

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Re: Screenshot z okna

Nowy postprzez Arnold_S » piątek, 2 września 2016, 23:18

...ja też nie :(
Avatar użytkownika
Arnold_S
Homos antropiczny
Homos antropiczny
 
Posty: 58
Dołączył(a): niedziela, 12 czerwca 2016, 23:22
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: Win7 64b
Kompilator: C++ Builder 6, Rad Studio XE2
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez Cyfrowy Baron » piątek, 2 września 2016, 23:27

Arnold_S napisał(a):1. Czy definicje funkcji mogą być w pliku unit1.cpp, a deklaracje muszą być w unit1.h? - jeśli tak to gdzie dokładnie?
2. Czy na odwrót?
3. Czy w 1 przypadku, w pliku unit1.h zaraz pod includami muszę wpisać zmienne globalne z pliku unit1.cpp z dodatkiem extern?


1.
Definicja może być jednocześnie deklaracją, wtedy wystarczy ją umieścić w pliku źródłowy, Należy jednak zachować w takiej sytuacji odpowiednią kolejność. Taka funkcja musi znajdować się nad funkcją, która ją wywołuje, przykłady:

Prawidłowo:
KOD cpp:     UKRYJ  
void MojaFunkcja(void)
{
//coś tak robi
}
//-----------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 MojaFunkcja();
}


Nieprawidłowo:
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 MojaFunkcja();
}
//-----------------------------------------------------
void MojaFunkcja(void)
{
//coś tak robi
}


Jeżeli tworzysz oddzielnie deklarację i definicję, wtedy umieszczasz deklarację w pliku nagłówkowym w sekcji private o ile funkcja ma być metodą klasy formularza, ale wtedy musisz ją przypisać do tego formularza w definicji, przykład:

Prawidłowo:
KOD cpp:     UKRYJ  
//plik nagłówkowy
private:
        void MojaFunkcja(void);

// dalej w pliku źródłowym
void TForm1::MojaFunkcja(void)
{
// coś tam robi.
}


Nieprawidłowo:
KOD cpp:     UKRYJ  
//plik nagłówkowy
private:
        void MojaFunkcja(void);

// dalej w pliku źródłowym
void MojaFunkcja(void)
{
// coś tam robi.
}


Jeżeli deklarujesz funkcję w sekcji public, wtedy może, ale nie musi być metodą klasy formularza.

2.
Na pewno nie na odwrót.

3.
W żadnym razie. extern umieszczasz tylko wtedy, gdy tworzysz funkcje globalne w oddzielnych plikach (nagłówkowym i źródłowym) i włączasz te pliki do projektu aplikacji. Ale nawet w takiej sytuacji eksportujesz te funkcje w pliku nagłówkowym. Jeżeli jednak tworzysz oddzielny plik z funkcjami - tylko plik CPP, czyli źródłowy, bo i tak można, to wtedy używasz extern w tym pliku zaraz pod sekcją include. extern w pliku źródłowym używa się również w przypadku tworzenia np. bibliotek DLL.

Zauważ, że jeżeli tworzysz oddzielny plik z funkcjami w kombinacji *.CPP + *.H, to w aplikacji w sekcji include włączasz plik nagłówkowy *.H, np:

KOD cpp:     UKRYJ  
#include "modul.h"


w takim przypadku wszystkie deklaracji muszą znajdować się w tym pliku. Gdybyś tworzył tylko plik źródłowy i rezygnujesz z nagłówkowego, to wtedy włączasz taki plik do projektu:

KOD cpp:     UKRYJ  
#include "modul.cpp"

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Arnold_S
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez polymorphism » sobota, 3 września 2016, 09:59

(...) to wtedy włączasz taki plik do projektu:
KOD cpp:     UKRYJ  
#include "modul.cpp"

Załączanie plików źródłowych w ten sposób to bezsens, bo czym ten plik przy takim użyciu różni się od pliku nagłówkowego? W C/C++ definicje/implementacje funkcji daje się do pliku źródłowego, deklaracje do pliku nagłówkowego (jeśli oczywiście chcesz ich użyć w innych jednostkach kompilacji). Wyjątkiem są metody definiowane wewnątrz definicji klasy i funkcje szablonowe.

3. Czy w 1 przypadku, w pliku unit1.h zaraz pod includami muszę wpisać zmienne globalne z pliku unit1.cpp z dodatkiem extern?

Jeśli chcesz mieć dostęp do zmiennych globalnych, to tak, w pliku H powinny znaleźć się deklaracje zmiennych poprzedzone słowem extern.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Arnold_S
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez Cyfrowy Baron » sobota, 3 września 2016, 11:40

polymorphism napisał(a):Załączanie plików źródłowych w ten sposób to bezsens


To prawda, ale jest to możliwe.

polymorphism napisał(a):Jeśli chcesz mieć dostęp do zmiennych globalnych, to tak, w pliku H powinny znaleźć się deklaracje zmiennych poprzedzone słowem extern.


Tyczy się to jednak tylko sytuacji w której deklaracje znajdują się poza deklaracjami klasy formularza. Można jednak definiować zmienne globalne od razu w pliku źródłowym pod sekcją include i wtedy nie trzeba już nigdzie używać extern. Będą one jednak dostępne tylko w tej jednostce, w której zostały zadeklarowane.

KOD cpp:     UKRYJ  
public:         // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;

extern void MojaFunkcja(void);
//---------------------------------------------------------------------------
#endif


Jeżeli umieszczę zmienną globalną w sekcji public pliku nagłówkowego nie używam extern. Jest ona dostępna globalnie dla wszystkich np. formularzy w projekcie, tylko musi być prawidłowo zaadresowane.

W poprzednim opisie wkradł się błąd. Zmienna czy funkcja zadeklarowana w sekcji public, staje się metodą tej jednostki, jest jednak dostępna poza klasą, w przeciwieństwie do zmiennej czy funkcji zadeklarowanych w sekcji private, które stają się metodą tej klasy, ale nie są dostępne już poza tą klasą.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez polymorphism » sobota, 3 września 2016, 13:26

Jeżeli umieszczę zmienną globalną w sekcji public pliku nagłówkowego nie używam extern.

Nie ma czegoś takiego jak "sekcja public pliku nagłówkowego". Jest co najwyżej sekcja public wewnątrz definicji klasy. Tam oczywiście extern przed polami dawać nie trzeba (bo i po co?).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez Cyfrowy Baron » sobota, 3 września 2016, 15:30

Tak, tak... Odwieczny problem z uproszczeniami...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez Arnold_S » wtorek, 6 września 2016, 00:42

Wielkie dzieki!! Sporo poprawiłem :]

Krótkie pytanko: czy moglibyście wyjaśnić mi jak działa obiekt z zakładki Samples\CGauge?
Szukam jakichś konkretnych przykładów w googlach...i nie bardzo mogę znaleźć.
Chodzi mi o to jak obsługiwać pasek od 0 do 100% jeśli minimalna wartość to 0 a max to, np. 148.
Umieścić go w Timerze?
Avatar użytkownika
Arnold_S
Homos antropiczny
Homos antropiczny
 
Posty: 58
Dołączył(a): niedziela, 12 czerwca 2016, 23:22
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: Win7 64b
Kompilator: C++ Builder 6, Rad Studio XE2
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez Cyfrowy Baron » wtorek, 6 września 2016, 16:18

Możesz go umieścić w dowolnym zdarzeniu, w którym będzie sterowany postęp tego paska. Postępem paska sterujesz zmieniając jego właściwość Progress:

KOD cpp:     UKRYJ  
CGauge1->Progress = 74;


i w powyższym przykładzie jeżeli MinValue = 0, a MaxValue = 148, to wartość 74 będzie oznaczała dokładnie 50%. Ten pasek nie steruje się automatycznie, czyli nie da się go pod nic podpiąć, żeby sam pokazywał postęp zadania. Trzeba ten postęp zadania oprogramować.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Arnold_S
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez Arnold_S » czwartek, 8 września 2016, 00:03

W CGauge można ustawić kolor tła oraz poruszającego się paska, np.:
KOD cpp:     UKRYJ  
CGauge1->ForeColor = RGB(190,3 ,22);


Będzie to jednolity kolor. Czy da się ten poruszający pasek tak pokolorować aby wyszedł gradient? Dałoby to efekt wypukłego paska postępu.
Avatar użytkownika
Arnold_S
Homos antropiczny
Homos antropiczny
 
Posty: 58
Dołączył(a): niedziela, 12 czerwca 2016, 23:22
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: Win7 64b
Kompilator: C++ Builder 6, Rad Studio XE2
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez Cyfrowy Baron » czwartek, 8 września 2016, 16:48

Nie da się, bo można ustawić tylko jeden kolor.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez Arnold_S » piątek, 9 września 2016, 00:39

Mam problem z Builderem. Po zamknięciu programu chciałem jeszcze wrócić do projektu aby coś poprawić i ku mojemu zdziwieniu pojawił się komunikat. Zauważcie, że nie ma paska z narzędziami ani paska menu. :O Przyznaję, że nic specjalnego nie robiłem...cokolwiek miałoby to znaczyć. Pisałem jakiś drobny projekcik w którym bawiłem się bitmapami, i tyle. Spotkaliście się z czymś takim?

screen.png
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Arnold_S
Homos antropiczny
Homos antropiczny
 
Posty: 58
Dołączył(a): niedziela, 12 czerwca 2016, 23:22
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: Win7 64b
Kompilator: C++ Builder 6, Rad Studio XE2
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez Mironas » piątek, 9 września 2016, 09:16

W oknie "C++ Biulder 6 [...]" pod paskiem tytułu masz wąski fragment pustego okna.
Kliknij tam prawym klawiszem myszki i w menu kontekstowym włącz wszystkie paski (Standard, View, Debug, ...).
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 467
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 22
Otrzymał podziękowań: 66
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Screenshot z okna

Nowy postprzez Arnold_S » wtorek, 20 września 2016, 00:41

Mam kolejny problem.
Załóżmy, że mam umieszczoną w timerze funkcję, która coś tam rysuje. Czasem potrzebuję aby przesunąć kursor myszki w inne miejsce w tym oknie. Wykorzystuję do tego funkcję WinApi - SendInput. Wszystko działa wspaniale, mój problem polega na tym, że wszystko zaczyna się psuć gdy ruszę myszką aby wyłączyć program lub zrobić pauzę.

Czy jest możliwość wyłączenia tego timera, np. jakimś "hotkeyem"? Załóżmy, że klawiszem Esc lub tyldą...tych akurat nie używam w programie.
Coś na kształt:
jeśli (klawisz tyldy nie został wciśnięty)
{ pracuj dalej }
w przeciwnym razie
{ Timer1->Enabled = false }
Avatar użytkownika
Arnold_S
Homos antropiczny
Homos antropiczny
 
Posty: 58
Dołączył(a): niedziela, 12 czerwca 2016, 23:22
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: Win7 64b
Kompilator: C++ Builder 6, Rad Studio XE2
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez Cyfrowy Baron » środa, 21 września 2016, 14:11

Cokolwiek tam kombinujesz, na pewno można zrobić to jakoś inaczej, prościej. Nie znając jednak założeń programu, trudno cokolwiek doradzić. Niemniej jednak spróbuj wstawić do timera funkcje odświeżającą kolejkę komunikatów:

KOD cpp:     UKRYJ  
Application->ProcessMessages();


Kolejna sprawa. Rysuj na płótnie TCanvas obiektu typu TImage, bo ten obiekt "pamięta" (że się tak wyrażę) to co zostało na nim narysowane, czyli sam się odświeża (nie wiem jak to inaczej wyrazić). Jeżeli jednak rysujesz np. na TCanvas np. formularza, panelu obiektu TPaintBox, to przy każdym odświeżeniu takiego obiektu musisz użyć kodu ponownie wszystko odrysowującego. Najlepiej jest więc umieścić taki kod w zdarzeniu OnPaint takiego obiektu, wtedy obiekt sam zadba o odrysowanie. Używanie Timera do rysowania to pomysł poroniony. Jeżeli masz jakieś współrzędne, które zmieniają się w określonych odstępach czasu, to w Timer'ze tylko zmieniasz wartości tych parametrów, ale kod rysujący umieszczasz w zdarzeniu OnPaint obiektu na którym rysujesz, a ten kod pobiera sobie tylko te zmienne parametry.

W załączniku taki przykładowy program z kodem, rysujący wykres. Jeżeli uchwycisz na tym wykresie jakiś punkt to z wciśniętym przyciskiem myszy, możesz go przesuwać. Kod nie jest doskonały, ale pokazuje jak należy rysować. Nie ma tu timera.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Arnold_S
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Screenshot z okna

Nowy postprzez Arnold_S » środa, 21 września 2016, 20:34

Dziękuję za podpowiedzi.
Nie kombinuję nic specjalnego, być może źle ułożyłem pytanie. To może jeszcze raz...

[przykład]
Program pracuje na oknie, w którym zmienia się obraz, np. podgląd z kamery obserwującej podwórko.
Uruchamiam program, który to okno (na którym ma pracować) przesuwa na wierzch ( SetForegroundWindow(); ).
Od tej pory mój program jest jakby pod spodem ale pobiera różne dane z tego okna na wierzchu. Niektóre operacje umieściłem w timerze i to jest problematyczne.
Gdy chcę wyłączyć program, to muszę zminimalizować okno główne lub kliknąć na pasek zadań aby wydobyć na wierzch mój program i dopiero przycisnąć na formatce button "stop". W tym czasie ten timer cały czas działa i psuje moją statystykę i wszystko się chrzani.
Timer ma event "Ontimer", nie ma żadnego eventu "OnKeyPress" czy coś w tym stylu.
Chciałbym zapytać czy gdy mój program jest na "drugim planie", (a okno, które badam jest na pierwszym planie) mogę wywołać w jakiś cudowny, magiczny sposób zatrzymanie tego programu (pętli lub timera), bez użycia myszki? Na przykład klikając jakiś hotkey, który zatrzyma program bez wyszukiwania go myszką pod innymi oknami i zadziała tak samo jak manualne naciśnięcie przycisku STOP.
Avatar użytkownika
Arnold_S
Homos antropiczny
Homos antropiczny
 
Posty: 58
Dołączył(a): niedziela, 12 czerwca 2016, 23:22
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: Win7 64b
Kompilator: C++ Builder 6, Rad Studio XE2
Gadu Gadu: 0
    Windows 7Firefox

Poprzednia stronaNastępna strona

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

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

cron