Aceminin C# sorulari

Başlatan z, 30 Mayıs 2012, 08:19:05

z

Daha önce görsel dillerden birisi ile çalışdıysanız işiniz çok zor değil. Fakat ilk kez görsel bir dil öğrenecekseniz hatta daha önce herhangi bir dilde program yazmadıysanız bizzat bir kursa gitmeniz öğrenme sürecini hızlandırır.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#16
@Yamak

Bir sorum daha olacak. Textbox da aşağıdaki gibi hex veriler dizili olsun.
Mouse ile bunlardan istediğimin üstüne gelip değiştirebilirim. Ancak eğer tıkladığım yer rakamlar arasındaki boşluk ise değişime izin vermesin isterim.

Örneğin 13 de 1 üzerine gelip 245 yazdığımda 13 verisi 24'e değişsin yada 45'e fakat boşluğa veri girmesin.
Keza aynı şekilde en solda adres gösteren 08: gibi veriler de editlenemesin.

Amacım kullanıcının hex verileri girmesi için bir yapı oluşturmak. Fakat yöntemin bu şekilde olmasını istiyorum. Bu örneği hem kullanacağım hem de C# çalışmalarımda çok öğretici ip uçları içeriyor. İlgilenirsen sevinirim.

00: 00 01 02 03 04 05 06 07
08: 08 09 0A 0B 0C 0D 0E 0F
10: 10 11 12 13 14 15 16 17
18: 18 19 1A 1B 1C 1D 1E 1F
20: 20 21 22 23 24 25 26 27
28: 28 29 2A 2B 2C 2D 2E 2F
30: 30 31 32 33 34 35 36 37
38: 38 39 3A 3B 3C 3D 3E 3F

Aslında yöntemi biliyorum fakat C# kodlaması için biraz daha pratik yapmam lazım. Yöntem textboxın keypress tarzındaki eventlerini yakalayan fonksiyonda basılan tuşun hex veri yazmaya elverişli tuş olup olmadığın sınamak ve daha önemlisi tıklanan noktanın altındaki karakterin ne olduğuna bakmak.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Birisi cevap yazsa da okusam diye sürekli kontrol ediyorum ama cevap yok.

Sorum: Textbox içinde bir string olsun. Mouse ile textbox içindeki stringin herhangi bir karakterini tıklamış olayım.
Tıkladığım karakter en soldan itibaren kaçıncı karakterdir?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

#18
Hocam kusura bakmayın her zaman online olamıyorum bu aralar finallerim var da
hocam textbox ın selectionstart diye bi özelliği var belki o işinize yarayabilir.
mesela  textBox1 ve texBox2 diye 2 tane text box olsun.
textBox1'DE herhangi br yere tıklayıp onun soldan kaçıncı karakter olduğunu textBox2 ye yazdırmak istersek.
textBox2.text=textBox1.SelectionStart.ToString();
komutunu kullanabiliriz
Tabi bunları textBox1 in click eventi içinde yapmamız gerekiyo.
private void textBox1_Click(object sender, EventArgs e)
{
    textBox2.Text = textBox1.SelectionStart.ToString();
}

YARARMAN

Alıntı yapılan: z - 31 Mayıs 2012, 17:07:33
@Yamak

Bir sorum daha olacak. Textbox da aşağıdaki gibi hex veriler dizili olsun.
Mouse ile bunlardan istediğimin üstüne gelip değiştirebilirim. Ancak eğer tıkladığım yer rakamlar arasındaki boşluk ise değişime izin vermesin isterim.

Örneğin 13 de 1 üzerine gelip 245 yazdığımda 13 verisi 24'e değişsin yada 45'e fakat boşluğa veri girmesin.
Keza aynı şekilde en solda adres gösteren 08: gibi veriler de editlenemesin.

Amacım kullanıcının hex verileri girmesi için bir yapı oluşturmak. Fakat yöntemin bu şekilde olmasını istiyorum. Bu örneği hem kullanacağım hem de C# çalışmalarımda çok öğretici ip uçları içeriyor. İlgilenirsen sevinirim.

