Kopiowanie obiektu Image

dział ogólny

Kopiowanie obiektu Image

Nowy postprzez duf » czwartek, 20 maja 2010, 08:19

Mam taki problem. Utworzyłem dynamicznie obiekt typu TImage załadowałem do niego obraz i chciałbym go skopiować tak, żeby mieć dwa niezależne obiekty. Próbowałem utworzyć to w ten sposób:
Kod: Zaznacz cały
newimage2 = new TImage ( newimage );

ale nie widzę tego nowego obiektu podczas druku. Proszę o wskazówki.
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez Corvis » czwartek, 20 maja 2010, 08:56

Kod: Zaznacz cały
Image2->Picture->Assign(Image1->Picture);   
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaSafari

Re: Kopiowanie obiektu Image

Nowy postprzez Cyfrowy Baron » czwartek, 20 maja 2010, 10:00

Corvis podał przykład kopiowania zawartości obiektu Image, ale z pytania wnoszę, że Tobie chodzi raczej o utworzenie dokładnej kopii wcześniej utworzonego dynamicznie obiektu Image, czyli chcesz skopiować wszystkie właściwości wcześniejszego obiektu, czy tak?

Jeżeli tak, to można to zrobić poprzez skopiowanie właściwości jednego obiektu do zmiennej typu AnsiString, a następnie przepisaniu tych właściwości do obiektu drugiego:

Kod: Zaznacz cały

AnsiString ComponentToString
(TComponent *c)
{
 AnsiString as;
 TMemoryStream* pms = new TMemoryStream();
 TStringStream* pss = new TStringStream(as);

 try
 
{
  pms->WriteComponent(c);
  pms->Seek(0, soFromBeginning);
  ObjectBinaryToText(pms, pss);
  pss->Seek(0, soFromBeginning);
  as = pss->DataString;
 }
 catch(...)
 {
 ShowMessage("Błąd strumienia danych.");
 }

 delete pms;
 delete pss;
 return as;
}
//---------------------------------------------------------------------------
void StringToComponent(TComponent *c, AnsiString as)
{
 TMemoryStream* pms = new TMemoryStream();
 TStringStream* pss = new TStringStream(as);

 try
 
{
  ObjectTextToBinary(pss, pms);
  pms->Seek(0, soFromBeginning);
 }
 catch(...)
 {
  ShowMessage("Błąd strumienia danych");
 }

 pms->ReadComponent(c);
 delete pms;
 delete pss;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TImage *Image1 = new TImage(this);
  Image1->Parent = this;
  Image1->Left = 8;
  Image1->Top = 8;
  Image1->AutoSize = true;
  Image1->Picture->LoadFromFile("c:\\image.bmp");



  TImage *Image2 = new TImage(this);
  Image2->Parent = this;
  StringToComponent(Image2, ComponentToString(Image1));
  Image2->Top = Image1->Top + Image1->Height + 8;
}
 


Jeżeli chodzi o coś innego to napisz dokładniej o co.
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
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez duf » czwartek, 20 maja 2010, 10:32

Ok.
Tworzę obiekt TImage:
Kod: Zaznacz cały
newimage = new TImage(this);
newimage->Width = 950;
newimage->Height = 1280;
newimage->Proportional = true;
newimage->Picture->LoadFromFile( sciezka + L"obraz.bmp" );

// wypisuję tekst
newimage->Canvas->Brush->Style = bsClear;
newimage->Canvas->TextOut( 50, 80, "poz: 1" );
newimage->Canvas->TextOut( 50, 80, "Imie" );
newimage->Canvas->TextOut( 50, 80, "Nazwisko" );
/////////////////////////////////////////itd

Drukuję jeden raz. I chcę wydrukować ten sam obraz drugi raz ale z innym numerem pozycji:
Kod: Zaznacz cały
newimage->Canvas->TextOut( 50, 80,"poz: 2" );

Niestety nie mogę wymazać poprzedniej npozycji i teksty się nachodzą. Dlatego chcę skopiować obiekt przed wpisaniem numeru pozycji a następnie dopisać różne pozycje do dwóch różnych obiektów:
Kod: Zaznacz cały
newimage->Canvas->TextOut( 50, 80, "poz: 1" );
newimage2->Canvas->TextOut( 50, 80, "poz: 2" );
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez polymorphism » czwartek, 20 maja 2010, 11:36

Baron, nie wydaje Ci się nierozsądnym konwertowanie danych binarnych do postaci tekstowej, jeśli i tak będziesz je z powrotem konwertował do pierwotnej postaci? Jeśli zapisuje komponent do strumienia pamięciowego, to i bezpośrednio z niego może czytać, bez tych redundantnych operacji.

@duf, a nie wystarczy TBitmap i TCanvas::CopyRect ?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez Cyfrowy Baron » czwartek, 20 maja 2010, 12:33

Te teksty nakładają się na siebie, gdyż ich pozycja X i Y jest identyczna:

duf napisał(a):
Kod: Zaznacz cały
newimage->Canvas->Brush->Style = bsClear;
newimage->Canvas->TextOut( 50, 80, "poz: 1" );
newimage->Canvas->TextOut( 50, 80, "Imie" );
newimage->Canvas->TextOut( 50, 80, "Nazwisko" );


duf napisał(a):Niestety nie mogę wymazać poprzedniej npozycji i teksty się nachodzą. Dlatego chcę skopiować obiekt przed wpisaniem numeru pozycji a następnie dopisać różne pozycje do dwóch różnych obiektów:


Nie potrzebujesz drugiego obiektu. Wczytaj grafikę do obiektu typu TBitmap, potem przepisz go do Image (newimage), napisz coś na nim. Gdy już to wydrukujesz i chcesz zmienić tekst w Image to ponownie przepisz do niego zawartość obiektu TBitmap, a wszystko co zostało napisane na Canvas obiektu Image zniknie i ponownie będziesz mógł na nim pisać.

Kod: Zaznacz cały

   Graphics
::TBitmap *bmp = new Graphics::TBitmap;
   
bmp->LoadFromFilesciezka L"obraz.bmp" );

    
newimage = new TImage(this);
    
newimage->Width 950;
    
newimage->Height 1280;
    
newimage->Proportional true;
    
newimage->Picture->Assign(bmp);

    
// wypisuję tekst 1
    
newimage->Canvas->Brush->Style bsClear;
    
newimage->Canvas->TextOut5080"poz: 1" );
    
newimage->Canvas->TextOut5080"Imie" );
    
newimage->Canvas->TextOut5080"Nazwisko" );

    
// wypisuję tekst 2
    
newimage->Picture->Assign(bmp);
    
newimage->Canvas->Brush->Style bsClear;
    
newimage->Canvas->TextOut5080"poz: 2" );
    
newimage->Canvas->TextOut5080"Imie" );
    
newimage->Canvas->TextOut5080"Nazwisko" );

    
// wypisuję tekst 3
    
newimage->Picture->Assign(bmp);
  
// itd...
 





polymorphism napisał(a):Jeśli zapisuje komponent do strumienia pamięciowego, to i bezpośrednio z niego może czytać, bez tych redundantnych operacji.


Masz absolutną racje. Dlaczego tak zrobiłem? Po prostu skopiowałem gotowy tekst z serwisu Cyfrowy Baron z działu: porady -> ciekawostki, bo mi się nie chciało go przerabiać.

Wiedząc jednakże, iż nie odpuścisz podaję rozwiązanie po Twojej myśli:

Kod: Zaznacz cały

void ImagePropertiesToImage
(TComponent *cSourceTComponent *cDest)
{
 
TMemoryStreampms = new TMemoryStream();

 
pms->WriteComponent(cSource);
 
pms->Position 0;
 
pms->ReadComponent(cDest);

 
delete pms;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 
TImage *Image1 = new TImage(this);
 
Image1->Parent this;
 
Image1->Left 8;
 
Image1->Top 8;
 
Image1->AutoSize true;
 
Image1->Picture->LoadFromFile("c:\\image.bmp");

 
TImage *Image2 = new TImage(this);
 
Image2->Parent this;
 
ImagePropertiesToImage(Image1Image2);
 
Image2->Top Image1->Top Image1->Height 8;
}
 
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
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez duf » czwartek, 20 maja 2010, 13:54

Cyfrowy Baron napisał(a):Te teksty nakładają się na siebie, gdyż ich pozycja X i Y jest identyczna:

Wiem że pozycja jest identyczna oto właśnie chodzi żeby w tym samym miejscu był inny numer.
Cyfrowy Baron napisał(a):... wszystko co zostało napisane na Canvas obiektu Image zniknie i ponownie będziesz mógł na nim pisać

Nie o to mi chodzi. Właśnie potrzebuje ten Canvas obiektu Image z napisanym już tekstem. Chcę tylko zmienić w nim numer na następny. A może skopiować sam Canvas z niezapisanym miejscem na numer i na poszczególnych kopiach wpisać kolejne pozycje?
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez Cyfrowy Baron » czwartek, 20 maja 2010, 14:08

