mouse a çizgi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

mouse a çizgi

Mesaj gönderen serbek_tr »

Hayırlı Çalışmalar;

Bir takım resim editorlerinde olduğu gibi bir image in üzerinde mouse dolaştırıken mouse un olduğu noktaya yukardan ve soldan eşlik edecek çizgi nasıl çizdirilebilir arkadaşlar mouse oynadıkça bu çizgi mouse ucuna eşlik edecek
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Kullanıcı avatarı
cfyasar
Üye
Mesajlar: 169
Kayıt: 31 Oca 2005 05:18
Konum: izmir

Mesaj gönderen cfyasar »

resmin üstüne fare ile geldiğin zaman farenin şeklini değiştirmek için formundaki ımage nesnesinin OnMouseMove olayına cursor:=crcross; yazarsan fare + şeklini alacaktır. başka tip bir işaretleme istiyorsan windows un cursor resimlerinden seçebilirsin. çok özel birşey olacaksa kendin çizmen lazım
Kullanıcı avatarı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Mesaj gönderen serbek_tr »

ben mose şeklini değiştirmek istemiyorum aşağıda bir örnek verdim herhalde anlatır ne demek istediğimi o harfi mouse olsun çizgilerde image in üstünden ve solundan mouse olduğu x,y koordinatlarına çizilmiş çizgiler olsun

|
|
|
|
|
|
----------------------------o
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Mesaj gönderen Abrak »

tam anlamadım ne yapmak istediğini fakat bu bilgiler işini görür sanırım;

Canvas.MoveTo(x,y) // aktif pixeli X,Y noktasına taşır
Canvas.LineTo(x,y) //x ve ye kordinatlarında düz çizgi çizer

ister imagenin x,y lerinden aktar buna istersen sabit ise pixel moveto ile aktar ve çiz
Kolay Gelsin
Başkasına Olan Saygımız.. Kendimize Olan saygıdır..
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Arkadaş mouse koordinatlarını eksen çizgileri üstünde çizgi şeklinde göstermek istiyor.

Şöyle birşey yapabilirsin. Eksen çizgilerini çizdikten sonra OnMouseMove gibi bir event'e dersin ki mouse'un koordinatına göre bu eksen çizgilerini yeniden boya. Mesela mouse 10. satır , 27.sütun noktasında olsun. O halde X eksenindeki eksen çizgisinin 27. pikseline denk gelecek yere bir X koyarsın.
Y eksenindeki eksen çizgisinin 10. satıra denk yerine de bir X koydun mu fareyi hareket ettirdiğinde istediğin efekti elde edebilirsin.

Sanki Delphi'nin DEMO'larında böyle birşey vardı diye de hatırlıyorum.
Kullanıcı avatarı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Mesaj gönderen serbek_tr »

Teşekkür ederim, Bir soru daha sorsam ;
bir image nesnesi üzerindeki son işlemi nasıl geri alabiliriz. çizgi çizdik diyelim çizmeden önceki haline geri alma

Kod: Tümünü seç

  with Image do
    if HandleAllocated then SendMessage(Handle, EM_UNDO, 0, 0);

veya

SendMessage(Handle, EM_UNDO, 0, 0);
şeklinde denedim bir işe yaramadı
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Aklıma ilk gelen her çizim işleminden önce Image bileşeni Canvas'ının bir kopyasını buffer'a alman. Undo yapmak istediğinde de bu buffer'dan geri yüklemen. Çok etkin bir çözüm değil. Sürekli ram'den yersin. Daha zor ama ram kullanımı açısından etkin olan, çizme işleminin koordinatlarını bir buffer'da saklaman. Yani 13'e 10'dan 40'a 40 koordinatına bir çizgi çektiysen bu koordinatları saklaman. Geri almak istediğinde de bu koordinatlardaki çizgiyi silmen. Ancak çakışan çizgilerde ne yaparsın bilemem.

Çizgi, daire kare vs.. türü çizimleri bir obje şeklinde tasarlaman faydalı olur kanaatindeyim. Buna göre bellekte sadece bunların object pointer ve object değerlerini saklarsın. Mesela çizgi için:

TLine = class
private
FX, FY, FX1, FY1: Integer;
public
constructor Create(const X, Y, X1, Y1: Integer); // verilen koordinata çizgi çizer
procedure Repaint; // Koordinatlardaki çizgiyi yeniden çizer.
end;

gibi bir obje tanımladın.

Create ettiğinde verdiğin koordinatlara çizgiyi çekiyor.

Bunu create ettiğin zaman bir TList içinde depola.

FList.Add(TLine.Create(1, 1, 10, 10)) ; // ilk çizgi

gibi... Bir line daha çiz...

FList.Add(TLine.Create(20, 20, 40, 80)) ; // 2. çizgi

Geri almak istediğinde son çizdiğin line'ı Free et.
TLine(FList[1]).Free;
Flist[1].Delete; gibi,

sonra FList içindeki bütün objeleri bir döngü içinde yeniden çizdir.

Image1.Clear;
for I:= 0 to Flist.count do
Flist.Repaint;

gibi..Bu şekilde çizdirdiğin şeyleri diske kaydedip yeniden yükleme imkanın da olmuş olur. AutoCAD gibin.. :D
Kullanıcı avatarı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Mesaj gönderen serbek_tr »

Üstad bu dediğin mantığa yakın birşey düşünmedim değil ama artık kesin senin söylediğini yapacağım teşekkür ederim
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Kullanıcı avatarı
bluekid
Kıdemli Üye
Mesajlar: 541
Kayıt: 11 Haz 2004 10:45
İletişim:

Mesaj gönderen bluekid »

Canvas->Pen->Mode=pmXor;
veya
Canvas->Pen->Mode=pmNotXor;

yaptıktan sonra çizdirdiğiniz çizgi ikinci defa çizdiğinizde çizgi kalkar

Kod: Tümünü seç

 Form1->Canvas->Pen->Style=psDot;
 Form1->Canvas->Pen->Mode=pmXor;
 Form1->Canvas->MoveTo(0,y0);
 Form1->Canvas->LineTo(Form1->Width,y0);
 Form1->Canvas->MoveTo(x0,0);
 Form1->Canvas->LineTo(x0,Form1->Height);
bir önceki koordinatı saklayıp önce bir önceki koordinatta bunu çizip
yani eski çigileri silip sonra yeni koordinatta yeni çizgileri çiz ve bu koordinatı eski koordinat olarak sakla
Kullanıcı avatarı
cfyasar
Üye
Mesajlar: 169
Kayıt: 31 Oca 2005 05:18
Konum: izmir

Mesaj gönderen cfyasar »

TLine = class
private
FX, FY, FX1, FY1: Integer;
public
constructor Create(const X, Y, X1, Y1: Integer); // verilen koordinata çizgi çizer
procedure Repaint; // Koordinatlardaki çizgiyi yeniden çizer.
end;

bu kodla bir sınıf oluşturmaya çalışıyorum, constructor ile başlayan satır için bu hatayı alıyorum.
[Error] Unit3.pas(30): Unsatisfied forward or external declaration: 'TLine.Create'
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Sınıf yapısında tanımladığın consturctor, procedure ve func. yapılarını oluşturmamışsın. Bunları oluşturup içine kodları yazmalısın. Otomatik yapsın istiyorsan (gene kodları sen yazacaksın tabii) sınıfın üzerine tıkla ve Shift+Ctrl+C'ye bas.
Cevapla