00: 00 01 02 03 04 05 06 07
08: 08 09 0A 0B 0C 0D 0E 0F
10: 10 11 12 13 14 15 16 17
18: 18 19 1A 1B 1C 1D 1E 1F
20: 20 21 22 23 24 25 26 27
28: 28 29 2A 2B 2C 2D 2E 2F
30: 30 31 32 33 34 35 36 37
38: 38 39 3A 3B 3C 3D 3E 3F

Aslında yöntemi biliyorum fakat C# kodlaması için biraz daha pratik yapmam lazım. Yöntem textboxın keypress tarzındaki eventlerini yakalayan fonksiyonda basılan tuşun hex veri yazmaya elverişli tuş olup olmadığın sınamak ve daha önemlisi tıklanan noktanın altındaki karakterin ne olduğuna bakmak.

Bu gibi editor tarzı işlemlerde DataGridView kullanmak en mantıklısı.
GridView üzerinde daha önce hiç çalışmışlığın oldu mu?

muhittin_kaplan

grid bu iş için pek uygun değildir. (string manipulasyon yapılmak isteniyor diye düşünüyorum)

YARARMAN

Alıntı yapılan: muhittin_kaplan - 31 Mayıs 2012, 22:49:44
grid bu iş için pek uygun değildir. (string manipulasyon yapılmak isteniyor diye düşünüyorum)

HEX Editor yazılımları genellikle GridView kullanır, o yüzden söyledim.
Ancak illa da TextBox ile yapılmasını istiyorum diyorsa, bilemiyeceğim.
Onun için de çözüm yollarını bulmaya çalışırız.

z

#22
Istedigim kodlari yazdim ama hic yakisikli olmadi. Eminim yapmak istedigim ara isler icin hazir fonskiyonlar vardir.

Adi Display2 olan ve readonly olarak ayarlanan Textbox icine daha once verdigim sablon veriler istedigim gibi editlenebiliyor

s == "\r"  r den once slash  var.

       private void Display2_KeyPress(object sender, KeyPressEventArgs e)
        {
            byte d;
            string s;

            d=(byte)e.KeyChar;
            if (((d < '0') || (d > '9')) && ((d < 'A') || (d > 'F')) && ((d < 'a') || (d > 'f')))
            {
                e.KeyChar = (char)0;
                YazmaIzni = false;
            }
            if (YazmaIzni == false) e.KeyChar = (char)0;
            else
            {
                if ((d >= 'a') && (d <= 'f')) e.KeyChar = (char)((byte)e.KeyChar & 0x4F);
                s = ""; s += e.KeyChar;
                Display2.SelectedText = s;
                Display2.Select(Display2.SelectionStart, 1);
                s = Display2.SelectedText;
                if (s == " ")
                {
                    Display2.SelectionStart++;
                    Display2.Select(Display2.SelectionStart, 1);
                    s = Display2.SelectedText;
                }


                if ((s == " ") || (s == "") || (s == "\r")) YazmaIzni = false;
                else YazmaIzni = true;
            }
        }

       
        private void Display2_MouseUp(object sender, MouseEventArgs e)
        {
            string s;
            Display2.Select(Display2.SelectionStart, 1);
            s = Display2.SelectedText;
            if (s == " ")
            {
                Display2.SelectionStart++;
                Display2.Select(Display2.SelectionStart, 1);
                s = Display2.SelectedText;
            }

            if ((s == "") || (s == "\r")) YazmaIzni = false;
            else
            {
                Display2.Select(Display2.SelectionStart, 3);
                s = Display2.SelectedText;
                if ((s[0] == ':') || (s[1] == ':') || (s[2] == ':'))
                {
                    if (s[0] == ':') Display2.SelectionStart = Display2.SelectionStart + 2;
                    if (s[1] == ':') Display2.SelectionStart = Display2.SelectionStart + 3;
                    if (s[2] == ':') Display2.SelectionStart = Display2.SelectionStart + 4;
                }
                Display2.Select(Display2.SelectionStart, 1);
                YazmaIzni = true;
            }
        }
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

YARARMAN

Kodları az önce denedim ve çok kararsız çalışıyor.
Bunun çaresine bakmak lazım.

z

