Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Delphi - kópia TImage v TImage

Mám obrázok (šablónu), ktorú potrebujem otvoriť v TImage a potom do nej ešte kresliť (písať text). Ak obrázok otvorím tak, že priradím TImage obrázok z disku, tak je objekt "read only". Ja ale potrebujem otvoriť obrázok s tým, že ho môžem ďalej editovať. Je nejaký rýchly spôsob ako vytvoriť kópiu obrázka v TImage bez ďalšieho TImage, z ktorého by som ho cez CopyRect skopíroval?

Předmět Autor Datum
Ako "read only" ? toto Ti nefunguje ? procedure TForm1.Button1Click(Sender: TObject); begin With I…
pme 30.04.2006 15:39
pme
To prvé mi fungulo tak ako mi to v otázke prekážalo, čiže nezobrazilo sa to vtedy, ak bol otvorený o…
msx. 30.04.2006 16:23
msx.
TImage: Top,Left = 0, AutoSize = True TForm: AutoSize = True, AutoScroll = False Formulár sa prispô…
pme 30.04.2006 16:46
pme
Tohle bych radeji resil umistenim komponenty ScrollBox na formular a TImage bych dal na ScrollBox. T…
Jan Fiala 30.04.2006 18:04
Jan Fiala
Takže, aby som nemal na pravej strane formulára nevyužitý pás, tak bolo treba nastaviť vlastnosť Anc…
msx. 01.05.2006 14:37
msx.
Ted si mi docela nakopl k vytvoreni komponenty :-D diky.
virus 01.05.2006 22:16
virus
Akej komponenty? Popíš bližšie a zverejni zdroják. Možno sa zíde aj iným.:-)
msx. 01.05.2006 23:41
msx.
Neboj pokud bude cas tak ti klidne poslu , hotovej kus jak *.dcu tak i *.pas aspon budes prvni testu… poslední
virus 02.05.2006 01:34
virus

Ako "read only" ?

toto Ti nefunguje ?

procedure TForm1.Button1Click(Sender: TObject);
begin
 With Image1.Picture.Bitmap.Canvas do
 begin
   Font.Color := clBlue;
   Brush.Style := bsclear;
   Font.Size := 13;
   TextOut(10, 10, 'Transparent Text!!');
 end;
end;

prípadne

procedure TForm1.Button1Click(Sender: TObject);
var
  OldBkMode : integer;
begin
 With Image1.Picture.Bitmap do
 begin
    Canvas.Font.Color := clBlue;
    OldBkMode := SetBkMode(Canvas.Handle,Ord(TRANSPARENT));
    Canvas.Font.Size := 13;
    Canvas.TextOut(10, 10, 'Transparent Text!!');
    SetBkMode(Canvas.Handle,OldBkMode);
 end;
end;

To prvé mi fungulo tak ako mi to v otázke prekážalo, čiže nezobrazilo sa to vtedy, ak bol otvorený obrázok vo vlastnosti TImage.Picture To druhé mi funguje podľa mojich predstáv. No, okrem toho tam ešte nejaké problémy boli, ale poriešim. Hlavný problém bol ten, že na TImage som mal nastavenú vlastnosť AutoSize a preto sa mi odmietal kopírovať obrázok cez CopyRect. Ďalší je ten, že ak nastavím AutoSize na TForm, tak sa nenastaví veľkosť formulára podľa obrázka, ale napravo ostane pás široký asi 80 bodov (vyriešim nastavením farby formulára na bielu a bude, pretože ho treba tlačiť).

TImage: Top,Left = 0, AutoSize = True
TForm: AutoSize = True, AutoScroll = False

Formulár sa prispôsobí obrázku !;-)

Tlačiť TImage vieš ?

uses
  printers;

procedure TForm1.Button1Click(Sender: TObject);
var ScaleX, ScaleY :Integer;
    RR             :TRect;
begin
  with Printer do
  begin
   BeginDoc;   
   try
    ScaleX := GetDeviceCaps(Handle,logPixelsX) div PixelsPerInch;
    ScaleY := GetDeviceCaps(Handle,logPixelsY) div PixelsPerInch;
    
    RR := Rect(0,0,Image1.picture.width * scaleX, Image1.Picture.Height * ScaleY);
    Canvas.StretchDraw(RR,Image1.Picture.Graphic);
    
   finally
    EndDoc;   
  end;
 end;
end;

Tohle bych radeji resil umistenim komponenty ScrollBox na formular a TImage bych dal na ScrollBox.
Tvym resenim prijdes o stavovy radek, panel se ti roztahne "za roh" apod.

Ten tisk, jak jej popisujes bude funkcni u mensich obrazku. Pokud budou obrazky vetsi, nic se nevytiskne - StretchDraw to nezvladne pametove. Pak je treba rozdelit obrazek na mensi casti a pomoci StretchDraw postupne prenest na Canvas tiskarny

Takže, aby som nemal na pravej strane formulára nevyužitý pás, tak bolo treba nastaviť vlastnosť Anchors pre TForm na None. Ďakujem zúčastneným za pomoc. Všetko som už poriešil. Totiž, kamoš mi natlačil do hlavy, že, ak v TImage otvorím obrázok, tak sa nedajú robiť na TImage žiadne úpravy a obrázok je nezmeniteľný. už viem, že to tak nie je. Myslím, že môžem označiť za vyriešené.

Zpět do poradny Odpovědět na původní otázku Nahoru