Canvas a çizdiğim çizgiyi silemiyorum
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
-
- Üye
- Mesajlar: 8
- Kayıt: 28 Oca 2015 06:49
Canvas a çizdiğim çizgiyi silemiyorum
Merhaba Arkadaşlar,
Delphi ye yeni başladım.
Bir tane uygulama yapıyorum canvas üzerine aşağıdaki komutlar ile çizim yapıyorum.
Ama ne yaptıysam çizdiğim çizgiyi silmeyi başaramadım.
dizlerle işi yapmaya çalıştım ama o da olmadı. mesela dedim ki 500*500 resim olsa
yazının yazıldığı pixelin matristeki değeri 1 olsa vs falan düşündüm ama bu defada ram i ve işlemciyi çok yoracak
bu konuda ne yapabiliriz. Tecrübeli arkadaşların yardımlarını bekliyorum.
internette çok araştırma yaptım ama işe yarar bir şey bulamadım.
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
with PaintBox1.canvas do
begin
if yazmamodu then begin // kalem e tıkladığımda burası
pen.width:=3;
pen.color:=s;
// Canvas.Pen.Mode := pmXOR;
drawing:=true;
moveto(x,y);
end
else begin // silgiye tıkladığımda burası çalışıyor
drawing:=true;
Canvas.Pen.Mode := pmNotXor;
Canvas.Pen.Width := 2;
Canvas.Brush.style := bsClear;
Canvas.MoveTo(x,y);
end;
end;
asıl çizme işini aşağıdaki kodlar ile yapıyorum.
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
cursor:=crNone;
canvas.lineto(x,y);
cursor:=crdefault;
end;
Delphi ye yeni başladım.
Bir tane uygulama yapıyorum canvas üzerine aşağıdaki komutlar ile çizim yapıyorum.
Ama ne yaptıysam çizdiğim çizgiyi silmeyi başaramadım.
dizlerle işi yapmaya çalıştım ama o da olmadı. mesela dedim ki 500*500 resim olsa
yazının yazıldığı pixelin matristeki değeri 1 olsa vs falan düşündüm ama bu defada ram i ve işlemciyi çok yoracak
bu konuda ne yapabiliriz. Tecrübeli arkadaşların yardımlarını bekliyorum.
internette çok araştırma yaptım ama işe yarar bir şey bulamadım.
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
with PaintBox1.canvas do
begin
if yazmamodu then begin // kalem e tıkladığımda burası
pen.width:=3;
pen.color:=s;
// Canvas.Pen.Mode := pmXOR;
drawing:=true;
moveto(x,y);
end
else begin // silgiye tıkladığımda burası çalışıyor
drawing:=true;
Canvas.Pen.Mode := pmNotXor;
Canvas.Pen.Width := 2;
Canvas.Brush.style := bsClear;
Canvas.MoveTo(x,y);
end;
end;
asıl çizme işini aşağıdaki kodlar ile yapıyorum.
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
cursor:=crNone;
canvas.lineto(x,y);
cursor:=crdefault;
end;
Re: Canvas a çizdiğim çizgiyi silemiyorum
Mehmet Bey,
Kodunuz derlenmiyor. Bu şekilde zor olur ...
Kodunuz derlenmiyor. Bu şekilde zor olur ...
Ömür Ölmez
-
- Üye
- Mesajlar: 8
- Kayıt: 28 Oca 2015 06:49
Re: Canvas a çizdiğim çizgiyi silemiyorum
Ömür bey bir tane proje buldum aşağıya linki ekliyorum.
Bu proje üzerinden çalışıyorum. Projede çizgi çiziliyor onda sorun yok
color grid koyarak renkte seçtiriyor um onda da sorun yok ama silme işlemini yapamıyorum.
ne yaptıysam çizdiğim çizgiyi resme dokunmadan silemedim.
Beyaza da boyamak istemiyorum çünkü arka planda resim olacak
http://www.delphiforfun.org/programs/de ... rawing.htm
Bu proje üzerinden çalışıyorum. Projede çizgi çiziliyor onda sorun yok
color grid koyarak renkte seçtiriyor um onda da sorun yok ama silme işlemini yapamıyorum.
ne yaptıysam çizdiğim çizgiyi resme dokunmadan silemedim.
Beyaza da boyamak istemiyorum çünkü arka planda resim olacak
http://www.delphiforfun.org/programs/de ... rawing.htm
Re: Canvas a çizdiğim çizgiyi silemiyorum
Bir çeşit çizim programı mı yapmaya çalışıyorsunuz ?
Öyle ise, şu mantığı kullanmalısınız :
* Kullanıcının ekrana çizdiği nesnenin (örneğin çizginin) bir kopyasını hafızada saklamalısınız.
* Silme işlemini, hafızadan nesnenin çıkarılması ve diğer nesnelerin boş tuvale çizilmesi olarak ele almalısınız.
Böyle başlarsanız, kaydet ve yükle komutları için, zoom in / out komutları için doğru yönde ilerlemiş olursunuz. Burada asıl zorluk, silinmek istenen nesnenin ekrandan seçilmesi (Ya da bana zor gelmişti). Bu akşam mesaiden sonra bir örnek yapıp göndereceğim, üzerinden konuşuruz ...
Öyle ise, şu mantığı kullanmalısınız :
* Kullanıcının ekrana çizdiği nesnenin (örneğin çizginin) bir kopyasını hafızada saklamalısınız.
* Silme işlemini, hafızadan nesnenin çıkarılması ve diğer nesnelerin boş tuvale çizilmesi olarak ele almalısınız.
Böyle başlarsanız, kaydet ve yükle komutları için, zoom in / out komutları için doğru yönde ilerlemiş olursunuz. Burada asıl zorluk, silinmek istenen nesnenin ekrandan seçilmesi (Ya da bana zor gelmişti). Bu akşam mesaiden sonra bir örnek yapıp göndereceğim, üzerinden konuşuruz ...
Ömür Ölmez
-
- Üye
- Mesajlar: 8
- Kayıt: 28 Oca 2015 06:49
Re: Canvas a çizdiğim çizgiyi silemiyorum
Ömür bey öncelikle ilginiz için teşekkür ediyorum.
Delphi de yeniyim bu 3. uygulamam
Yapmak istediğim şey ise bir nevi soru çözme uygulaması gibi bir şey
resimleri klasörden çağırıp daha sonra üzerinde karalama yapmak, zoom yapmak yaptığım karalamaları kayıt etmek
dikdörtgen kare gibi şekiller çizdirmek vs gibi özellikler koymak istiyorum.
Bu konuda hangi yolu izleyeceğim ve kodlar noktasında yardıma ihtiyacım var.
Delphi de yeniyim bu 3. uygulamam
Yapmak istediğim şey ise bir nevi soru çözme uygulaması gibi bir şey
resimleri klasörden çağırıp daha sonra üzerinde karalama yapmak, zoom yapmak yaptığım karalamaları kayıt etmek
dikdörtgen kare gibi şekiller çizdirmek vs gibi özellikler koymak istiyorum.
Bu konuda hangi yolu izleyeceğim ve kodlar noktasında yardıma ihtiyacım var.
Re: Canvas a çizdiğim çizgiyi silemiyorum
Bir adet formu ve form üstünde bir adet TPaintBox ve TRadioGroup nesnesi olan bir programa ait iki dosya paylaşıyorum. RadioGroups.Items sıraları önemli olarak Yok, Çizgi ve Daire olmak üzere toplam üç satıra sahiptir (Bu kod, kaydet, yükle, zoom in, zoom out komutlarının eklenmesine müsaittir).
Paylaştığım örnekte, konuyla ilgili olarak
* Çizim nesnelerinin hafızada sayılar/nesneler olarak tutulması
* Canvas a gerektikçe herşeyin yeniden çizilmesi
* Nesnelerde kalıtsallık
* Birden çok nesneyi ortak kod ile kullanmak ( FNesneler[AIndex].Ciz(); )
* Fare ile basit çizim
bulunabilir.
Konu ile ilgisi olmayan,
* Çalışma anında oluşturulan birden çok çeşit nesnenin tek bir dizi değişkende tutulması
* Sabit (const) kullanımı
* Basit haliyle Delphi değişken isim kuralları
örnekleri bulunabilir.
Örnekle ilgili olarak şu tarz taleplere kapalıyım:
"xxx da ekler misin"
Şu tarz taleplere açığım, vakit ayırabilirim.
"xxx eklemek istedim, şu hatayı veriyor"
"burayı anlamadım"
"buraya ne gerek vardı ?"
"ben böyle yaptım daha kısa yazdım. Sen neden uzun yolu seçtin ?"
///////////////////////////////
grafik.pas
///////////////////////////////
main.pas
Paylaştığım örnekte, konuyla ilgili olarak
* Çizim nesnelerinin hafızada sayılar/nesneler olarak tutulması
* Canvas a gerektikçe herşeyin yeniden çizilmesi
* Nesnelerde kalıtsallık
* Birden çok nesneyi ortak kod ile kullanmak ( FNesneler[AIndex].Ciz(); )
* Fare ile basit çizim
bulunabilir.
Konu ile ilgisi olmayan,
* Çalışma anında oluşturulan birden çok çeşit nesnenin tek bir dizi değişkende tutulması
* Sabit (const) kullanımı
* Basit haliyle Delphi değişken isim kuralları
örnekleri bulunabilir.
Örnekle ilgili olarak şu tarz taleplere kapalıyım:
"xxx da ekler misin"
Şu tarz taleplere açığım, vakit ayırabilirim.
"xxx eklemek istedim, şu hatayı veriyor"
"burayı anlamadım"
"buraya ne gerek vardı ?"
"ben böyle yaptım daha kısa yazdım. Sen neden uzun yolu seçtin ?"
///////////////////////////////
grafik.pas
Kod: Tümünü seç
unit grafik;
interface
uses Graphics;
type
TNesne =class(TObject)
public
procedure Ciz(ACanvas :TCanvas); virtual;
end;
TCizgi =class(TNesne)
public
X1, Y1, X2, Y2 :integer;
procedure Ciz(ACanvas :TCanvas); override;
end;
TDaire =class(TNesne)
public
X1, Y1, X2, Y2 :integer;
procedure Ciz(ACanvas :TCanvas); override;
end;
implementation
{ TCizgi }
procedure TCizgi.Ciz(ACanvas: TCanvas);
begin
ACanvas.MoveTo(X1, Y1);
ACanvas.LineTo(X2, Y2);
end;
{ TDaire }
procedure TDaire.Ciz(ACanvas: TCanvas);
begin
ACanvas.Ellipse(X1, Y1, X2, Y2);
end;
{ TNesne }
procedure TNesne.Ciz(ACanvas: TCanvas);
begin
ACanvas.Rectangle(0, 0, 100, 100);
end;
end.
main.pas
Kod: Tümünü seç
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, grafik;
const
aracYok =0;
aracCizgi =1;
aracDaire =2;
type
TForm1 = class(TForm)
rgMod: TRadioGroup;
PaintBox1: TPaintBox;
procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure PaintBox1Paint(Sender: TObject);
procedure rgModClick(Sender: TObject);
private
FGeciciCizgi :TCizgi;
FGeciciDaire :TDaire;
FCizimAraci :integer;
FNesnelerHazir :boolean;
FNesneler :array of TNesne;
FCiziyor :boolean;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.rgModClick(Sender: TObject);
begin
case rgMod.ItemIndex of
0 : FCizimAraci :=aracYok;
1 : FCizimAraci :=aracCizgi;
2 : FCizimAraci :=aracDaire;
end;
end;
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if FCizimAraci=aracCizgi then begin
FGeciciCizgi.X1 :=X;
FGeciciCizgi.Y1 :=Y;
FGeciciCizgi.X2 :=X;
FGeciciCizgi.Y2 :=Y;
end else if FCizimAraci=aracDaire then begin
FGeciciDaire.X1 :=X;
FGeciciDaire.Y1 :=Y;
FGeciciDaire.X2 :=X;
FGeciciDaire.Y2 :=Y;
end;
FCiziyor :=true;
end;
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
AIndex :integer;
begin
if FCizimAraci=aracCizgi then begin
AIndex :=Length(FNesneler);
SetLength(FNesneler, AIndex+1);
FNesneler[AIndex] :=TCizgi.Create;
TCizgi(FNesneler[AIndex]).X1 :=FGeciciCizgi.X1;
TCizgi(FNesneler[AIndex]).Y1 :=FGeciciCizgi.Y1;
TCizgi(FNesneler[AIndex]).X2 :=X;
TCizgi(FNesneler[AIndex]).Y2 :=Y;
end else if FCizimAraci=aracDaire then begin
AIndex :=Length(FNesneler);
SetLength(FNesneler, AIndex+1);
FNesneler[AIndex] :=TDaire.Create;
TDaire(FNesneler[AIndex]).X1 :=FGeciciDaire.X1;
TDaire(FNesneler[AIndex]).Y1 :=FGeciciDaire.Y1;
TDaire(FNesneler[AIndex]).X2 :=X;
TDaire(FNesneler[AIndex]).Y2 :=Y;
end;
FCiziyor :=false;
end;
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if FCizimAraci=aracCizgi then begin
FGeciciCizgi.X2 :=X;
FGeciciCizgi.Y2 :=Y;
end else if FCizimAraci=aracDaire then begin
FGeciciDaire.X2 :=X;
FGeciciDaire.Y2 :=Y;
end;
PaintBox1.Refresh;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FGeciciCizgi :=TCizgi.Create;
FGeciciDaire :=TDaire.Create;
FNesnelerHazir :=true;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FNesnelerHazir :=false;
FGeciciDaire.Free;
FGeciciCizgi.Free;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
i :integer;
begin
if FNesnelerHazir then begin
PaintBox1.Canvas.Brush.Color :=clWhite;
PaintBox1.Canvas.FillRect(PaintBox1.ClientRect);
PaintBox1.Canvas.Pen.Color :=clBlack;
for i:=0 to Length(FNesneler)-1 do begin
FNesneler[i].Ciz(PaintBox1.Canvas);
end;
if FCiziyor then begin
if FCizimAraci=aracCizgi then begin
PaintBox1.Canvas.Pen.Color :=clBlue;
FGeciciCizgi.Ciz(PaintBox1.Canvas);
end else if FCizimAraci=aracDaire then begin
PaintBox1.Canvas.Pen.Color :=clBlue;
FGeciciDaire.Ciz(PaintBox1.Canvas);
end;
end;
end;
end;
end.
Ömür Ölmez
Re: Canvas a çizdiğim çizgiyi silemiyorum
Arkadaşlar,
Programın çalışır hali EK 'tedir.
Programın çalışır hali EK 'tedir.
- Dosya ekleri
-
- cizgi.zip
- Çizim programı örneği.
- (216.71 KiB) 140 kere indirildi
Ömür Ölmez
-
- Üye
- Mesajlar: 8
- Kayıt: 28 Oca 2015 06:49
Re: Canvas a çizdiğim çizgiyi silemiyorum
ömür bey Teşekkür ediyorum.
Farklı bir yöntemle sorunu çözdüm zoom yaparken problem olur mu bilmiyorum ama sime işlemininde başarılı.
Kullandığım yöntem şu
iki tane image view koydum alltaki image view e resmi koydum üstteki image i transparan yaptım. çizgiyi üstteki image view e çizdim.
silerken de mesela üstteki image viewin 30,40 pixelindeki yazıyı silmek istiyorum ya gittim alttaki image viewde yani resimde 30,40 pixelin renk değerini okudum.
ve üstteki image view i onunla boyadım silerken kalınlığı ayarlamak içinde for kullandım misal vermek gerekirse 5*5 bir matris düşünelim siz bir pixeli silmek istiyorsanız
for ile iki üst pixelden başlıyorum 2 alt pixele kadar 5*5 lik bir alanı boyuyorum. Şimdilik iş görüyor ama umarım zoom yaparken problem çıkarmaz.
Bu arada zoom konusunda yardımcı olur musunuz ?
Gesture diye birşey var ama karışık geldi bu işin mantığı nedir. Nasıl yapabilirim.
Farklı bir yöntemle sorunu çözdüm zoom yaparken problem olur mu bilmiyorum ama sime işlemininde başarılı.
Kullandığım yöntem şu
iki tane image view koydum alltaki image view e resmi koydum üstteki image i transparan yaptım. çizgiyi üstteki image view e çizdim.
silerken de mesela üstteki image viewin 30,40 pixelindeki yazıyı silmek istiyorum ya gittim alttaki image viewde yani resimde 30,40 pixelin renk değerini okudum.
ve üstteki image view i onunla boyadım silerken kalınlığı ayarlamak içinde for kullandım misal vermek gerekirse 5*5 bir matris düşünelim siz bir pixeli silmek istiyorsanız
for ile iki üst pixelden başlıyorum 2 alt pixele kadar 5*5 lik bir alanı boyuyorum. Şimdilik iş görüyor ama umarım zoom yaparken problem çıkarmaz.
Bu arada zoom konusunda yardımcı olur musunuz ?
Gesture diye birşey var ama karışık geldi bu işin mantığı nedir. Nasıl yapabilirim.
Re: Canvas a çizdiğim çizgiyi silemiyorum
Canvas ı duvara benzetebilirsin, yazdığın çizdiğin her şey o duvar üzerinde kalır. Bu mantıkla basitçe düşünürsen, yapman gereken ilizyon, yani, her çizdiğin boyadığını yeni bir canvas üzerinde yapıp bunu saklıyacaksın, sonra boyamaya sıra geldiğinde ilk canvas ile sırayla yapılmış işlemleri arka arkaya ana canvas üzerine bascaksın. fotoşop taki layer lar gibi düşünün, hepsini üst üste koyunca bir bütün oluşturacaklar, silinecek olan layer silindikten sonra (diğer her işlemden sonra)ilk saklanan canvastan başlıyarak sırayla ana canvas üzerine boyanacak. işte ilizyon
Kolay gele
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
-
- Üye
- Mesajlar: 8
- Kayıt: 28 Oca 2015 06:49
Re: Canvas a çizdiğim çizgiyi silemiyorum
aradan bir yıl geçti ama tecrübelerimi aktarmak istiyorum.
silme işlemini kes yapıştır ile yaptım. yani iki tane resim var birinde istediğim gib çizimi yapıyorum. silme işlemine gelince çizim yaptığım resimdeki yere çizim yapılmamış alandaki resmi, silginin kalınlığı kadar kopyalıyorum. yani 10*10 silginiz var resimde bir alana tıkladınız. Ana resimden 10*10 alan kesip üzerine yapıştırıyorum. çok hızlı ve güzel çalışıyor.
Zoom ile ilgili de ne yaparsanız yapın pixel tabanlı çalıştığınız sürece sorun yaşarsınız. görüntü bozulur.
Bunun için vektörel tabanlı çalışşmak gerekiyor. şu anda svg üzerinde çizim yapmayı araştırıyorum.
kes yapıştır kodu bunun gibi birşey
BitBlt(bmp.Canvas.Handle, 0, 0, silgikalinlik, silgikalinlik, img63.Canvas.Handle, BottomRight.X-silgiorta, BottomRight.Y-silgiorta, SRCCOPY);
silme işlemini kes yapıştır ile yaptım. yani iki tane resim var birinde istediğim gib çizimi yapıyorum. silme işlemine gelince çizim yaptığım resimdeki yere çizim yapılmamış alandaki resmi, silginin kalınlığı kadar kopyalıyorum. yani 10*10 silginiz var resimde bir alana tıkladınız. Ana resimden 10*10 alan kesip üzerine yapıştırıyorum. çok hızlı ve güzel çalışıyor.
Zoom ile ilgili de ne yaparsanız yapın pixel tabanlı çalıştığınız sürece sorun yaşarsınız. görüntü bozulur.
Bunun için vektörel tabanlı çalışşmak gerekiyor. şu anda svg üzerinde çizim yapmayı araştırıyorum.
kes yapıştır kodu bunun gibi birşey
BitBlt(bmp.Canvas.Handle, 0, 0, silgikalinlik, silgikalinlik, img63.Canvas.Handle, BottomRight.X-silgiorta, BottomRight.Y-silgiorta, SRCCOPY);
Re: Canvas a çizdiğim çizgiyi silemiyorum
Merhaba Çizim için en iyi svg diyebiliriz.
Ana mantık xml dosyası için de hazırlanan bir nokta kümesi gibi çalışıyor.
http://riversoftavg.com/
Gösterimci için bu iyi bir araç.
Öğrenmesi ilk başta zor olabilir falat çok zaman kazandırıyor.
Ana mantık xml dosyası için de hazırlanan bir nokta kümesi gibi çalışıyor.
http://riversoftavg.com/
Gösterimci için bu iyi bir araç.
Öğrenmesi ilk başta zor olabilir falat çok zaman kazandırıyor.
Ahmet DENİZ