ďťż

Ładny brzuch

Witam !

Szukałem ale jakoś nie mogę znaleźć. Chcę napisać na szybko program który wykona mi co określony czas zrzut ekranu. Jak zrobić zrzut ekranu i jak zapisać go w jpg wiem -> ściągnąłem kod z tego forum. :P
Wszystko działa, ale pojawił się problem z zapisem. Wszystkie screeny zapisywane są w głównym katalogu dysku c: pod nazwą plik.jpg. Każdy wykonany nowy zrzut zastępuje ten stary. Pytanie jak zrobić, aby po wykonaniu zrzutu i zapisaniu go pod nazwą plik.jpg, następny zrzut zapisywany był pod nazwą plik1.jpg, plik2.jpg, plik3.jpg, itd.

Kod procedury odpowiedzialnej za zrzut:
procedure TForm1.Button1Click(Sender: TObject); var Can: TCanvas; B: TBitmap; j:tjpegimage; begin try { tworzenie zmiennej } Can := TCanvas.Create; { przechwycenie uchwytu ekrnau } Can.Handle := GetWindowDC(GetDesktopWindow); { tworzenie bitmapy } B := TBitmap.Create; B.Width := Screen.Width; B.Height := Screen.Height; B.Canvas.CopyRect(Rect(0, 0, Screen.Width, Screen.Height), Can, Rect(0, 0, Screen.Width, Screen.Height)); try // zapisz plik j:=tjpegimage.create; j.CompressionQuality:=100; j.Assign(b); j.SaveToFile('c:\\plik.jpg'); except // w wyniku bledu... raise Exception.Create('Bład w zapisie pliku...'); end; finally Can.Free; B.Free; j.Free; end; end;



Jeżeli chcesz zmienić katalog to musisz zmienić tam gdzie masz j.SaveToFile, a jeżeli chodzi o nazwę to zrób j.SaveToFile('katalog'+zmienna) gdzie w zmiennej będziesz miał nazwę pliku która po każdym zapisie będzie się zmieniała. Wydaje mi się to najłatwiejszym sposobem.

no właśnie tak kombinuje, ale coś nie za bardzo mi wychodzi. chyba mnie zadanie przerosło :(

Ja bym ten kod umiescil w timerze aktywowanym tym przyciskiem. Nazwe dla pliku komponujesz wg schematu >>'katalog + nazwa_pliku' + inttostr(i) + '.jpg'<< gdzie i sobie za kazdym razem zmieniasz /i := i + 1;/ a na poczatku programu inicjalizujesz /i := 0;/.
I jeszcze sobie czestotliwosc ustawiasz /timer1.Interval/ i masz wszystko.



OK już działa, dzięki za pomoc.
Użytkownik pit83 edytował ten post 16 sierpień 2006, 22:37
Nic dziwnego jak za każdym razem w zdarzeniu ontimer zerujesz zmienna i :lol:

// wojewoda: no jak to do kogo, do kolegi autora :), przeciez odpowiadalem na jego problem, a ty jak sam napisales zerujesz zmienna tylko podczas uruchamiania programu :)
Użytkownik krajew4 edytował ten post 17 sierpień 2006, 08:33

Ja bym ten kod umiescil w timerze aktywowanym tym przyciskiem. Nazwe dla pliku komponujesz wg schematu >>'katalog + nazwa_pliku' + inttostr(i) + '.jpg'<< gdzie i sobie za kazdym razem zmieniasz /i := i + 1;/ a na poczatku programu inicjalizujesz /i := 0;/.
I jeszcze sobie czestotliwosc ustawiasz /timer1.Interval/ i masz wszystko.

Według mnie takie rozwiązanie jest lipne ponieważ przy następnym uruchomieniu programu pliki będą nadpisywane. To albo wartość "I" zapisać do ini czy rejestru a lepiej zapisywać plik pod nazwą daty, godziny, minity isekundy. Przynajmniej będziesz wiedział kiedy twój program zrobił zrzut ekranu

a ja radze nie korzystac z timera tylko watkow
Użytkownik tsukuyomi_reload edytował ten post 17 sierpień 2006, 07:45

Według mnie takie rozwiązanie jest lipne ponieważ przy następnym uruchomieniu programu pliki będą nadpisywane. To albo wartość "I" zapisać do ini czy rejestru a lepiej zapisywać plik pod nazwą daty, godziny, minity isekundy. Przynajmniej będziesz wiedział kiedy twój program zrobił zrzut ekranu
ale po co zapisywac do rejestru? a moze praw nie ma lub rejestr jest przywracany :>
Wystarczy troche checi i tworczego myslenia...
1. pobierasz liste plikow z danym rozszerzeniem (w tym przypadku .jpg)
2. wydzielasz te, ktore maja dana nazwe na poczatku, np. "plik" (tekst przed liczba)
3. majac liste plikow oddzielasz tekst sprzed i po liczbie, by w zmiennej zostaly tylko cyferki...
4. w dowolnej petli sprawdzasz, czy "i" jest rowne numerkowi pliku... jesli nie, to niech tworzy nowy "zrzut" :)


Według mnie takie rozwiązanie jest lipne ponieważ przy następnym uruchomieniu programu pliki będą nadpisywane. To albo wartość "I" zapisać do ini czy rejestru a lepiej zapisywać plik pod nazwą daty, godziny, minity isekundy. Przynajmniej będziesz wiedział kiedy twój program zrobił zrzut ekranu Nie jest lipne, tylko to jest taki przyklad jak mozna to zrobic. Ja nie chcialbym mu tu rozpisywac jakbym ja to zrobil bo by kolega calkiem nie wiedzial co i jak. Co najwyzej do ini/xml, w rejestrze lepiej nie grzebac.


a ja radze nie korzystac z timera tylko watkow Tez mozna, w sumie jeden grzyb czy timer czy watek. Na timerze prosciej, wiec jak kolega za bardzo sie nie zna to niech lepiej przy nim zostanie.

Ja mam jeszcze lepsze rozwiazanie. Nazywac pliki wg schematu [prefix]17.08.2006_9.05.jpg gdzie prefix mozesz sobie dac dowolny. Raczej nigdy nie zdarzy Ci sie nadpisanie pliku, jezeli nie bedziesz mjastrowal przy dacie.

PS.
Krajew, na przyszlosc podaj do kogo piszesz, bo nie wiem czy to do mnie czy do kolegi autora. <_<
Moja propozycja dziala dobrze.

@down
:punk: peace!
Zdarza sie. ;) Akurat chodzilo mi w glownej mierze o pierwsza czesc postu, na druga nie zwrocilem uwagi...
Ale ja dalem przyklad. :P
Użytkownik wojewoda edytował ten post 17 sierpień 2006, 15:02

Ja mam jeszcze lepsze rozwiazanie. Nazywac pliki wg schematu [prefix]17.08.2006_9.05.jpg gdzie prefix mozesz sobie dac dowolny. Raczej nigdy nie zdarzy Ci sie nadpisanie pliku, jezeli nie bedziesz mjastrowal przy dacie.
Czytaj uważnie post który cytujesz. Ja o tym już napisałem wcześniej przed tobą. :lol:

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •