- Kod: Zaznacz cały
newimage2 = new TImage ( newimage );
ale nie widzę tego nowego obiektu podczas druku. Proszę o wskazówki.
newimage2 = new TImage ( newimage );
Image2->Picture->Assign(Image1->Picture); 
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;
}

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
newimage->Canvas->TextOut( 50, 80,"poz: 2" );newimage->Canvas->TextOut( 50, 80, "poz: 1" );
newimage2->Canvas->TextOut( 50, 80, "poz: 2" );

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:
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);
// wypisuję tekst 1
newimage->Canvas->Brush->Style = bsClear;
newimage->Canvas->TextOut( 50, 80, "poz: 1" );
newimage->Canvas->TextOut( 50, 80, "Imie" );
newimage->Canvas->TextOut( 50, 80, "Nazwisko" );
// wypisuję tekst 2
newimage->Picture->Assign(bmp);
newimage->Canvas->Brush->Style = bsClear;
newimage->Canvas->TextOut( 50, 80, "poz: 2" );
newimage->Canvas->TextOut( 50, 80, "Imie" );
newimage->Canvas->TextOut( 50, 80, "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.
ciekawostki, bo mi się nie chciało go przerabiać.
void ImagePropertiesToImage(TComponent *cSource, TComponent *cDest)
{
TMemoryStream* pms = 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(Image1, Image2);
Image2->Top = Image1->Top + Image1->Height + 8;
}

Cyfrowy Baron napisał(a):Te teksty nakładają się na siebie, gdyż ich pozycja X i Y jest identyczna:
Cyfrowy Baron napisał(a):... wszystko co zostało napisane na Canvas obiektu Image zniknie i ponownie będziesz mógł na nim pisać

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" );
newimage->Picture->Assign(bmp);
newimage->Canvas->TextOut( 50, 80, "poz: 2" );

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ąć.

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");
}

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;// 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"


- Kod: Zaznacz cały
TImage* Image2;
(...)
pms->ReadComponent(Image2);

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.
void ImagePropertiesToImage(TComponent *cSource, TComponent *cDest)
Corvis napisał(a):Mogę wiedzieć co za projekt piszesz ?? I poco ci takie cuda robić ??

Powrót do Ogólne problemy z programowaniem
Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości