TImage ve Buffer

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

TImage ve Buffer

Mesaj gönderen qamyoncu »

merhabalar,

gece gece kafayı yedim. Hatam nerededir hocam?

Kod: Tümünü seç

var
buffer1: TBitmap;
fpos: TPoint;

procedure TForm1.FormCreate(Sender: TObject);
begin
Buffer1:=TBitmap.Create;
Buffer1:=Image1.Picture.Bitmap;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
fpos.X:=X;
fpos.Y:=Y;
image1.Tag:=1;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if image1.Tag=1 then
  begin
    image1.Picture.Bitmap:=buffer1;
    drawline(fpos.X,fpos.Y,X,Y);
  end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if image1.Tag=1 then
  begin
    image1.Tag:=0;
    Buffer1:=Image1.Picture.Bitmap;
  end;
end;
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: TImage ve Buffer

Mesaj gönderen Lost Soul »

Hata ne ki? :roll:
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

Re: TImage ve Buffer

Mesaj gönderen qamyoncu »

Haklısınız gece unutmuşum yazmayı kusura bakmayın.

Buffer1'e image1'in içeriği atanmıyor nedense. Sanki "nil"miş gibi davranıyor.

Aynı kodu button falan kullanarak denedim. İmage1dekinin buffere alıp butona basıldığında bufferi image2'ye atan bir kod.

butona ilk tıklayışımda sorun yok. İkinci tıklayışımda yine nil'miş gibi davranıyor. Anlamadım :? :( :shock:
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Re: TImage ve Buffer

Mesaj gönderen Opt2000 »

Selam,

Siz burada Buffer ile TImage.Picture.Bitmap arasında pointer eşitlemesi yapıyorsunuz. Yapmanız gereken kod şöyle bir şey:

Kod: Tümünü seç

Buffer.Assign(Image1.Picture.Bitmap);
Buffer'ı TImage'de göstermek için de

Kod: Tümünü seç

Image1.Picture.Bitmap.Assign(Buffer);
kullanmanız gerekiyor. Kodunuzu buna göre güncellerseniz sorun olmayacaktır. Bir de şu anki sistemde, Buffer için TBitmap.Create ile bellekten yer alıyorsunuz, ama daha sonra TImage.Picture.Bitmap'i assign ettiğiniz için bellekten aldığınız yere bir daha erişemiyorsunuz. Dolayısıyla bellek kaçağı (memory leak) oluşuyor. FormClose ya da Destroy'de Buffer'ı Free edecek olursanız büyük ihtimalle de Access Violation benzeri bir hata verecektir program. (Buffer'i silerken değil, daha sonra verecektir, sizin debug edemeyeceğiniz bir yerde. Çünkü Image1.Picture.Bitmap artık geçersiz bir bellek alanını gösteriyor olacak).

Kolay gelsin,
Bahadır Alkaç
Cevapla