Ty chyba sądzisz, że TCanvas obsługuje warstwy, otóż nie obsługuje. Cokolwiek napiszesz na płótnie Canvas lub na grafice w Image to nie jest to napis będący odrębnym elementem (warstwą), lecz jest to element graficzny, czyli zmienia się zawartość płótna i grafiki. Jeżeli chcesz dokonać zmian to musisz wszystko ponownie odrysować, czyli piszesz:

Kod: Zaznacz cały

   Graphics::TBitmap *bmp = new Graphics::TBitmap;
   bmp->LoadFromFile( sciezka + L"obraz.bmp" );

    newimage = new TImage(this);
    newimage->Width = 950;
    newimage->Height = 1280;
    newimage->Proportional = true;
    newimage->Picture->Assign(bmp);

    newimage->Canvas->Brush->Style = bsClear;
    newimage->Canvas->TextOut( 50, 80, "poz: 1" );


Teraz by zmienić napis z "poz: 1" na "poz: 2" trzeba przywrócić pierwotna grafikę, czyli pobrać obraz z obiektu bmp i przepisać do newimage i ponownie napisać na nim nowy tekst w tej samej pozycji.

Kod: Zaznacz cały
    newimage->Picture->Assign(bmp);
    newimage->Canvas->TextOut( 50, 80, "poz: 2" );


Czego nie rozumiesz? To nie są warstwy składające się z grafiki i tekstu. Po wczytaniu bitmapy do obiektu Picture obiektu typu TImage zostaje on odrysowany na płótnie Canvas. Cały mechanizm opiera się na systemowym GDI. Pomimo tego, że wczytałeś do obiektu Image bitmapę, to nie jest to jakiś odrębny element tego obiektu, który nie podlega zmianom. Gdy piszesz po Canvas obiektu Image z wczytana bitmapą, to modyfikujesz tą bitmapę, a skoro ją zmodyfikowałeś, to nie możesz wymazać tego co napisałeś, gdyż pod tym niczego nie ma. Jedyne co możesz zrobić to ponownie wczytać do Image bitmapę i napisać nowy tekst w tej samej pozycji. Jeżeli na obiekcie Image a co za tym idzie i na bitmapie jest więcej tekstu, a tych chcesz zmodyfikować tylko fragment to i tak musisz wszystko odrysować od początku, ponownie napisać na tym tekst, który nie ulega zmianie i wpisać zmieniony tekst.

Inne bardziej oszczędne, ale i bardziej pracochłonne rozwiązanie, to wycięcie z Image tylko fragmentu z tekstem który ma być podmieniony, potem wklejenie w to miejsce fragmentu skopiowanego z bitmapy przechowywanej w pamięci i napisanie w tym miejscu tekstu, ale to wymaga dokładnych obliczeń i nie będzie wcale szybsze.

To co ja proponuję w obiektem typu TBitmap to to samo co Ty chcesz osiągnąć z dwoma obiektami typu TImage, ale dwa Image nie są potrzebne, gdyż operacja pisania odbywa się tylko w jednym Image, drugi przechowuje tylko grafikę. Możesz oczywiście kopiować zawartość Canvas za pomocą funkcją CopyRect czy podobnych, w przypadku gdy zmienia się tylko część tekstu, a inna cześć pozostaje niezmienna, ale prawdopodobnie w pewnym momencie pojawi się konieczność wymiany całego tekstu i wtedy trzeba odświeżyć grafikę.

Możesz przecież przechowywać w zmiennej tekst, który nie podlega zmianie i odrysowywać go zawsze po pobraniu do Image grafiki z obiektu TBitmap, to prosta operacja nie wymagająca, żadnych skomplikowanych algorytmów.

Problem polega na tym, że albo Ty nie rozumiesz mechanizmu GDI, klasy TCanvas i TImage, albo źle opisujesz to co chcesz osiągnąć.
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
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez duf » czwartek, 20 maja 2010, 14:23

Cyfrowy Baron napisał(a):Problem polega na tym, że albo Ty nie rozumiesz mechanizmu GDI, klasy TCanvas i TImage, albo źle opisujesz to co chcesz osiągnąć.

Być może nie rozumie jak Ty. Chodzi mi o to, żeby pozostały tekst wpisany raz na obiekcie Image nie przepisywać po raz kolejny. Chcę zrobić drugi Image z tym samym tekstem co pierwszy Image. Chcę mieć dwa image z tym samym tekstem tylko z różną pozycją. Prościej już nie potrafię wytłumaczyć.
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez Cyfrowy Baron » czwartek, 20 maja 2010, 14:34