Programi tekrar islettim, eger 0..9 A..F haricinde bir tusa basarsaniz program istendigi gibi bunlari kullanmadan cope atiyor. Fakat ardindan 0..9 A..F tuslarina bassaniz bile bunlar da cope gidiyor. Taaa ki tuslarin isleme alinmasi icin mouse ile yeni bastan yer secimi yapana dek. Bu sorunu  hallederim halletmesine de  sizlerden C# cilara yakisir bir kod bekliyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

cicjoe

#25
hocam, maskedtextbox kullansaniz olur sanki burda. girilecek deger icin bir maske belirliyosunuz, ornegin tel no, email en cok karsilastiklarimiz. sizin durumunuzda 0-9 A-F araligi maske belirleyebilirsiniz. araya bosluklari koyarsiniz. gerisini o halleder diye dusunuyorum.

Edit: maske belirleme olayi baya ilkelmis. ben RegEx benzeri maske belirleyebiliyoruz diye hatirliyodum. yanilmisim.

z

#26
Hemen dediginizi deneyecegim. Fakat bu soruyu sormamdaki amac, hem isim gorulsun hem de C# da istedigim kod istedigim sartlarda nasil yaziliri gormek.

Yeni baslayan birisi icin yazacaginiz kod ornekleri inanilmaz ipuclari veriyor. Su anda sistematik ogrenme yoluna gitmedigim icin vereceginiz kod ornekleri ilerlemem acisindan son derece faydali.

Mesela 0..9  A..F secimini uzun uzun kod yazarak yaptim muhakkak bu isi yapan bir fonksiyon vardir. Keza uppercase donusumu de uzun uzun kodladim. Bunun da hazir fonksiyonu vardir. Bu fonksiyonlar nedir nerede bulunur adi nedir bilmiyorum.

EDIT:

Display2 adli textbox readonly=true olmak kaydiyla asagidaki kodlar sorunsuz hale geldi.
cicjoe nin kodlarindaki ipuclari sayesinde kodlar da kisaldi.

        private void Display2_KeyPress(object sender, KeyPressEventArgs e)
        {
            byte d;
            string s;

            e.KeyChar = char.ToUpper(e.KeyChar);
            d = (byte)e.KeyChar;

            if (((char.IsDigit(e.KeyChar)) || ((d >= 'A') && (d <= 'F'))) && YazmaIzni)
            {
               Display2.SelectedText = char.ToString(e.KeyChar);
               Display2.Select(Display2.SelectionStart, 1);
               s = Display2.SelectedText;
               if (s == " ") Display2.SelectionStart++;
               if (s == "r") YazmaIzni = false; else YazmaIzni = true;
            }
        }

       
        private void Display2_MouseUp(object sender, MouseEventArgs e)
        {
            string s;
            Display2.Select(Display2.SelectionStart, 1);
            s = Display2.SelectedText;
            if ((s != "r")&&(s != ""))
            {
                YazmaIzni = true;
                if (s == " ") Display2.SelectionStart++;
                else
                {
                    Display2.Select(Display2.SelectionStart, 3);
                    s = Display2.SelectedText;
                    if      (s[0] == ':') Display2.SelectionStart += 2;
                    else if (s[1] == ':') Display2.SelectionStart += 3;
                    else if (s[2] == ':') Display2.SelectionStart += 4;
                    Display2.Select(Display2.SelectionStart, 1);
                }
            }
            else YazmaIzni = false;
        }

Kodlar istedigimi tam olarak yapiyor ancak hosuma gitmeyen tek durum verilerin A...F karakterler icermesi durumunda Hex Editor ekranindaki  rakamlar ordusunun asker gibi durmamasi. 0..9 verilerinde rakamlar hizada ancak A..F isi bozuyor. Terminal karakterlerini kullansam sorun cozulecek fakat yok. Asker gibi hizali duran yapi icin oneriniz varmi?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

cicjoe