A co to jest ta pozycja? Co rozumiesz przez pozycja? Z tego co wcześniej pisałeś wnioskuję, że pozycja to też tylko tekst.

Przecież to proste, zanim wpiszesz na pierwszy Image rzekomą pozycję musisz to skopiować do drugiego Image. Ponieważ, jeżeli już wpiszesz tą pozycję to kopiując grafikę z Image1 do Image2 skopiujesz wszytko. Potrzebujesz więc tutaj funkcji kopiującej właściwości obiektu, którą podałem wcześniej.

W uproszczeniu wygląda to tak:

Kod: Zaznacz cały

void ImagePropertiesToImage
(TComponent *cSource, TComponent *cDest)
{
 TMemoryStream* pms = new TMemoryStream();

 pms->WriteComponent(cSource);
 pms->Position = 0;
 pms->ReadComponent(cDest);

 delete pms;
}
//--------------------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   Image1->Picture->LoadFromFile("filename");
   // wypełniasz pierwszy Image tekstem, który ma pojawić się też w drugim.
   Image1->Canvas->TextOut(10, 10, "stały tekst");
   Image1->Canvas->TextOut(10, 30, "stały tekst");
   Image1->Canvas->TextOut(10, 60, "stały tekst");

   // kopiujesz właściwości pierwszego Image do drugiego, czyli zarówno grafikę jak i tekst
   ImagePropertiesToImage(Image1, Image2);

   // teraz wpisujesz tzw. pozycję 1 do Image1:
   Image1->Canvas->TextOut(50, 80, "poz: 1");

  // tak samo postępujesz z drugim Image:
   Image1->Canvas->TextOut(50, 80, "poz: 2");
}
 


No i masz dwa obiekty Image z tą samą grafiką, z tym samym tekstem, ale z różnymi tzw. pozycjami.
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
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez duf » piątek, 21 maja 2010, 12:50

Ta funkcja powoduje u mnie błąd typu "access violation":
Kod: Zaznacz cały
TImage* Image2;
Image1 = new TImage(this);
Image1->Picture->LoadFromFile("filename");
TMemoryStream* pms = new TMemoryStream();
pms->WriteComponent(Image1);
pms->Position = 0;
pms->ReadComponent(Image2);
delete pms;

Pomijam fakt, że tu pewnie chodziło Ci o taki zapis:
Kod: Zaznacz cały
// teraz wpisujesz tzw. pozycję 1 do Image1:
Image1->Canvas->TextOut(50, 80, "poz: 1");

// tak samo postępujesz z drugim Image:
Image1->Canvas->TextOut(50, 80, "poz: 2"); // <--- winno być "Image2"
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez Corvis » piątek, 21 maja 2010, 12:57

Mogę wiedzieć co za projekt piszesz ?? I poco ci takie cuda robić ??
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaSafari

Re: Kopiowanie obiektu Image

Nowy postprzez polymorphism » piątek, 21 maja 2010, 13:03

Kod: Zaznacz cały
TImage* Image2; 

(...)

pms->ReadComponent(Image2); 

duf, pewne rzeczy mógłbyś już sam poprawić. Image2 na co wskazuje?

___
p.s. do tego co chcesz zrobić ta metoda nie jest dobra, służy do czegoś innego - serializacji obiektów (komponentów) VCL.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez duf » piątek, 21 maja 2010, 13:12

polymorphism napisał(a):
Kod: Zaznacz cały
TImage* Image2; 

(...)

pms->ReadComponent(Image2); 

duf, pewne rzeczy mógłbyś już sam poprawić. Image2 na co wskazuje?

___
p.s. do tego co chcesz zrobić ta metoda nie jest dobra, służy do czegoś innego - serializacji obiektów (komponentów) VCL.

W sumie na nic ;-)
Kod: Zaznacz cały
void ImagePropertiesToImage(TComponent *cSource, TComponent *cDest)

Jak cSource to źródło, źródłem jest Image1 a Dest jest Image2. Trudno jest dopatrzeć się innej analogi. A jak winno być?
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez duf » piątek, 21 maja 2010, 13:16

Corvis napisał(a):Mogę wiedzieć co za projekt piszesz ?? I poco ci takie cuda robić ??

Program do zgłoszeń celnych, z którego korzystam sam. Cuda robię bo wiem tylko tyle co wiem a życie stawia nowe wyzwania i czasem nie gardzi, więc się spieszę.
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • 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 4 gości