Hocam textbox'tan kalitim alarak bir sinif yazdim. sanirim is gorur gibi. bir inceleyin olmadi.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
	class HexBox : TextBox
	{
		public HexBox()
		{
			string line = String.Empty;
			for (int i = 0; i < 8; i++)
				line += " 00";
			for (int i = 0; i < 8; i++)
				this.Text += i.ToString("00") + ":" + line + " " + Environment.NewLine;
		}

		protected override void OnKeyPress(KeyPressEventArgs e)
		{
			char c = Char.ToUpper(e.KeyChar);

			if (((this.SelectionStart - 3) % 3 == 0 && e.KeyChar == ' ') ||
				((this.SelectionStart - 3) % 3 != 0) &&
				((c >= 'A' && c <= 'F') || (c >= '0' && c <= '9')))
			{
				e.KeyChar = Char.ToUpper(e.KeyChar);
				int current = this.SelectionStart;
				this.Text = this.Text.Remove(current, 1);
				this.SelectionStart = current;
				base.OnKeyPress(e);
			}
			else
			{
				e.Handled = true;
			}
		}
	}
}

z

Hocam  birseylerden yeni birsey uretmek nasil oluyor diye merak eder dururdum. Bu ornek bu bakimdan da cok guzel oldu.

Yalniz bunu kullanmam bu asamada  imkansiz cunku cok acemiyim IDE yi bile daha tam kesfedemedim. Yarin verdiginiz bu ornegi nasil kullanacagimizi da aciklarsaniz minnettar kalirim. Yada programin kodlarini ziplayip yukleyebilirseniz daha da iyi olur.



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

cicjoe

#29
Edit: https://rapidshare.com/files/1850601825/WindowsFormsApplication1.rar

Hocam, 1 tane .cs uzantili dosya ekleyip projeye kodlari yapistirdiktan sonra 1 kez derleyin. Daha sonra form tasarim ekraninda toolbox'ta HexBox belirecektir. Istediginiz kadar surukleyip birakarak kullanabilirsiniz. Tabiki biraz modifiye ettikten sonra =) gozume carpan, mod 3 almadan once 3 cikarmisim, sanki etkisi olcakmis gibi =) ve her satirin ilk 3 karakteri degistirilemez, onu da kontrol etmemisim misal. Ama her satirdaki karakter sayisi belli oldugu icin kolay hesaplanir zaten o.

Iyi calismalar.

Edit: kodlari guncelledim. satir basi ve satir sonu kontrollerini ekledim.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace WindowsFormsApplication1
{
	class HexBox : TextBox
	{
		public HexBox()
		{
			//olusturulurken icinin doldurulmasi
			string line = String.Empty;
			for (int i = 0; i < 8; i++)	//her satir 8 byte
				line += " 00";
			for (int i = 0; i < 8; i++) //8 satir
				this.Text += Convert.ToString((byte)(i*8), 16).ComplateDigit(2) + ":" + line + " " + Environment.NewLine;

			//coklu satir
			this.Multiline = true;
			//ilk boyut
			this.Size = new Size(100,60);
		}

		protected override void OnKeyPress(KeyPressEventArgs e)
		{
			e.KeyChar = Char.ToUpper(e.KeyChar);	//basilan tusu buyuk harf yap
			
			if ((this.SelectionStart % 3 == 0 && e.KeyChar == ' ') ||	//eger araya denk gelirse bosluk tusu kabul
				(this.SelectionStart % 3 != 0) &&	//eger bosluga denk gelmezse, basilan tus uygun mu diye bakmaliyiz
				(e.KeyChar.IsHex()) &&	//0-9 A-F arasi
				(this.SelectionStart % (this.Lines[0].Length+2) > 3) &&		//her satirin ilk 3 karakteri olmamali
				(this.SelectionStart % (this.Lines[0].Length+2) < this.Lines[0].Length))	//satir sonundaki bos yer olmamali
			{
				int current = this.SelectionStart;		//tusun basildigi yeri al
				this.Text = this.Text.Remove(current, 1);	//ordaki karakteri sil
				this.SelectionStart = current;	//pozisyonu tekrar oraya gotur
				base.OnKeyPress(e);	//oraya tus basilmasina izin ver
			}
			else
			{
				e.Handled = true;
			}
		}
	}

	static class Ext
	{
		//char nesnesine metod ekle
		public static bool IsHex(this char c)
		{
			c = Char.ToUpper(c);
			return (c >= 'A' && c <= 'F') || (c >= '0' && c <= '9');
		}

		//string nesnesine metod ekle
		public static string ComplateDigit(this string s, int digitCount)
		{
			return new String('0', digitCount-s.Length) + s;
		}
	}
}