1) Form tipinde program yazarken sprintf tarzi C komutlari kullanabiliyormuyuz? Yoksa bu komutlar sadece konsol uygulamalarinda mi kullanilabiliyor?
Kullanimina ve include edilen dosyalarin tanimlarina ornek verirmisiniz?
2) Text box icine hex sayi girilsin. Bunu int degiskene atayan komut satirini yazarmisiniz?
3) Textbox icindeki verileri char elemanlarindan olusan bir array icine atan kodu yazarmisiniz?
2) C# 'ı Linux ve diğer platformlarda kullandığım için, Microsoft'un .Net'i üzerinden değil de Mono üzerinden yazıyorum tüm kodlarımı C# ile, bu yüzden arayüz tarafı biraz farklı Microsoft'a göre, textbox'dan nasıl alınacağını ezbere bilmiyorum (büyük ihtimalle Text1.Text gibi birşeydir). Ondan sonrası kolay. Mesela;
int degisken = System.Convert.ToInt32( "FF", 16);
3) char[] dizi = ("ahmet").ToCharArray();
ya da char[] dizi = Text1.Text.ToCharArray();
1) sprintf 'e gerek kalmıyor C#'da.
Eğer amaç iki string i birleştirmekse;
string degisken = "Ahmet";
Text1.Text = "Merhaba" + degisken;
String ile ilgili bir format işlemi yapılacaksa;
int sayi1 = 26;
double sayi2 = 3.14;
Text1.Text = String.Format( "En sevdiğim sayı {0} ve {1:f} dir.", sayi1, sayi2 );
Formatla ilgili karakterler için : http://www.csharpnedir.com/articles/read/?id=486&title=String.Format%20Fonksiyonu (http://www.csharpnedir.com/articles/read/?id=486&title=String.Format%20Fonksiyonu)
Merhaba,
Aradığını sorunları Microsoft tun MSDN sitesinde bulabilirsiniz.
http://msdn.microsoft.com/en-us/library/bb397679 (http://msdn.microsoft.com/en-us/library/bb397679)
Bu site .Net cilerin ana sayfası niteliğinde, takıldıklarında ilk önce bu siteyi ziyaret ederler.
@NecroCapo hocam bu mono dediğiniz http://monodevelop.com (http://monodevelop.com) oluyor değilmi... sormak istediğim windowsda hazırlanan bir projeyi linuxta hiç bir değişiklik yapmadan çalıştırabiliyormuyuz veya tam tersi...
bunu sorma sebebim windowsla mac osx arasında gidip geliyorum herhangi birinde yazacağım kodları sorunsuzca diğerinde çalıştırabilecekmiyim...
selametle.
Evde yazmaya başladığım kodların bulunduğu klasörü işyerindeki makinamda desktopa kopyaladım.
Ancak programı derlemeye kalktığımda evdeki makinadaki klasör yolunu aramaya kalkıyor. Bu vaziyette işyerinde programda bazı değişiklikler yaptım. Derlediğimde 19 tane hata veriyor sonra bir anda tüm hatalar yok oluyor ve 0 hataya dönüyor. Bazı satırlara breakpoint koyduğumda programı çalıştırdığımda breakpointler etkisiz hale geliyor.
Bu hatalardan nasıl kurtulabilirim? Evdeki çalışmaları işyerine nasıl sorunsuz taşırım?
ben bu konuda şöyle bir yontem kullanıyorum,
dropbox diye bir program var, web de ücretsiz 2 gb alan veriyor size,
Ben evde ki, işyerimde ki pc lerin hepsine bu programı kurdum,
programın klasörünü de tüm pclerde aynı olacak şekilde (D:\My Dropbox) ayarladım,
Program o klasöre dosya attığınızda anında web de ki alana da kaydediyor,
Sildiğinizde de web de ki alandan siliyor,
Diğer pcler açıldığında program otomatik çalşıyor ve web de ki alanın son güncel halini kendi yerel klasörüyle eşliyor.
Artık usb bellek bile taşıma gereğini yalnızca büyük boyutlu dosyalarda hissediyorum,
Evde akşam derlediğim ya da çalıştığım programı / dosyayı hiç taşımadan ertesi gün işyerimde aynen çalıştırabiliyorum.
1) String.Format("{0} {1}....", a, b);
include islemi, referans ekleme ile yapiliyor. program derlenirken dahil edilen dll'ler parametre olarak gonderiliyor.
using kismi c++'daki using namespace kismina denk geliyor.
64 bytlık bir array tanımladım.
Amacım bu arrayden sıra ile byte değerleri okumak ve textbox da listelemek.
Basit örnek olması açısından arrayda herhangi bir yerdeki değer o yerin index numarası olsun.
Bu durumda text box da görmek istediğim görüntü aşağıdaki gibi olacak.
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
....
....
şeklinde.
Verilerin hex olarak gösterildiğini ve en solda o satırın adresininde gösterildiğini gözönüne alarak bu kodlamayı yaparsanız benim için çok güzel bir örnek olacak.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace deneme1_2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int[] f = new int[64];
private void button1_Click(object sender, EventArgs e)
{
foreach (int deger in f)
{
if (deger % 8 == 0)
richTextBox1.Text += "\n" + (deger.ToString("X2"))+":";
richTextBox1.Text += " " + (deger.ToString("X2"));
}
}
private void Form1_Load(object sender, EventArgs e)
{
for (int i = 0; i < 64; i++)
{
f[i] = i;
}
}
}
}
Hocam aradığınız şey bu şekilde bir şey heralde. Ekran çıktısı şu:
Alıntı Yap00: 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
butona basıldığında ekrana sayıları yazıyo.
Soruyu soralı kaç dakika oldu tık yok kimsede? Delphide isteseydiniz hemen yazar yollardım size.
Edit: teşekkürler.
TextBox ı çok satırlı hale getirdim. Mesela 4.satıra bir text yerleştirmek istesem bunu nasıl yaparım?
TextBox1.Lines[4]=S gibi bir şeyler yapmak istedim ama yemedi.
Hocam cevap verdim ya.
Yok mesajlar çakıştı. Cevap için sağolasın. Richtext yerine textbox da bu iş nasıl yapılır. Daha doğrusu textboxda herhangi bir satıra string yazma işini merak ettim.
Hocam forma bi textbox koyduğumuzda üstünde bi tane ok işareti var o işarete tıklayıp ordan multiline ı seçiyoruz sonra bir alt satıra geçmek için "\r\n" gönderiyoruz. Yani kodun yeni hali:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace deneme1_2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int[] f = new int[64];
private void button1_Click(object sender, EventArgs e)
{
foreach (int deger in f)
{
if (deger % 8 == 0)
textBox1.Text += "\r\n" + (deger.ToString("X2"))+":";
textBox1.Text += " " + (deger.ToString("X2"));
}
}
private void Form1_Load(object sender, EventArgs e)
{
for (int i = 0; i < 64; i++)
{
f[i] = i;
}
}
}
}
merhaba hocam basic ve pascal ve dbase programları biliyorum ama epeydir bişey yazmıyorum lakin geçenlerde bit pazarını gezerken 5 cd li BORLAND C++ BUİLDER 6 kodlu programı buldum winxp prf ve office 2003 kullanıyorum bu programı kursam zararı olurmu ve neler yapabilirim bu programla...öğrenmek istiyorum tabii sizin sitenizin sayesinde..çünkü borland programlarını seviyorum ve program yazmak istiyorum...ayrıca nesneye dayalı oyun programları yazmam yada üzerinde değişiklikler yapmak istiyorum...bu oyunların editörleri ile çok güzel haritalar hazırlayabiliyorum..ilginize şimdiden teşekkürler çpk iyi desen ve resimde yapıyorum..emekliyim...saygılar...
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.
@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.
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?
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();
}
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?
grid bu iş için pek uygun değildir. (string manipulasyon yapılmak isteniyor diye düşünüyorum)
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.
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;
}
}
Kodları az önce denedim ve çok kararsız çalışıyor.
Bunun çaresine bakmak lazım.
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.
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.
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?
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;
}
}
}
}
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.
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;
}
}
}
Alıntı YapHocam, 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
Bu olayı C deki kütüphanelere benzetebilirsiniz hocam.
@cicjoe
Hocam eline saglik. 0..9 rakamlar ayni genislikte fakat A..F farkli genislikte. Bu durumda 0..9 A..F lerden olusan hex veriler duzgun gorunmuyor hizalamalar kayiyor. Buna bir cozum uretebilirmiyiz?
Edit:Courier New fontu ile sorun cozuldu.
Hocam astronot gibi adammissin. C# ile bu seviyede kod yazacak hale ne kadar zamanda geldin? Asil mesleginiz yazilimmi?
HexBox'in davranisinda bir durumdan rahatsizim ve kodlarinizi oynayarak bunu duzeltmem zor gibi.
Sorun;
Diyelimki 00 verisinde ilk 0'i sectim ve klavyeden 12 yazdim. Kursor boslukta duruyor. Bu esnada 34 yazmak istesem bosluga denk gelindigi icin basilan tuslar cope gidiyor.
Halbuki 12 yazdiktan sonra kursor bir sagdaki hex sayinin ilk karakterine tasinsa surekli olarak space yada sag ok tusuna basmak gerekmez. Bu da veri girisini cok kolaylastirir.
Hatta satir sonuna gelindiginde otomatik olarak bir alt satirin en sol alanina ziplatabilirmisin?
Hexbox'i toolboxa kalici bir eleman olarak gommek mumkun degilmi? Yeni bir proje acip toolboxdan secip kullanamazmiyim?
Hocam aceminin c# soruları deyince bende daha 3 günlük bir c# öğrencisi olarak şunu sormak istiyorum seriport uygulaması lazımdı uğraştım biraz yazdım sonunda fakat alma işlemini tam olarak beceremedim bana alma rutinini yazabilirmisiniz acaba bir mesaj kutusunda bunu görüntülebilmem için yada hernerde olursa :) illa koda gerek yok gele veriyi görüntüleyeyim ve bu işlem için butona basmak zorunda kalmayayım. Nasıl bir yol izlemem lazım. Şimdiden teşekkürler yarın programı koyacam şimdi telden girdim foruma herkese kolay gelsin :)
Evet hocam yazilim. Elektorik ogrenmeye calisiyorum.
HexBox'a su metod'u eklerseniz sanirim istedigin davranisi elde edersiniz.
Edit: Tabi o zaman KeyPress'teki bosluk tusunun kontrolu de anlamsiz kaliyor, silinebilir. Ben araya geldigi zaman bosluk tusu basilirsa sonraki cifte gecsin diye yazmistim.
protected override void OnTextChanged(EventArgs e)
{
if (this.SelectionStart % 3 == 0)
this.SelectionStart++;
if (this.Lines.Length != 0 &&
(this.SelectionStart % (this.Lines[0].Length+2) == (this.Lines[0].Length)) &&
(this.SelectionStart < (this.Text.Length - 7)))
this.SelectionStart += 6;
base.OnTextChanged(e);
}
Ayrica constructer'da sabit olarak 8 satir 8 byte yazdim ama, oranin da daha dinamik hale getirilmesi uygun olabilir. Property tanimlayarak set oldugunda degisecek sekilde.
Alıntı yapılan: serhat1990 - 01 Haziran 2012, 23:33:07
Hocam aceminin c# soruları deyince bende daha 3 günlük bir c# öğrencisi olarak şunu sormak istiyorum seriport uygulaması lazımdı uğraştım biraz yazdım sonunda fakat alma işlemini tam olarak beceremedim bana alma rutinini yazabilirmisiniz acaba bir mesaj kutusunda bunu görüntülebilmem için yada hernerde olursa :) illa koda gerek yok gele veriyi görüntüleyeyim ve bu işlem için butona basmak zorunda kalmayayım. Nasıl bir yol izlemem lazım. Şimdiden teşekkürler yarın programı koyacam şimdi telden girdim foruma herkese kolay gelsin :)
Küçük bir yazılım hazırladım, onu inceleyebilirsin...
https://rapidshare.com/files/3125668450/SerialPortApp.zip (https://rapidshare.com/files/3125668450/SerialPortApp.zip)(http://img411.imageshack.us/img411/879/screenklm.png)
Alıntı yapılan: serhat1990 - 01 Haziran 2012, 23:33:07
Hocam aceminin c# soruları deyince bende daha 3 günlük bir c# öğrencisi olarak şunu sormak istiyorum seriport uygulaması lazımdı uğraştım biraz yazdım sonunda fakat alma işlemini tam olarak beceremedim bana alma rutinini yazabilirmisiniz acaba bir mesaj kutusunda bunu görüntülebilmem için yada hernerde olursa :) illa koda gerek yok gele veriyi görüntüleyeyim ve bu işlem için butona basmak zorunda kalmayayım. Nasıl bir yol izlemem lazım. Şimdiden teşekkürler yarın programı koyacam şimdi telden girdim foruma herkese kolay gelsin :)
Hocam, forumda c# ve seri port ile ilgili cok tartisma ve paylasim olmustu. Sanirim isinize yarar. Arama yaparsaniz cikacaktir.
Iyi calismalar. =)
Buldugum bir programi degistirerek istedigim sekle sokmus,bu programda kullandigim HexBox icin de kendi yazdigim kodlari kullaniyordum. Simdi Cicjoe nin HexBox kodlarini kullanarak devam etmek istiyorum.
Ancak neyi nereye yapistiracagimi kestiremedim. Cicjoenin kodlarini kendi programima tasimak bana daha az problemli olacak gorunuyor. Bu isi nasil yapacagim?
Alıntı yapılan: z - 01 Haziran 2012, 23:11:09
Hexbox'i toolboxa kalici bir eleman olarak gommek mumkun değilmi? Yeni bir proje acip toolboxdan secip kullanamazmiyim?
Hocam, HexBox.cs dosyasini yeni bir Class Library projesi acarak derleyin, size 1 .dll dosyasi verecektir. Diger projelerinizde o dll'i ekleyip kullanabilirisiniz. HexBox'in kendine has ayarlarinin da Property Window'da cikmasi icin tanimlarsaniz, bir daha koda girmeden davranislarini degistirebilirsiniz. Ornegin public int Byte { get; set; }, public int Row { get; set; } gibi Property'ler tanimlarsaniz, tasarim ekranindan ayarlayabilirsiniz. Actiginiz her yeni projede HexBox'i iceren dll'in ekli gelmesini istiyorsaniz, 1 tane Windows Form uygulamasi actiktan sonra dll'i ekleyin, sonra File->Export Template->Project Template seclinde devam edin. Ilerde proje acarken Windows Form Application yerine sablonunuza verdiginiz isimi secerek acabilir, boylece hazir ayarlarda bir proje baslatabilirsiniz.
Alıntı yapılan: z - 02 Haziran 2012, 00:48:28
Buldugum bir programi degistirerek istedigim sekle sokmus, HexBox icin de kendi yazdigim kodlari kullaniyordum. Simdi Cicjoe nin HexBox kodlarini kullanarak devam etmek istiyorum.
Ancak neyi nereye yapistiracagimi kestiremedim. Cicjoenin kodlarini kendi programima tasimak bana daha az problemli olacak gorunuyor. Bu isi nasil yapacagim?
Tam olarak sorunu anlayamadım.
Arkadaşın özel denetimini, Toolbox'a mı taşıyıp denetim olarak kullanmak mı istiyorsun yoksa kendi kodunun içine direk mi atmak istiyorsun?
Internetten USB ile ilgili bir program buldum. Buna pek cok eklenti yapip belli bir kivama getirdim. Icinde Hexbox lar da var ve bunlari kendim yazmistim. Acemi oldugumu dusunursek program benim icin bir hayli karmasik yapida. (DLL vs de kullaniyor)
Ote yandan Cicjoe hosuma giden bir HexBox gelistirdi, Simdi kendi yazdigim HexBoxlari kaldirip atacak ve yerine cicjoenin gelistirdigi HexBox kodlarini kullanacagim.
Gene acemi oldugumu dusunursek hem usb tarafidaki kodlar hemde cicjoe nin yazdigi kodlar gozumde corba gibi gorunuyor. Birini birine tasimaliyimki kodlamaya devam edebileyim.
Niyetim cicjoenin kodlarini usb programinin icine tasimak.
İsterse yüzbinlerce işlem olsun.
Eğer işlemlerini güzelce sınıflar haline getirirsen, inanılmaz kolaylık sağlarsın.
Çok daha hızlı bir şekilde yazılım geliştirirsin.
Keza factoring yapacağın zaman da işin çok kolaylaşır.
Eğer bahsettiğin yazılımda bu hex editor işlemini gerçekleştirecek 5-10 tane textbox var ise;
cicjoe'nun kodlarını, her bir textboxa uyarlamak zorunda kalırsın ki hiç güzel bir yöntem değil bence.
Bahsettiğin yazılımda bir tane class (cs) dosyası aç.
İçine cicjoe'nun kodlarını yapıştır, eklemek istediğin yerlere kendi kodunu da ekle sonra derle.
Oluşan yeni özel HexBox textboxını, yazılımında kullanmak istediğin yerlerde kullan.
Hocam, usb programina hexbox'i yerlestirmek daha kolay gibi gorunuyor. Solution Explorer'dan projeye sag tiklayarak Add->New Class diyin. Dosya ismine HexBox.cs ismini verin ve acilan dosyanin icine HexBox kodlarini yapistirin. Daha sonra toolbox'tan surukleyerek formunuza ekleyin hexbox'lari. Daha onceden yazmis oldugunuz kodlardan aktarmak istediklerinizi, HexBox dosyasi icine degil de, gene daha once textbox'lara nasil eklediyseniz oyle ekleyin. Ornegin 1 hexbox'in icerigi degistiginde kod calistiriyorsaniz, onu hexbox dosyasinin icine yazmayin. Programa eklenmis hexbox'in textchanged event'ine giderek yazin. Cunku eger hexbox'a yazarsaniz, eklediginiz butun hexbox'larda ayni kod calisir. Ancak eklediklerinizde yazarsaniz, her biri icin ayri yazabilme sansiniz var.
Elbette, tekrarlanan ortak işlemleri HexBox içerisine eklesin.
Opsiyonel işlemleri ise senin dediğin gibi form içine eklesin.
Bu arada kodu birkac kez edit'lemistim, umarim en guncel versiyonu koplayalamissinizdir.
Sorun değil, tekrar kodlarinizi indiririm. Simdilik en son istedigim otomatik space gecis ve satir sonunda otomatik alta gecis var ve memnunum.
Ekranimda form1.cs* varken
Solution Explorer'dan projeye sag tiklayip add sectigimde bana New project ve Existing project olmak uzere 2 seceneki sunuyor,
Add->New Class gelmedi.
Anlasilmaz bir durumdaysam ekran goruntulerimi vereyim.
Edit:
Pardon bir alt satirdaki iconun ustunde sag click yapinca add class gordum sanirim devam edebilirim,
Alıntı yapılan: z - 02 Haziran 2012, 01:28:15
Sorun değil, tekrar kodlarinizi indiririm. Simdilik en son istedigim otomatik space gecis ve satir sonunda otomatik alta gecis var ve memnunum.
Ekranimda form1.cs* varken
Solution Explorer'dan projeye sag tiklayip add sectigimde bana New project ve Existing project olmak uzere 2 seceneki sunuyor,
Add->New Class gelmedi.
Anlasilmaz bir durumdaysam ekran goruntulerimi vereyim.
Sen projeye değil de solution üzerine sağ tıklıyorsundur.
Zira solution üzerine sağ tıklayınca Add menüsünde dediğin seçenekler belirir.
Hocam tamam dediklerinizi uyguladim ve kendi programimda Toolboxda Hexbox i alip surukleyip usb programindaki foruma tasiyabiliyorum.
Ancak tam koydugum esnada hata veriyor.
Fakat bu duruma asinayim. Cunku verdiginiz orjinal kodlarinizda forma 2. bir Hexbox koymak istedigimde ayni hatayi almistim. Cozum olarak zaten form uzerine koydugunuz HexBoxu copy ile alip past ile yapistirarak ikinci bir hexbox olusturmustum.
Bu durumda sorun nedir?
Mesajin ilk iki satiri su sekilde
Failed to create component 'HexBox'. This error message follows:
'System.IndexOutOfRangeException: Index was outside the bounds of the array'
HexBox denetiminde bir sorun var.
HexBox.cs dosyasının içeriğini tümden buraya eklersen sevinirim.
Code etiketi içinde ekleyin.
Problem icerik bosken de satirlara erismeye calismasindan kaynaklaniyodu. O nedenle en guncel halini kopyalayin demistim =)
this.Lines.Length != 0 kontrolunu ekledim. Son halini tumden tekrar yapistiriyim.
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 int Byte { get; set; }
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((i*8), 16).ComplateDigit(2) + ":" + line + " " + Environment.NewLine;
//coklu satir
this.Multiline = true;
//ilk boyut
this.Size = new Size(100, 60);
this.SelectionStart = 4;
}
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;
}
}
protected override void OnTextChanged(EventArgs e)
{
if (this.SelectionStart % 3 == 0)
this.SelectionStart++;
if (this.Lines.Length != 0 &&
(this.SelectionStart % (this.Lines[0].Length+2) == (this.Lines[0].Length)) &&
(this.SelectionStart < (this.Text.Length - 7)))
this.SelectionStart += 6;
base.OnTextChanged(e);
}
}
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;
}
}
}
Denedim, ellerine sağlık cicjoe, tam da z'nin istediği gibi olmuş. :)
Sagolun sorun bitti.
Umarim herikinizin de vereceginiz kurs sayesinde C# da belli bir seviyeye geliriz.
Tesekkurler.
Ben hiç yardımcı olamadım bu sefer. :)
cicjoe iyi iş çıkarttı.
Tesekkur ederim, iyi calismalar =)
Delphide kullandigimiz JEDI yi bir sekilde C# da kullanmanin caresi varmidir?
Jedi'nin beğendiğin taraflarından activex nesnesi veya başka dll yaparsın. C#'da kullanırsın
Boyle bir calisman oldumu? C# de sen ne kullaniyorsun? umng.dll i hic begenmedim yada bunu tam kesfedemedim. Alternatif ariyorum. umng.dll i kim yazmis dokumantasyonu yapilmismi bilgin varmi?
Alıntı yapılan: z - 02 Haziran 2012, 16:06:44
Boyle bir calisman oldumu? C# de sen ne kullaniyorsun? umng.dll i hic begenmedim yada bunu tam kesfedemedim. Alternatif ariyorum. umng.dll i kim yazmis dokumantasyonu yapilmismi bilgin varmi?
Eve geçtiğimde bu USB konusunda sana yardımcı olmaya çalışacağım...
Alıntı YapBoyle bir calisman oldumu? C# de sen ne kullaniyorsun?
Ben delphide beğendiğim her hangi güzel fonksiyonu activex denetimine çevirebiliyorum. Zor bişey değil. Bunu yaptıktan sonra c#'da kullanabiliyorsun.
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to $7FFF do
begin
Label1.Caption:=inttostr(i);
Label1.refresh;
end;
end;
Yukaridaki kod Delphi'ye ait.
Asagidakiler de C#'a
Her ikisini de calistirdim ve sasirdim. Birisi digerine nal toplatiyor. Kim kime toplatiyor dersiniz?
private void button1_Click(object sender, EventArgs e)
{
int i;
for (i = 0; i < 0x7FFF; i++)
{
label1.Text = i.ToString();
label1.Refresh();
}
}
Programlardan birisi calismayi 23 (yirmi uc) sn de bitirdi.
Digeri sadece 4 (dort) sn de.
Kodlarin kostugu makina: P4, 2.2Ghz, 2GByte Ram, XP, Intel82845G li basit bir VGA karti
cevap veriyorum C# 23 sn :(
Bencede hocam yavaş olan C#'tır. ::)
Derleyip Çalıştırma Konusunda Delphi çok hızlıdır. Zamanında bir program yazdım dünya kadar satır kod vardı. görsel komponentler filan maksimum 5sn sürmüştü derleyip çalıştırması.. Delphi gerçekten hızlı..
1 seneyi geçti delphi kullanmayalı.. Özendim sizden şimdi :)
test edildi onaylandı... C# 23 sn.
delphi 7 = 9sn
delphi 2010 = 13sn
c# = 20sn
c++ builder 2010 -> 13 sn
Yukarida bahsi gecen sureler kodlarin derlenme sureleri degil. Calisma sureleri.
Gerbay bastan uyarmisti da bu kadar basit bir kodda sonucun bu kadar farkedecegini dusunememistim.
Kutuphaneleri zengin falan olabilir ama benim icin C# konusu kapandi. C# Amerikan oyunu.
yani biraktinizmi simdi C# hocam ?
VB 2010 10 sn'de bitirdi..
Alıntı yapılan: rck8942 - 02 Haziran 2012, 20:02:53
yani biraktinizmi simdi C# hocam ?
Benim isimi gormez hocam. Zaten kotu kodlama yapiyorum ustune ustluk kodlarda boyle yavas kosarsa yazacagim hic bir programdan hayir gelmez. Delphi ye devam fakat gerbay builder dan bahsediyordu birde ona bakilabilir.
Bu arada C# olayina https://www.picproje.org/index.php/topic,39532.msg289755.html#msg289755 (https://www.picproje.org/index.php/topic,39532.msg289755.html#msg289755) konusundan takildim. Aslan74 hocayi bulursam dovecegim.
Sanal XP üzerinde kurulu olan c++ builder 6 ile test ettim 8 sn tamamlanıyor işlem. Buda demek oluyor ki her zaman son versiyonu kullanmamak gerekiyormuş.
Alıntı yapılan: mozkan87 - 02 Haziran 2012, 20:06:44
Sanal XP üzerinde kurulu olan c++ builder 6 ile test ettim 8 sn tamamlanıyor işlem. Buda demek oluyor ki her zaman son versiyonu kullanmamak gerekiyormuş.
Bu sonucu makinanizin hizi ve ekran karti da belirler. Kendi makinanizda birde delphiye bakabilirmisiniz?
Eger Delphi C++ dan da hizliysa vaycanina diyecegim. Bu arada benim versiyon Delphi6.
Bu arada isletim sisteminin de kodun isletilme suresinde buyuk payi olabilir. Ben XP de calisiyorum.
Delphi kurulu değil ve kurulum dosyalarıda elimde yok ancak sonuç muhtemelen c++ ile aynı çıkacaktır.
Bilgisayar core2duo 2GHz çift çekirdek(Laptop) 2GB ram sanal makinanın rami 512 MB, çekirdeklerden biri sanal makinaya atanmış durumda, asıl işletim sistemi windows 7 64 bit.
Bu kıyaslamalar bana göre yanlış olmuş.
Döngü içinde label1.Refresh var. BU nedir? görüntüyü güzelleştir, bize göster demek.
c# görüntüye fazla ağırlık vermiş olabilir. CPU zamanlamasından görüntü için daha fazla % alıyor olabilir.
Ama ayrı thread yapıp öyle döndürsek eminim ikisi de eşit çıkacak. c# ın fazlası var eksiği yok gibi. Ben de delphi kullanıyorum ama bir iki tane ufak c# programı yapmıştım.
Mantik belli. It ite it kuyruguna buyuruyor.
C# da programimiz daha alt katmana derdini anlatacak, alt katman derdi anlayacak fonksiyonu cagiracak olme esegim olme.
Hani hizlar arasindaki oran 0.9 falan olsa anlayacagim da 0.17. El insaf.
Alıntı yapılan: z - 02 Haziran 2012, 20:34:47
Mantik belli. It ite it kuyruguna buyuruyor.
C# da programimiz daha alt katmana derdini anlatacak, alt katman derdi anlayacak fonksiyonu cagiracak olme esegim olme.
Hani hizlar arasindaki oran 0.9 falan olsa anlayacagim da 0.17. El insaf.
Bülent Hocam; birde lazarus(free pascal) ile deneyin.. Sonuç şaşırtıcı..
http://sourceforge.net/projects/lazarus/files/latest/download?source=files (http://sourceforge.net/projects/lazarus/files/latest/download?source=files)
Sasirtici derken? Lazarusun urettigi kodlar ne kadar surede kostu?
Programi yukletip kurdurmayla falan ugrastirma simdi. Delphideki kodlari aynen lazarusda derleyebiliyormuyuz?
Alıntı yapılan: z - 02 Haziran 2012, 20:42:58
Sasirtici derken? Lazarusun urettigi kodlar ne kadar surede kostu?
Programi yukletip kurdurmayla falan ugrastirma simdi. Delphideki kodlari aynen lazarusda derleyebiliyormuyuz?
Az sonra Delphi 2010 ve Lazarus ile derleyip yükleyeceğim deneyin..
Lazarusta label1.refresh; komutu çalışmıyor sanırım.. Sayarken göstermiyor direkt sonucu gösteriyor. Belki ondan kısa sürdü. Lazarus ile delphi kodlarının çoğunu derleyebilirsiniz.. ama delphi için yazılan elemanlarda sıkıntı çıkartabilir..
http://www.dosya.tc/server17/2cRmjt/Deneme.rar.html (http://www.dosya.tc/server17/2cRmjt/Deneme.rar.html)
thread yapmadıysanız ne yapsanız boş. kıyaslama yanlış. sebebi kendi beceriksizliğiniz. Böyle ağır işler thread içinde yapılır. yoksa program kitlenir, dütlenir. kitleneceği yoksa da kitlenir.
Tamam sen thread ile yaz sonucu da bize duyur. Fakat her ekrana bastigin karakter ardindan karakteri ekranda goreyim.
ekranı fazla takma. ekran kullanıcı için. asıl işi arka planda thread içinde yapmalısın. 100 iş yap, birini göster. kullanıcı bunu anlamaz. gerekirse gösterirsin. kum sâti çıksın. threat içinde olup biteni dışarı bildirmek için çeşitli mekanizmalar kullanılıyor.
3L3CTRO programi indirdim ve denemeyi yaptim. Fakat label1.refresh de uckagit yapiyor ve refresh yapmiyor. Kod calisti ve en son degeri ekrana yazdi. 2 sn de bitirdi. her sayim ardindan refresh yapmadigi icin bu sonuca bakip bir sey demek mumkun degil.
Alıntı yapılan: z - 02 Haziran 2012, 21:06:17
3L3CTRO programi indirdim ve denemeyi yaptim. Fakat label1.refresh de uckagit yapiyor ve refresh yapmiyor. Kod calisti ve en son degeri ekrana yazdi.
Bende ona baktım.. O yüzden az çıkmış olabilir Hocam.. ikisinlede aynı kod ile Timerla aynı zamanda saydırınca delphi ile aynı çıkıyor. 7sn çıkıyor.
Delphi = 4sn
C# = 8sn
Gozume carpan, delphi'de label yanip sonuyor, c#'da cok net cikiyor sayilar. microsoft .net 4.0 ile %40 performans artisi sagladigini duyurmustu. bazi kodlarda c++'dan daha hizli calistigini bizzat gordum. ancak boyle bir sonuca ulasmak mumkun değil. yani diyemem ki c# c++'dan daha hizli. bu yaniltici olur. bu tarz testler icin uygulanan bazi algoritmalar var. yani bence 1 for ile sonuca varmayin. isin icinden gorseli cikarinca farkin baya azlacagini dusunuyorum.
Edit: ornek bir karsilastirma (hangi .net versiyonu kullanildigini goremedim)
http://www.biomedcentral.com/1471-2105/9/82 (http://www.biomedcentral.com/1471-2105/9/82)
Cidden inanamıyorum.
Yazılım geliştirme dünyasını resmen altüst ettiniz...
private void button1_Click(object sender, EventArgs e)
{
int i;
j = 0;
label1.Text = DateTime.Now.ToString();
for (i = 0; i < 0x7FFFFFF; i++)
{
j += Math.Sin(i % 360 )*10;
}
label3.Text = j.ToString();
label2.Text = DateTime.Now.ToString();
}
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
j:=0;
label1.Caption := timetostr(now);
for i:=0 to $7FFFFFF do
begin
j := j+ Sin(i mod 360 )*10;
end;
label3.Caption := floattostr(j);
label2.Caption := timetostr(now);
end;
(http://e1206.hizliresim.com/y/2/7cq37.png)
@Cicjoe
C# da Textboxdan turettip HexBox adini verdigin component olusturma isini cok sevdim. Ayni islemi Delphi basligi altinda bir de delphi icin yapip gerekli aciklamalari yaparsan cok sevinirim.
Klein hocamın verdiği kodu lazarus ile derledim..
(http://e1206.hizliresim.com/y/2/7cqx2.jpg)
https://rapidshare.com/files/2473414385/lazarus_deneme.rar (https://rapidshare.com/files/2473414385/lazarus_deneme.rar)
@z
Hocam delphi ile aram pek iyi degil. Sadece ders olarak aldim. Sivilde acmisligim, kullanmisligim yok. =) Bu konuda iyi olan arkadaslara pas atayim.
C# bana her zaman yeterli gelmistir. C/C++ kodlarini da cagirma imkani oldugu icin performans gerektiren uygulamalarda da tercih edilebilir bence.
Alıntı yapılan: YARARMAN - 02 Haziran 2012, 00:15:05
Küçük bir yazılım hazırladım, onu inceleyebilirsin...
https://rapidshare.com/files/3125668450/SerialPortApp.zip (https://rapidshare.com/files/3125668450/SerialPortApp.zip)
(http://img411.imageshack.us/img411/879/screenklm.png)
Teşekkürler Hocam... :)
Alıntı yapılan: YARARMAN - 02 Haziran 2012, 00:15:05
Küçük bir yazılım hazırladım, onu inceleyebilirsin...
https://rapidshare.com/files/3125668450/SerialPortApp.zip (https://rapidshare.com/files/3125668450/SerialPortApp.zip)
(http://img411.imageshack.us/img411/879/screenklm.png)
Hocam Benim bir sorum var. Göndermiş olduğunuz yazılımı denedim fakat bir sorun var. Veri alma işlemi yapıyor fakat benim elektronik deneme kartım ilk açılışta hazır olduğuna dair mesaj gönderiyor bu mesajı görüntüleyemiyorum. Diğer mesajlar görüntüleniyor fakat diğerlerini göremiyorum. Devremi başka terminal programlarında denemiştim . Fakat bunda ilk açılış mesajını görüntüleyemiyorum...
Alıntı yapılan: serhat1990 - 06 Haziran 2012, 10:11:28
Hocam Benim bir sorum var. Göndermiş olduğunuz yazılımı denedim fakat bir sorun var. Veri alma işlemi yapıyor fakat benim elektronik deneme kartım ilk açılışta hazır olduğuna dair mesaj gönderiyor bu mesajı görüntüleyemiyorum. Diğer mesajlar görüntüleniyor fakat diğerlerini göremiyorum. Devremi başka terminal programlarında denemiştim . Fakat bunda ilk açılış mesajını görüntüleyemiyorum...
Programda port açılmadan, devren gönderiyorsa, programda onu göremezsin...
Alıntı yapılan: YARARMAN - 06 Haziran 2012, 11:14:35
Programda port açılmadan, devren gönderiyorsa, programda onu göremezsin...
Portu aktif ediyorum devremi sonradan devreye alıyorum.
Alıntı yapılan: serhat1990 - 06 Haziran 2012, 11:16:19
Portu aktif ediyorum devremi sonradan devreye alıyorum.
Devrede enerji yokken seri porta bağla.
Yazılımı aç sonra da portu aç.
Son olarak da devreye enerji ver.
Bu şekilde mi yapıyorsun?
Evet ,
Alıntı yapılan: serhat1990 - 06 Haziran 2012, 11:51:25
Evet ,
Şuanlık aklıma başka bir çözüm gelmiyor.
Kaçırdığımız bir nokta olabilir...
Arkadaşlar C# ile Seri portta veri alıp göndermek için seri portu nasıl kurmam gerekiyor.
Alıntı yapılan: Mucit23 - 06 Haziran 2012, 13:58:43
Arkadaşlar C# ile Seri portta veri alıp göndermek için seri portu nasıl kurmam gerekiyor.
Şu mesajımdaki yazılımı inceledin mi?
https://www.picproje.org/index.php/topic,39677.msg291514.html#msg291514 (https://www.picproje.org/index.php/topic,39677.msg291514.html#msg291514)
Devrede kullandığın BaudRate değeri ile aynı değeri kullanmalısın.
Hocam seri portu ilk defa kullanacağım. Bu yüzden seri portun parametrelerinin yazılımsal olarak nasıl ayarlanacağını bilmiyorum.
Mesaj derken hangi mesajınızdan behsettiniz.
İnternette bazı kısa bilgiler buldum ama pek aklıma yatmadı. Tam bir kod görsem anlıyacağım. Hepsi komut tabanlı anlatılmış.
edit;Yeni gördüm mesajınızı
Alıntı yapılan: Mucit23 - 06 Haziran 2012, 14:06:33
Hocam seri portu ilk defa kullanacağım. Bu yüzden seri portun parametrelerinin yazılımsal olarak nasıl ayarlanacağını bilmiyorum.
Mesaj derken hangi mesajınızdan behsettiniz.
İnternette bazı kısa bilgiler buldum ama pek aklıma yatmadı. Tam bir kod görsem anlıyacağım. Hepsi komut tabanlı anlatılmış.
edit;Yeni gördüm mesajınızı
SerialPort denetimini ister tasarım zamanında (design-time) Toolbox'dan forma yerleştirip kullanabilirsin.
İstersen de çalışma zamanında (run-time) genel olarak tanımlayıp kullanabilirsin.
Anlamadığın noktalar olursa, sorabilirsin...
Hocam biraz baktım. Ama her nedense sizin çalışmanızı çalıştıramadım. İlginç bir hata veriyor benim PC'de.
Bazı komutlar anlaşılıyor ama kodun genelini incelediğimde çok kafam karışıyor.
Vaktiniz varsa eğer Adım adım yapılması gerekenleri göstererek anlatabilirmisiniz?
Programı çalıştır. Comport'u seç. Baudrate 9600 ayarlı programda kendi devreni yada seriport yazılımını kendi devrendeki baudrate 'e göre ayarla başlata tıkla çalışıyor. Yalnız alma kısmında sıkıntı vardı. İyi çalışmalar..
Sanırım yaptım :)
Ama programın çalışıp çalışmadığını nasıl test edebilirim. Dizüstü bilgisayarım var USB seri dönüştürücüde var. Acaba isiste pic için bir program yazsam isisteki virtual terminal ile Programı haberleştirebilirmiyim. Virtual terminal tek başına sanal bir port oluşturmuyor.
Bir devre kur boarda :) Ben ilk yazdığım seri haberleşme programını denemek için devre bile bastım :) basit bir devre üzerinde led falan var birde rf modül var. 2 tane bastım veri alma işleminide tam yaparsam karsılıklı konusacam :) Evde arkadaşla deneyecem. Hazır terminal programlarında denedim sıkıntı yok. C# 'ta veri gönderme tamam . Almada biterse kendi haberleşme aracımı yapacam :)
Alıntı yapılan: Mucit23 - 06 Haziran 2012, 16:49:55
Sanırım yaptım :)
Ama programın çalışıp çalışmadığını nasıl test edebilirim. Dizüstü bilgisayarım var USB seri dönüştürücüde var. Acaba isiste pic için bir program yazsam isisteki virtual terminal ile Programı haberleştirebilirmiyim. Virtual terminal tek başına sanal bir port oluşturmuyor.
Çok zor değil. :)
Bir tane PIC'in TX-RX uçlarına ST232'li ya da MAX232'li bir devre bağla onu da RS232 konnektörüne bağla.
USB-RS232 çeviri de var mış zaten.
Onu da bağladın mı test edebilirsin.
Şimdiye kadar Protues ile donanımsal olarak hiç UART işlemi yapmadım, bilmiyorum da var mı öyle bir şey. :)
Aynı şekilde bende çalışıyorum. Daha Bu C# ile ikinci uygulamam. Çevre uygulamalara bakıyorum.
Şöyle bir kod yazdım seri iletişim için.
Bu şekilde anlaşılırmi bilmiyorum ama bir bakın isterseniz. Belki mantıken ters giden şeyler vardır.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
comboBox1.Text = "1200";
comboBox2.Text = "Com1";
}
string veri,gelen;
private void button1_Click_1(object sender, EventArgs e)
{
int baud;
veri = textBox1.Text;
switch(comboBox1.SelectedIndex)
{
case 1:
baud = 1200;
break;
case 2:
baud = 2400;
break;
case 3:
baud = 4800;
break;
case 4:
baud = 9600;
break;
case 5:
baud = 19200;
break;
case 6:
baud = 38400;
break;
case 7:
baud = 57600;
break;
case 8:
baud = 115200;
break;
}
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
serialPort1.PortName = comboBox2.SelectedItem.ToString();
serialPort1.BaudRate = 9600;
serialPort1.Open();
serialPort1.Write("deneme");
}
private void Form1_Load(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
foreach (string ComPorts in SerialPort.GetPortNames())
comboBox1.Items.Add(ComPorts);
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
gelen = serialPort1.ReadExisting();
}
}
}
Birde USB seri dönüştürücülerde çıkan daha bilgisayarda olduğu gibi +-10V genliktemi yoksa TTL midir. Max232 devresi gerekirmi?
Benim yazdığım projedeki gibi delegate kullan.
Gelen veriyi o şekilde al.
Sizin seriport devrenizi denedim sorun yok çalışıyor. elimde usb>485 çevirici var onun ile test ettim. yalnız tek sıkıntı çok uzun olmasada alma işleminde 'biraz' bekleme yapıyor.
Alıntı yapılan: subram - 06 Haziran 2012, 17:33:02Birde sizin seriport devrenizi denedim sorun yok çalışıyor. elimde usb>485 çevirici var onun ile test ettim. yalnız tek sıkıntı çok uzun olmasada alma işleminde 'biraz' bekleme yapıyor.
Ben SD kartlı bir devremden veri alışverişi yapıyorum.
Alma konusunda gecikme gibi bir sıkıntı yaşamadım şimdiye kadar.
Programı nasıl test ediyorsunuz?
Ben ulaganın hazırlamış olduğu programı çalıştırmaya kalktığımda resimdeki gibi bir hata veriyor.
(http://s18.postimg.cc/bzdplkqzt/Ads_z.png) (http://postimg.cc/)
picture hosting (http://postimg.cc/)
Mucit23, senin Project ya da Solution ayarlarında bir sorun oluşmuş.
Kaynak dosyayı bulamıyor.
Benim bilgiyarımdaki yolu gösteriyor. :)
Ben normalde bu projeyi ofisteki bilgisayara indirip denedim, sorun çıkmadı...
Hocam sizin proje masaüstünde. Daha önce salt okunur dosya problemleri ile karşılaşmıştım. Sanırım open project diyip açsam daha iyi olacak.
Olmuyor. Bu hatayı nasıl önlerim.
"Birde USB seri dönüştürücülerde çıkan daha bilgisayarda olduğu gibi +-10V genliktemi yoksa TTL midir. Max232 devresi gerekirmi?"
Usb seri dönüştürücüleri benim kullandığım için konuşuyorum TTL değildir. :) max232 devresi gerekir. Oda hiç birşey ya 4 tane kondansatör. Birde güç kaynağın yoksa 5v regülatör tamamdır. :) Kolay gelsin...
Alıntı yapılan: Mucit23 - 06 Haziran 2012, 17:46:18
Hocam sizin proje masaüstünde. Daha önce salt okunur dosya problemleri ile karşılaşmıştım. Sanırım open project diyip açsam daha iyi olacak.
Olmuyor. Bu hatayı nasıl önlerim.
Bir de şunu dene bakalım:
http://s2.dosya.tc/server14/sYD2Pn/SerialPortApp.zip.html (http://s2.dosya.tc/server14/sYD2Pn/SerialPortApp.zip.html)
Alıntı yapılan: ULAGA - 06 Haziran 2012, 17:53:11
Bir de şunu dene bakalım:
http://s2.dosya.tc/server14/sYD2Pn/SerialPortApp.zip.html (http://s2.dosya.tc/server14/sYD2Pn/SerialPortApp.zip.html)
Hocam son verdiğiniz dosyada aynı hatayı veriyor. Bi önceki mesajda verdiğim hata mesajına tamam diyip çıkınca ardından aşağıdaki gibi bir uyarı veriyor.
(http://s13.postimg.cc/dc4leufzb/Ads_z.png) (http://postimg.cc/image/3rkyryqn7/full/)
image host (http://postimg.cc/)
Anladım gösterdiğin resimde açıklık meydana gelmiş.
Bilgisayarında o anda port bulamadığı için combobox dolmuyor.
Dolmadığı için de index seçimi yapamıyor.
Sen hata veren o satırın başına çift taksim koy. ( // diye)
Dediğiniz gibi yapınca oldu. Ama sizin programdada eksiklik var gibi. Mesela ListCOM içeriği boş görünüyor. Neyse Ben birazdaha çalışayım. Yarın bu yaptığım seri port uygulaması deneyeceğim. İşten vakit bulursam aklımda bir iki uygulama daha var onlar üzerindede çalışırım.
Peki Benim verdiğim programın Genel olarak çalışmasında bir problem olurmu?
Alıntı yapılan: Mucit23 - 06 Haziran 2012, 23:27:02
Dediğiniz gibi yapınca oldu. Ama sizin programdada eksiklik var gibi. Mesela ListCOM içeriği boş görünüyor. Neyse Ben birazdaha çalışayım. Yarın bu yaptığım seri port uygulaması deneyeceğim. İşten vakit bulursam aklımda bir iki uygulama daha var onlar üzerindede çalışırım.
Peki Benim verdiğim programın Genel olarak çalışmasında bir problem olurmu?
Programın çalışmasında eksiklik yok.
Ancak deminki gibi açıklıklar olabilir.
ListCOM denetiminin içinin boş görünmesinin sebebi;
O an bilgisayarda tanımlı hiçbir port olmamasıdır.
Senin gönderdiğin kodda delegate kullanılmamış.
O yüzden ver alımında sorun çıkacaktır.
Benim gönderdiğim yazılım, temel alma-gönderme için eksiksiz bir yazılım.
Niye onu kullanmıyorsun?
Hocam açıkçası sizin kod biraz karmaşık geldi. Bende zaten başka yerlerden kopyalarayak yapmaya çalıştım. Veri gönderirse sorun yok. Ama madem bu işe girdik bari tam anlamıyla öğrenelim.
Boş bir vaktinizde vaktinizde seri port kullanımını ve temel veri alma gönderme işlemlerini, anlatırsanız gerçekten çok sevinirim.
Alıntı yapılan: Mucit23 - 06 Haziran 2012, 23:47:59
Hocam açıkçası sizin kod biraz karmaşık geldi. Bende zaten başka yerlerden kopyalarayak yapmaya çalıştım. Veri gönderirse sorun yok. Ama madem bu işe girdik bari tam anlamıyla öğrenelim.
Boş bir vaktinizde vaktinizde seri port kullanımını ve temel veri alma gönderme işlemlerini, anlatırsanız gerçekten çok sevinirim.
Katılıyorum...
Bir sorum daha var.
Mesela bir değişkenin değerine göre form üzerinde bir butonun Taban rengini ve yazı rengini değiştirmek istiyorum. Nasıl yapabilirim.
Alıntı YapBir sorum daha var.
Mesela bir değişkenin değerine göre form üzerinde bir butonun Taban rengini ve yazı rengini değiştirmek istiyorum. Nasıl yapabilirim.
private void button1_Click(object sender, EventArgs e)
{
int a = 5;
if (a == 5) {
button1.BackColor=System.Drawing.Color.Aqua;
button1.ForeColor = System.Drawing.Color.Red;
}
Evet dediğiniz gibi oluyor.
Fakat butonun dış sınırları aynı renkte kalıyor. Tümüyle rengini değiştiremezmiyiz.
Normal bir butonun dış rengi değişmez.
Ancak bir butonun FlatStyle özelliğini Flat olarak seçip, kodda da;
button1.FlatAppearance.BorderColor = System.Drawing.Color.Red;
yazarsanız, dış rengini değiştirebilirsiniz.
Hocam sizin kod çalışmadı nedense
private void button1_Click(object sender, EventArgs e)
{
button1.BackColor = System.Drawing.Color.Red;
button1.FlatAppearance.BorderColor = Color.Red;
}
olduğu gibi yazıyorum.
Butonun özelliklerinden FlatStyle'i Flat olarak değiştirdin mi?
Hocam rengi kullanıcı seçsin istiyosanız.Bi tane colordialog ekleyin projeye ve şöyle yazın;
private void button1_Click(object sender, EventArgs e)
{
colorDialog1.ShowDialog();
button1.BackColor = colorDialog1.Color;
}
Hocam dediğiniz gibi buton FlatStyle i Flat olarak seçmemişim. Renk Değiştirme işini anladım.
Çalışmalarım devam ediyor.
Şimdi bir sorum daha var.
Diyelim form üzerinde bir butona klavyeden bir tuşu atamak istiyoruz. Yani örneğin hem mause ile hemde kavyeden istediğim tuş ile butonun yaptığı işlemi yapabileyim. Biraz araştırdım. Normalde butonun yaptığı işlemi fonksiyon olarak tanımladım. Butona basıldığında o fonksiyonu çağırıp işlemi yaptırıyorum. Sıra geldi klavyeden iştiğim tuşun basıldığını anlamaya. Bunu nasıl yaparım.
Alıntı yapılan: Mucit23 - 08 Haziran 2012, 16:57:52
Hocam dediğiniz gibi buton FlatStyle i Flat olarak seçmemişim. Renk Değiştirme işini anladım.
Çalışmalarım devam ediyor.
Şimdi bir sorum daha var.
Diyelim form üzerinde bir butona klavyeden bir tuşu atamak istiyoruz. Yani örneğin hem mause ile hemde kavyeden istediğim tuş ile butonun yaptığı işlemi yapabileyim. Biraz araştırdım. Normalde butonun yaptığı işlemi fonksiyon olarak tanımladım. Butona basıldığında o fonksiyonu çağırıp işlemi yaptırıyorum. Sıra geldi klavyeden iştiğim tuşun basıldığını anlamaya. Bunu nasıl yaparım.
Şu geliştirdiğim örneği incele:https://rapidshare.com/files/1600640681/WindowsFormsApplication1.zip (https://rapidshare.com/files/1600640681/WindowsFormsApplication1.zip)
(http://img811.imageshack.us/img811/4186/screennz.png)
Hocam Sağolun. Akşam inceleyeyim.
Birde seri port işini çözdüm. Artık istediğim gibi data alıp gönderebiliyorum. Dediğiniz gibi data almak için delegate kullandım. Son gaz çalışıyorum. ;D
Alıntı yapılan: Mucit23 - 08 Haziran 2012, 19:02:09
Hocam Sağolun. Akşam inceleyeyim.
Birde seri port işini çözdüm. Artık istediğim gibi data alıp gönderebiliyorum. Dediğiniz gibi data almak için delegate kullandım. Son gaz çalışıyorum. ;D
Ellerine sağlık, sevindim...
hocam verdiğiniz klavye uygulamasına baktım.
programda iş yapan kısım şurası anladığım kadarı ile. yalnız küçük harf yazmak istediğimde kabul etmedi. neden acaba. bu komut yapısını biraz anlatabilir misiniz.
private void frmKey_KeyPress(object sender, KeyPressEventArgs e)
{
char ch = Char.ToUpper(e.KeyChar);
if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'z') )
{
e.Handled = true;
}
else
{
txtDisplay.Text += ch.ToString();
}
}
edit;
buldum galiba ToUpper dan kaynaklanıyor.
edit; istediğim buydu ;
char ch =(e.KeyChar);
if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'z') && (ch < 'A' || ch > 'Z'))
{
e.Handled = true;
}
else
{
txtDisplay.Text += ch.ToString();
}
Char.IsLetterOrDigit(ch) veya !Char.IsLetterOrDigit(ch) seklinde de kullanilabilir
Cicjoe dediğini yapamadım ama klavyedeki tüm karakterleri yazdırmanın yolunu buldum sanırım :) çok zevkli bu C# ya.
private void frmKey_KeyPress(object sender, KeyPressEventArgs e)
{
char ch =(e.KeyChar);
if ((ch < 0 || ch > 255) )
{
e.Handled = true;
}
else
{
txtDisplay.Text = ch.ToString();
}
}
Alıntı yapılan: cicjoe - 09 Haziran 2012, 01:33:59
Char.IsLetterOrDigit(ch) veya !Char.IsLetterOrDigit(ch) seklinde de kullanilabilir
Evet, onu da kullanabilirdim.
Ancak A<>F sınırlaması yapmak istedim. :)
Char.IsLetterOrDigit(ch) veya !Char.IsLetterOrDigit(ch)
nasıl kullanılır bu iki komut çözemedim.
Alıntı yapılan: subram - 09 Haziran 2012, 01:59:47
Char.IsLetterOrDigit(ch) veya !Char.IsLetterOrDigit(ch)
nasıl kullanılır bu iki komut çözemedim.
İlki ch değişkeni harf ya da rakamsa.
İkicisi ise ch değişkeni harf ya da rakam değilse.
=) o amacla soylemedim hocam, yani niye kullanmadiniz gibisinden, yoksa ayni isi yapinca farkmaz. kodda 0-9 a-z A-Z gorunce birden aklima geldi =)
@subram
c#'da char 2 byte. yani 0-255 araligini tasiyor. unicode destegi icin. ama noktalama isaretlerini iptal etmek isterseniz mesela soyle kullanabilirsiniz.
if (Char.IsLetterOrDigit(ch))
txtDisplay.Text += ch.ToString();
else
e.Handled = true;
güzelmiş. sağolun. bu arada şu kurs işini nasıl hızlandırabiliriz :D
Hocam peki iki tuşa aynı anda basılması gerekiyorsa nasıl yaparız.
Mesala 'a' ve 'w'ye aynı anda basıldıgında messageBox açılsın istiyorum, nasıl yaparız bunu. ???
Alıntı yapılan: desman - 09 Haziran 2012, 14:41:06
Hocam peki iki tuşa aynı anda basılması gerekiyorsa nasıl yaparız.
Mesala 'a' ve 'w'ye aynı anda basıldıgında messageBox açılsın istiyorum, nasıl yaparız bunu. ???
Şunu bir dene:https://rapidshare.com/files/1406654267/WindowsFormsApplication1.zip
Arkadaşlar tekrar merhaba.
Bugün işlerin hafiflemesiyle birlikte yine C#üzerinde çalışmaya başladım. Birkaç sorum olacak.
C# üzerinde kullanılabilir sanal seri portları(Com1,Com2,Com3....)öğrenip combobox içerisinde listelemek istiyorum. Bunu nasıl yaparım?
Diğer bir sorum ise şudur.
Seri port terminal benzeri birşey yazıyorum. Programda en son ayarladığım değerleri( Baud Değeri, Com noktası vs) Kayıt edip Formu tekrar çalıştırdığımda bu değerleri alıp combobox içerisine yerleştirmek istiyorum. Yani en sonki ayarlar değiştirlmediği sürece kalacak. Bunu nasıl yaparım?
System.IO.Ports.SerialPort.GetPortNames ile yapabilirsin.diğer sorunun cevabı ise buyuk ihtimal dosyadan okuma ile olur gibi dusunuyorum.
En iyisi şöyle yapayım kayıt işlemini.
Forumdan çıkarken bir txt dosyası açıp. Bu dosya üzerine sonki değerleri yazıp. Form yüklenirken ise txt dosyasını okuyup bu değerleri tekrar combobox içerisine yerleştireyim. Bunu yapayım sonra kullanılabilir portları öğrenme işine bakıcağım...
kullanılabilir portları ögrenme olayında hiç bir şey yok sadece daha önce verdiğim kodu kullanacaksın.o sana string dizisi verir o diziyide direkt olarak combo box a atabilirsin.
Şöyle yapabilirsiniz hocam:
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.DataSource = System.IO.Ports.SerialPort.GetPortNames();
comboBox1.SelectedItem = 1;
}
Sağolun arkadaşlar. Çok Teşekkür Ederim.
Dosya kayıt işlemini başardım.(Biraz kopya çektim aslında ::))
Şimdi kullanılabilir portlara bakalım..
mesaj birleştirme:: 11 Temmuz 2012, 16:35:07
Birde şöyle bir problem var anlam veremiyorum.
Form ilk çalıştırıldığında işletilen events hangisidir. İnternette bakıyorum hep private void Form1_Load(object sender, EventArgs e)
evets içerisine yazılıyor. Ama ben buraya kodlarımı yazdığımda çalıştırılmıyor. Bunun yerine public Form1() events içerisine yazıyorum çalıştırılıyor. Buna hakikaten anlam veremiyorum yazdığım kodlar şunlar. Bi inceleyebilirmisiniz.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using Microsoft.Win32;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
int baud = 1200;
public Form1()
{
InitializeComponent();
FileStream Srw;
StreamReader Sr;
Srw = new FileStream("Old_Value.txt", FileMode.Open, FileAccess.Read);
Sr = new StreamReader(Srw);
comboBox1.Text = Sr.ReadLine();
Sr.Close();
comboBox2.Text = "Com1";
connect.Text = "Bağlan";
connect.BackColor = Color.Green;
connect.ForeColor = Color.White;
connect.Text = "Baslat";
}
private void Form1_Load(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
serialPort1 = new SerialPort();
// serialPort1.DataReceived += new SerialDataReceivedEventHandler(SerialPort1_DataRecived);
}
public void Rs232SendData()
{
if (serialPort1.IsOpen == false)
{
MessageBox.Show("Bağlantı kurulmadı", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
try
{
serialPort1.Write(textBox1.Text.ToString());/* Datayı seri olarak gönder*/
}
catch (Exception)
{
MessageBox.Show(this,"Bir Hata algılandı. Lütfen Daha sonra Tekrar deneyin", "Hata!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
}
public void Baud_value()
{
switch (comboBox1.SelectedIndex)
{
case 0:
baud = 1200;
break;
case 1:
baud = 2400;
break;
case 2:
baud = 4800;
break;
case 3:
baud = 9600;
break;
case 4:
baud = 1920;
break;
case 5:
baud = 38400;
break;
case 6:
baud = 57600;
break;
case 7:
baud = 115200;
break;
}
}
private void dataSend_Click(object sender, EventArgs e)
{
Rs232SendData();
}
private void connect_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen == false)
{
Baud_value();
serialPort1.PortName = comboBox2.SelectedItem.ToString();
serialPort1.BaudRate = baud;
try
{
serialPort1.Open();
connect.BackColor = Color.Red;
connect.ForeColor = Color.White;
connect.Text = "Durdur";
//serialPort1.DiscardInBuffer();
//serialPort1.DiscardOutBuffer();
}
catch (Exception)
{
MessageBox.Show(this, "Bir Hata algılandı. Lütfen Daha sonra Tekrar deneyin", "Hata!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
else
{
serialPort1.Close();
connect.BackColor = Color.Green;
connect.ForeColor = Color.White;
connect.Text = "Baslat";
}
}
public delegate void delegateG();
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
RxText.BeginInvoke(new delegateG(guncelle));
}
public void guncelle()
{
int yeni=0;
int recived = serialPort1.ReadByte();
if (recived != yeni)
{
yeni = recived;
RxText.Text += recived.ToString();
}
if (RxText.TextLength==100)
{
RxText.Text="";
}
}
private void label4_Click(object sender, EventArgs e)
{
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)13)
{
Rs232SendData();
}
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
Baud_value();
StreamWriter SW;
SW=File.CreateText("Old_Value.txt");
SW.WriteLine (baud.ToString());
SW.Close();
}
}
}
Program orasıyla burasıya oynaya oynaya arap şaçına döndü :D Böyle böyle olacak..
Kullanılabilir port işinide öğrendim. Vitruvius un verdiği kod çalışıyor. Teşekkür ederim.
Tasarım penceresinde Form'a sağ tıklayıp Properties dedikten sonra Load'ın Form1_Load ile ilişkili
olup olmadığını kontrol edebilirsiniz.Belki yanlışlıkla silmişsinizdir.
Merhaba
Geçen sefer fazla uğraşmadım şu form Load işine ama şimdi yine ihtiyacım oldu. Çözmem gerekiyor.
Form1 e sağ tıklayıp properties bölümüne baktığımda Load diye bir kısım göremedim. Formun Adı Form1 diye geçiyor.
Deneme açısında forma yine aşağıdaki gibi bir events ekledim
private void Form1_Load(object sender, EventArgs e)
{
MessageBox.Show("çalıştı");
}
Ne yapabilirim bu konuda..
Anladığım kadarıyla siz elle kodluyorsunuz...Ama eksik kodluyorsunuz.
Tasarım penceresini kulllanın..
(http://b1208.hizliresim.com/10/c/brry7.png) (http://bit.ly/c25MCx)
formda boş bir alana çift tıkla otomatik olarak load event ını oluşturacaktır
evet dediğin gibi oldu
private void Form1_Load_1(object sender, EventArgs e)
{
MessageBox.Show("çalıştı");
}
Doğrusu bu şekildeymiş. Teşekkürler.
Alıntı YapForm1_Load_1
Yazıyorsa eğer başka biryerde Form1_Load eventi vardır.
Tüm form1_load eventlerini kod penceresinden silerek, formun boş biryerinde çift tıklayarak
private void Form1_Load(object sender, EventArgs e) olduğunu göreceksiniz.
Eğer doğrudan kod kullanmak isterseniz olayları protected override lara bağlayabilirsiniz...
protected override OnLoad(EventArgs e)
{
//...
base.OnLoad(e);
}
Zaten protected override ifadesinden sonra birkez boşluğa tıklarsanız geçerli olayların listesini göreceksiniz.Olayı seçip Tab bastığınızda EventArgs kısımları otomatik yerleşecek... Duruma göre base.OnLoad() ifadesini başta veya sonda kullanabilirsiniz...
Bir Sorum daha var.
1 byte uzunluğunda bir sayıyı Hexadesimala çevirip bir texbox içerisine nasıl yazarım.
int i = 33 ;
string binary = Convert.ToString(i, 2);
string hex = Convert.ToString(i, 16);
int binaryToInt = Convert.ToInt32(binary, 2);
int hexToInt = Convert.ToInt32(hex, 16);
MessageBox.Show(binary + " " + hex + " " + binaryToInt + " " + hexToInt);
Teşekkürler Hocam Halletim
Ooo ne yaptınız yahu şu kadarcık kodu?
byte deger = 0x97;
textBox1.Text = deger.ToString("X2");
;D
Birini değil hepsini gösterdik..
Hocam merhaba.
C# omponetleri hakkında birkaç sorum olacaktı. C# da yeni nesneler naıl yapılır. Kısaca bunu anlatabilirmisiniz. Örneği farklı anahtarlar, Butonlar yapmak istiyorum. Veyahut mesela Led benzeri nesneler.. Bunlar resimlemi yapılıyor.
Bu arada devexpress yüklü. Devexpressle gelen çeşitli komponetler var.
Klasik formların dışında Daha çok görselliği olan formlar nasıl hazırlanır Buda anlatılırsa güzel olur.
Elbette. İstediğinize Custom Control deniyor. İnternette bolca örnek var. Buton, progressbar gibi kontroller yapmak istiyorsanız bunlar benim yaptıklarımdan bazıları:
[IMG]http://img209.imageshack.us/img209/821/wpf2.png[/img]
[IMG]http://img338.imageshack.us/img338/4/wpf1.png[/img]
[IMG]http://img805.imageshack.us/img805/3905/cs3.png[/img]
[IMG]http://img189.imageshack.us/img189/3708/cs2m.png[/img]
[IMG]http://img837.imageshack.us/img837/9936/cs1dz.png[/img]
İlk ikisi WPF ile, diğerleri ise Sadece C# ile hazırlandı. Bu tarz kontrolleri siz de yapabilirsiniz. Eğer küçük led benzetimi yapmak istiyorsanız en kolay yolu bir picturebox ve iki resim : yanık durumu ve sönük durumu... C# konusunda sıkıntınız olursa yardımcı olurum. ÖM atabilirsiniz...
bu wpf işine yavaştan bende giriş yaptım. bu 3d yüzünden. gayet kullanışlı. adamlar asp gibi code ve design ayrımı yapmışlar. design için xml benzeri bir dosya kullanılırken kod bölümünde vb yada c# kullanılıyor.
Alıntı yapılan: fatih6761 - 07 Eylül 2012, 14:14:38
Elbette. İstediğinize Custom Control deniyor. İnternette bolca örnek var. Buton, progressbar gibi kontroller yapmak istiyorsanız bunlar benim yaptıklarımdan bazıları:
[IMG]http://img209.imageshack.us/img209/821/wpf2.png[/img]
[IMG]http://img338.imageshack.us/img338/4/wpf1.png[/img]
[IMG]http://img805.imageshack.us/img805/3905/cs3.png[/img]
[IMG]http://img189.imageshack.us/img189/3708/cs2m.png[/img]
[IMG]http://img837.imageshack.us/img837/9936/cs1dz.png[/img]
İlk ikisi WPF ile, diğerleri ise Sadece C# ile hazırlandı. Bu tarz kontrolleri siz de yapabilirsiniz. Eğer küçük led benzetimi yapmak istiyorsanız en kolay yolu bir picturebox ve iki resim : yanık durumu ve sönük durumu... C# konusunda sıkıntınız olursa yardımcı olurum. ÖM atabilirsiniz...
Üzerinde Hello yazan buton çok güzel olmuş.. Tebrikler, başarılar :)
Teşekkürler. Hello yazan buton Vista tarzı Glass Button olarak geçiyor. WPF de yapması çok basit.
Merhaba arkadaşlar bir sorum olacaktı... C# ' ta seriporttan veri gelmişmi diye kontrol etmenin bir yolu varmıdır vardır ama nasıldır :) :)
Daha bu iş için çok baştayım . Kendi kafamca şöyle birşey yaptım . 10mS ' lik bir timer kurdum . Her 10mS'de bir seriport verisini okuyorum . Bunu ekrana yazıyorum . Fakat boş veride yazıyor. Veri gelmişmi gelmemişmi onu kontrol edip ekrana yazmayı nasıl yapabilirim :)
Yardımlarınızı bekliyorum...
Veriyi okumak için yazdığım kısım ... string bilgi;
private void timer1_Tick(object sender, EventArgs e)
{
bilgi = serialPort1.ReadExisting();
textBox7.Text = bilgi;
}
@Ulaga Hoca'nın bir örneği var fakat açıkçası anlayamadım. Kendim bu şekilde yazabildim . Biraz saçma geldi banada ama yeni başlayınca herşey doğru olmuyor.
DataReceived event'ini kullanabilirsin.
ReceivedBytesThreshold'tan buffer'da kaç byte
biriktinde tetikleneceğini seçersin
Alıntı yapılan: Ömer KANAR - 29 Eylül 2012, 15:37:54
DataReceived event'ini kullanabilirsin.
ReceivedBytesThreshold'tan buffer'da kaç byte
biriktinde tetikleneceğini seçersin
Ufak bir rutin yazmanız mümkünmü Hocam ?
serhat rutine gerek yok. serial port nesnesinin olaylarında "data recieved" var. oraya yazacaksın.
ama ozamanda "ben bu trehad da yapamam" der. onuda sonra konuşuruz.
mesaj birleştirme:: 29 Eylül 2012, 17:14:43
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
}
mesaj birleştirme:: 29 Eylül 2012, 17:16:46
(http://imageshack.us/a/img197/5213/adszhm.png)
Muhittin Hocam Tamamdır :)
Teşekkür ederim ...
http://www.4shared.com/rar/sjOjaWyV/Serial_Chart_1.html (http://www.4shared.com/rar/sjOjaWyV/Serial_Chart_1.html)
serhat şurada seri porttan aldığım bilgileri grafik eden bir program olacak. işine yarayabilir.
Alıntı yapılan: muhittin_kaplan - 29 Eylül 2012, 17:44:27
http://www.4shared.com/rar/sjOjaWyV/Serial_Chart_1.html (http://www.4shared.com/rar/sjOjaWyV/Serial_Chart_1.html)
serhat şurada seri porttan aldığım bilgileri grafik eden bir program olacak. işine yarayabilir.
Teşekkürler Hocam inceliyorum. Şimdi combobox olayları ile uğraştım sevmeye başladım . İşin pc kısmınında ayrı bir zevki var. Elimde 3axis sensör var bundan gelen bilgileri seriporttan alıp ekranda 3 boyutlu bir görsel üstünde bu hareketleri göstermek istiyorum biraz zor olacak gibi ama bakalım :)
Çok teşekkürler İyi çalışmalar.
Merhaba değerli PicProje Ailesi ;
Benim için zor bir soruyla yine karşınızdayım aklıma birşeyler geliyor fakat veri tabanı olayı giriyor sanırım . İşlemcide olsa eeprom ile sorun çözülür ama pc ortamında kafama oturtamadım. Şöyle bir program yazmak istiyorum .
Program güncel saat ve tarih bilgilerini tutacak . Ben bir butona basınca bu saat ve tarih bilgisini gönderecek.
Sonrasında ise bir data gönderecek . Fakat bu data ile ilgili şöyle birşey var . Bu data hiç bir zaman aynı olmayacak. 16 bitlik bir değere kadar çıkabilecek. Bu kısmı biraz daha detaylandırayım .
Programı çalıştırdım . Sistem 16 bitlik bir id tanımlayacak kendi içinde . Ve gönder butonuna basınca saat , tarih ve id bilgisini gönderecek.
Programdan bir daha gönder butonuna basarsam saat , tarih gönderecek . id bu sefer farklı olacak .
Sistem açılıp kapansa dahi aynı id' yi tekrar göndermeyecek . Bunu nasıl yapacağım konusunda bir bilgisi olan varmıdır. Neleri araştırmam gerekir.
Şimdiden teşekkür ederim ...
İyi çalışmalar.
.NET 4.5
Namespace: System.Windows
UIElement.Uid Property
Alıntı yapılan: mufitsozen - 03 Ekim 2012, 17:01:52
.NET 4.5
Namespace: System.Windows
UIElement.Uid Property
Teşekkürler Mufit Hocam.
Hocam çok az açmanız mümkünmü c# konusunda çok yeniyim . Yazdıklarınıza baktım fakat pek anlamadım açıkçası.
İyi çalışmalar.
c# ile ilgili bir problemim var
Form üzerinde bir değişiklik yaptığım zaman formda güncellenmiyor. Şöyleki forma yeni bir text veya buton eklediğimde formu çalıştırdığımda görünmüyor. Hep eski haliyle kalıyor. Projeyi komple kapatıp yeniden açtığımda son yaptığım değişiklikler kaydedilmemiş oluyor.
Problem ne olabilir.
Formu çalıştırmaktan kastettiğiniz nedir? F5 ile debug yaparken yapılan değişiklikler görünmüyor mu?
Hocam Şöyle sorun. Forma diyelim bir buton veya textbox ekledim. Bu yaptığım değişiklikler hiç kaydedilmiyor. Yaptığım tasarımı çalıştırdığımda son yaptıklarım formda görünmüyor.
2 adet buton vardı. Bu butonların adını değiştirmiştim. Ondan sonra ne olduysa oldu. Ama bir yol buldum sanırım. Butonlarla ilgili tüm bilgileri silmem lazım.
Edit;
1 saattir denemediğim yöntem kalmadı... >:( >:( Neyseki daha tasarımın başında olduğu için silbaştan başladım.
Bir sorumdaha olacak. Biraz komplexs bir konu gerçekten. Bu aralar görüntü işleme ile uğraşıyorum. C# ve opencv nin hazır görüntü işleme kütüphanelerini kullanarak görüntü işleme üzerine bir çalışma yapacağım. . Open cv kütüphanelerini kullanabiliyorum. Amacım bilgisayara bağlı olan kameraları bir combobox içerisinde listelemek. Kullanıcının kamera seçmesine olanak sağlamayı hedefliyorum.
Bununla ilgili pek kaynak bulamadım açıkçası
burada bişeyler var ama c++ da yazılmış. Aynısını c# a uyduramadım bir türlü.
http://stackoverflow.com/questions/9276350/how-do-i-get-a-list-of-webcam-devices-using-opencv (http://stackoverflow.com/questions/9276350/how-do-i-get-a-list-of-webcam-devices-using-opencv)
Bu konuda çalışma yapan varmı?
C++ ile yazılması sorun değil ki. Zaten mantık aynı, OOP. Sadece bir Wrapper Class yazarak kolayca halledebilirsiniz. DLL fonksiyonları için DllImportAttribute kullanmak en kolayı...
Hocam dediğinizi pek anlayamadım.
Bana ne yapmam gerektiğini birazdaha açık yazabilirmisiniz.
C++ için yazılmış olan kodda kullanılan fonksiyonları C# da bulamıyorum. Bende opencv 2.1 var. önceki mesajımda verdiğim linkte 2.3 kullanılmış. Acaba sürümlemi alakalı?
Hocam, bulamadığınız fonksiyonlardan bahsediyorum, C# da sınıflarda olmayan ama yerel olarak derlenmiş dinamik bağlantı kütüphanelerinde ( kısace Native DLLs ) bulunan fonksiyonlar, C# da DllImport ile eklenebilir. Buna Platform Invoke denir ve P/Invoke olarak gösterilir. Red Gate firması bu P/Invoke'lar ve kullanımı için özel bir site açtı : http://www.pinvoke.net/ (http://www.pinvoke.net/) Burada Windows için yerel DLL'lerdeki birçok API'yi görebilirsiniz. Kullanımı şöyledir:
using System.Runtime.InteropServices;
//.. diğer using deyimleri ve son olarak ana sınıfın içinde şu şekilde tanımlıyoruz:
[DllImport("dll_adi_veya_yolu.dll")] // Bazı özel durumları karşılamak için zaman zaman NamedParameters'de eklenir.
static extern (donus_tipi) (fonk. adi) (alacagi_parametreler);
// Örneğin
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
Bu fonksiyonu doğrudan kullanabilirsiniz. OpenCV için de eğer C++ bilginiz ve API Reference dökümanları elinizde varsa bu şekildeki metodları bir sınıf altında toplayabilirsiniz. Bu tür sınıflara Wrapper Classes denir.
Umarım yardımcı olmuştur. İyi çalışmalar...
Teşekkür ederim. Bi araştırayım dediğinizi
Arkadaşlar merhaba.
Bilgisayara bağlı Com bağlantı noktalarını combobox içerisinde listemelek istiyorum.
internette birkaç örnek buldum fakat çalıştıramadım.
SerialPort.GetPortNames() Fonksiyonunu çalıştıramadım.
Bunun kullanımı nasıl?
Hocam SerialPort.GetPortNames fonksiyonu string[] türünden döndürür. Yani fonksiyonun dönüş değerini bir string dizisine atıp combobox'a ekleyeceksiniz.
// Port names
string[] availablePorts = SerialPort.GetPortNames();
this.comboBoxPortNames.Items.AddRange(availablePorts);
Seri portlarla ilgili basit bir uygulama yazmıştım SerialPort sınıfının özellikleri ve kullanımını görebiliyosunuz isterseniz öm ile yollayabilirim..
İyi çalışmalar hocam...
Hocam iyi olur. Daha önce seri portu hiç kullanmadım c# ile. Sağa sola bakarak ilerliyorum...
buraya yüklerseniz bende faydalanabilirim.
Bir Sorum olacak.
Seri porttan bir dizi halinde iki farklı data alıyorum. Örnek olarak sıcaklık bilgisi olabilir.
Gelen Data Formatı şöyle
"A-25B002C045" gibi
Mcu dan bu formatta data gönderiyorum. Ben bilgisayar tarafında gelen stringi bu tanımlayıcılara göre ayırmak istiyorum.
Mesela "A" karakteri görüldüğü zaman A karakterinden sonra gelen 3 karakteri yani -25 i bir stringer yerleştireceğim. Aynı şekilde "B" karakteri geldiği zaman ondan sonra gelen 3 karakteri yani 002 değerini ayrı bir stringe yerleştireceğim. Aynı durum "C" tanımlayıcısı içinde geçerli. Burada Sayısal değerlerden önce gelen Karakterler sadece tanımlayıcı, gelen datanın ne olduğunu bana bildirecek.
MCU tarafından gönderilen data formatını değiştirebilirim.
Bu dediğim işlemi Nasıl yaparım?
Alıntı yapılan: Mucit23 - 10 Mart 2013, 11:28:23
Bir Sorum olacak.
Seri porttan bir dizi halinde iki farklı data alıyorum. Örnek olarak sıcaklık bilgisi olabilir.
Gelen Data Formatı şöyle
"A-25B002C045" gibi
Mcu dan bu formatta data gönderiyorum. Ben bilgisayar tarafında gelen stringi bu tanımlayıcılara göre ayırmak istiyorum.
Mesela "A" karakteri görüldüğü zaman A karakterinden sonra gelen 3 karakteri yani -25 i bir stringer yerleştireceğim. Aynı şekilde "B" karakteri geldiği zaman ondan sonra gelen 3 karakteri yani 002 değerini ayrı bir stringe yerleştireceğim. Aynı durum "C" tanımlayıcısı içinde geçerli. Burada Sayısal değerlerden önce gelen Karakterler sadece tanımlayıcı, gelen datanın ne olduğunu bana bildirecek.
MCU tarafından gönderilen data formatını değiştirebilirim.
Bu dediğim işlemi Nasıl yaparım?
Gelen komutu tamamen string olarak bir değişkene atadıktan sonra split fonksiyonu ile dediğin işlemi yapabilirsin.
mucit
bu iş için instr ve mid left substring gibi string işlemlerini kullanman gerekir.
TextBox1.Text = [text]
Dim textStartAdress As Short
Dim textStopAdress As Short
Dim TextLeght As Short
textStartAdress = (InStr(Me.TextBox1.Text, "P")) + 1
textStopAdress = InStr(Me.TextBox1.Text, "B")
TextLeght = textStopAdress - textStartAdress
If textStartAdress > 0 And textStopAdress > textStartAdress Then
PVoltage = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
Me.Label3.Text = PVoltage
End If
textStartAdress = (InStr(Me.TextBox1.Text, "B")) + 1
textStopAdress = InStr(Me.TextBox1.Text, "C")
TextLeght = textStopAdress - textStartAdress
If textStartAdress > 0 And textStopAdress > textStartAdress Then
BVoltage = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
Me.Label5.Text = BVoltage
End If
textStartAdress = (InStr(Me.TextBox1.Text, "C")) + 1
textStopAdress = InStr(Me.TextBox1.Text, "T")
TextLeght = textStopAdress - textStartAdress
If textStartAdress > 0 And textStopAdress > textStartAdress Then
Curr = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
Me.Label7.Text = Curr
End If
textStartAdress = (InStr(Me.TextBox1.Text, "T")) + 1
textStopAdress = InStr(Me.TextBox1.Text, "A")
TextLeght = textStopAdress - textStartAdress
If textStartAdress > 0 And textStopAdress > textStartAdress Then
ExTemp = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
Me.Label9.Text = ExTemp
End If
textStartAdress = (InStr(Me.TextBox1.Text, "A")) + 1
textStopAdress = InStr(Me.TextBox1.Text, "F")
TextLeght = textStopAdress - textStartAdress
If textStartAdress > 0 And textStopAdress > textStartAdress Then
Dim AbsorpVoltage As Single = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
Me.Label11.Text = AbsorpVoltage
End If
textStartAdress = (InStr(Me.TextBox1.Text, "F")) + 1
textStopAdress = InStr(Me.TextBox1.Text, "L")
TextLeght = textStopAdress - textStartAdress
If textStartAdress > 0 And textStopAdress > textStartAdress Then
Dim FVoltage As Single = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
Me.Label13.Text = FVoltage
End If
textStartAdress = (InStr(Me.TextBox1.Text, "L")) + 1
textStopAdress = InStr(Me.TextBox1.Text, "E")
TextLeght = textStopAdress - textStartAdress
If textStartAdress > 0 And textStopAdress > textStartAdress Then
Dim LVoltage As Single = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
Me.Label15.Text = LVoltage
End If
mesaj birleştirme:: 10 Mart 2013, 13:07:36
Yukardaki kod Vb.net ile yazılmıştır.
ilk satırlarda dikkat edersen P ve B arasını almak için hemen altında B ile C arasını almak için Başlangıç ve bitiş sayılarını buluyorum
(instr ile) ve aradaki bilgileri alıp değişkene atıyorum. (Mid ile)
@Mucit23 hocam buyrun örnek uygulama:
http://s3.dosya.tc/server/mv4EKg/SerialPortDemo.zip.html (http://s3.dosya.tc/server/mv4EKg/SerialPortDemo.zip.html)
@muhittin_kaplan hocam C#'ta fonksiyonların isimleri biraz daha farklı. Şöyle basit bir kod yazabiliriz:
string[] ParseSerialPacket(string packet)
{
string[] result = new string[3];
const splitCharA = 'A';
const lengthCharA = 3;
const splitCharB = 'B';
const lengthCharB = 3;
const splitCharC = 'C';
const lengthCharC = 3;
int indexOfA = packet.IndexOf(splitCharA, 0);
result[0] = packet.Substring(indexOfA, lengthCharA);
int indexOfB = packet.IndexOf(splitCharB, 0);
result[1] = packet.Substring(indexOfB, lengthCharB);
int indexOfC = packet.IndexOf(splitCharC, 0);
result[2] = packet.Substring(indexOfC, lengthCharC);
return result;
}
Tabi bu kodlama 10 üzerinden 1' zor alır :) Mantığı çözebilin diye bu şekilde yazdım. Mantığı çözdükten sonra zaten kendiniz kodu iyileştirirsiniz...
hocam kodlamada her işin kolayı vardır. benim verdiğimi öğrencim bana verse kalırdı :)
Hocam aslinda sabah ufak bir kod parçası yazdım. indexof fonksiyonu ile gelen string içerisinde tanimlayici araması yaptım. Sonra tanimlayıcı kaçinci sirada ise o siradan itibaren datalari alip diziye yerleştirdim.
Bunu yine başka bir programdan gördümüştüm. Çat pat çalıştı ama sürekli exeption aliyorum. Pek mantiğida aklima yatmamisti zaten.
Eve gidince size yazdiklarimi göstereyim.
Seri port nesnesinin data recieved fonksiyonuna her bir karakter geldiğindemi event gönderiliyor. Buna göre kendim bir fonksiyon yazmayı deneyeceğim..
Alıntı yapılan: Mucit23 - 10 Mart 2013, 19:29:33
Hocam aslinda sabah ufak bir kod parçası yazdım. indexof fonksiyonu ile gelen string içerisinde tanimlayici araması yaptım. Sonra tanimlayıcı kaçinci sirada ise o siradan itibaren datalari alip diziye yerleştirdim.
Bunu yine başka bir programdan gördümüştüm. Çat pat çalıştı ama sürekli exeption aliyorum. Pek mantiğida aklima yatmamisti zaten.
Eve gidince size yazdiklarimi göstereyim.
Seri port nesnesinin data recieved fonksiyonuna her bir karakter geldiğindemi event gönderiliyor. Buna göre kendim bir fonksiyon yazmayı deneyeceğim..
Ne yapmak istediğini tam anlamadım. Ama bende seri port ile çalışıyorum. İşlemciden birden fazla veri geldiğinde bu verileri ayırt edip farklı yerlere yazdırıyorum ve bunun için data revieved fonksiyonunu kullanmadım. Çünkü kullandığımda her karakter geldiğinde farklı değerler çıkartıyordu. Onun yerine şu şekilde bir kodu timer_tick fonksiyonuna yazarak sorunu çözdüm.
gelen = Convert.ToString(serialPort1.ReadExisting()); //Gelen veri içinde sayılarda bulunduğu için böyle bir dönüştürme kullandım.
label2.Text = gelen.Split(' ')[0];// Boşluk karakterini gördüğünde veriyi böl. İlk böldüğü veri 0 numarasını alacaktır.
if (gelen.Split(' ').Length > 1)//Eğer böldüğün veri birden fazla karakter içeriyorsa
label4.Text = gelen.Split(' ')[1];//Birinci karakteri label4'e yaz.
Mucit tekbir karekter yada komple string gelme olayını
gönderdiğin dataya göre ve aldığın yerdeki kullandığın fonksiyona göre değişir.
eğer gönderdiğin yerde /r/n var sa
mySerialPort.ReadLine
ile alırsan komple string i alırsın.
Hocam benim yazdığım kodlar bunlar.
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
RxString += serialPort1.ReadExisting();
this.Invoke(new EventHandler(string_index));
}
private void string_index(object sender, EventArgs e)
{
int xstart = RxString.IndexOf('X');
int ystart = RxString.IndexOf('Y');
int zstart = RxString.IndexOf('Z');
if (xstart != -1)
{
Xaxis = RxString.Substring(xstart + 1, 3);
label7.Text = Xaxis;
}
if (ystart != -1)
{
Yaxis = RxString.Substring(ystart + 1, 3);
label8.Text = Yaxis;
}
if (zstart != -1)
{
Zaxis = RxString.Substring(zstart + 1, 3);
label9.Text = Zaxis;
RxString = "";
}
}
Mantıken çalışması lazım. Sürekli Nezamanki data gelmeye başlıyor ozaman sürekli exception hatası alıyorum.
Aldığım hata budur.
(http://s22.postimg.cc/j9ziywm8x/Ekran_Al_nt_s.png) (http://postimg.cc/image/7kvjaxva5/full/)
image upload (http://postimg.cc/)
Burada ne demek istiyor.
serialPort1.ReadExisting
yerine readline yapsana.
muhtemel hatan
xstart tan başla 3 karekter al diyorsun. ya 1 karekter varsa
Alıntı yapılan: muhittin_kaplan - 11 Mart 2013, 00:10:48
muhtemel hatan
xstart tan başla 3 karekter al diyorsun. ya 1 karekter varsa
Hocam Readline ı da denerim.
sorun dediğiniz gibi ya 1 karakter varsa?
Onuda çözdüm.
MCU da tüm dizi sonuna ; koydum.
sonra data recieved de şöyle bir değişiklik yaptım.
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
RxString += serialPort1.ReadExisting();
int temp = RxString.IndexOf(';');
if (temp != -1)
{
this.Invoke(new EventHandler(string_index));
RxString = "";
}
}
yahu öyle yapma
readline ı koyduğunda /r ye bakıyor.
sen mcu ya gönderdiğin array a /r koy. burada readline yap
yok hocam dediğiniz gibi alamadım.
mcuda dediğiniz gibi dizisonunaa \r koydum.
c# dada dediğiniz değişikliği yaptım. Gelen giden yok
MCU kodunun array oluşturma ve gönderme bölümünü yazarmısın
mesaj birleştirme:: 11 Mart 2013, 00:38:01
ben \n koymuşum düzeltme \n zayten newline ya
sprintf (Deger,"P%2.2fB%2.2fC%2.2fT%2.2fA%2.2fF%2.2fL%2.2fE\n................................);
Ben bu şekilde gönderiyordum.
sprintf(ubuffer,"X%03hdY%03hdZ%03hd\r",(short int)xaxis,(short int)yaxis,(short int)zaxis);
Rs232_SendData(ubuffer);
Sanırım \n koymam gerekiyor..
evet \n koy.
Tamam Hocam çalıştı şimdi. Artık Sıkıntısız bir şekilde data alıyorum.
Yalnız problemmi dir pek anlayamadım ama C# da programı test ettiğim de pc programının seri port ile bağlantısını kestiğim zaman bilgisayar yazılımı donuyor. Bunun için ne gibi önlemler alınabilir. (Programcılık adına Programın Donmasına kilitlenmesine karşı olmazsa olmazlar)
Birde şunu sorayım. Combobox içerisinde herhangi bir şey ekli olup olmadığını nasıl anlarım?
hata denetimi yaptır.
try catch ile
combobox un içeriğinde herhangi bir eleman varmı yokmu diye bakmak için
combox.item.count değerine bak.
Muhittin hocam merhaba,
Formu açıp kapayınca bazen bu hatayı alıyorum.
(http://s21.postimg.cc/orwhqrvsn/Ads_z.png) (http://postimg.cc/)
host images (http://postimg.cc/)
Bu nedir?
Hocam Seri portta bağlantıyı kesince program donuyor. Bunu önlemek için ne yapmalıyım?
Hocam Exception furlatmasının sebebi Form kapanırken DataReceived olayının tetiklenmesi. Bildiğiniz gibi girdi/çıktı işlemlerini çekirdek yönetiyor, sizin EventHandler fonksiyonunuz çekirdek tarafından çağrılıyor, bir de bakılıyor ki Thread sonlanmış .Böylece hata fırlatılıyor. Bunu çözmek için OnClosing olayını override etmelisiniz.
protected override void OnClosed(CancelEventArgs e)
{
try
{
if (serialPort.IsOpen) // Port açıksa, kapatmayı unutma
serialPort.Close();
}
catch (Exception) { }
base.OnClosing(e);
}
Burada mesela kapatma sırasında bir hata oluşursa e.Cancel = true yapabilirsiniz. Böylece form kapanmaz. Kapatma iptal olur.
İyi çalışmalar...
hocam peki seri port bağlantısını kesince programın donma ması için ne yapabilirim.
Herzaman olmuyor ama %70 oluyor.
tahminimce arka planda şöyle olaylar gerçekleşiyor.
Seri porttan data alındığı sırada biz baglantyı kesmeye çalışıyoruz. Seri port elemanıda arada veri iletişimi varken hattı kapayamıyor. Veri paketinin bitmesini bekliyor. Dolayısıyla kasılıp kalıyor. Ara sıra kapatma işlemi paket arasına denk geldiği için sorun olmuyor.
Ben seri port bağlantısını kapama dan önce seri port elemanını aradaki veri iletişimini kesmesi için uyarmalıyım.
Fatih hocam tahminim dogruysa eğer nasıl bir çözüm üretebiliriz
Hocam ReadLine'ın olduğu satırı şöyle değiştirin:
try
{
RxString += serialPort1.ReadLine();
}
catch (TimeoutException) { }
Hocam yok başka bir problem var.
data alma kısmında gerekli değişiklikleri yaptım ama düzelen birşey olmadı.
protected override void OnClosed(CancelEventArgs e)
{
try
{
if (serialPort.IsOpen) // Port açıksa, kapatmayı unutma
serialPort.Close();
}
catch (Exception) { }
base.OnClosing(e);
}
Buradaki yapıyıda bir türlü çalıştıramadım. OnClosed fonksiyonunun FormClosed Fonksyonundan farkı nedir.
böyle bir hata alıyorum.
Error 1 'PC_Program.Form1.OnClosed(System.ComponentModel.CancelEventArgs)': no suitable method found to override
Ama kesinlikle problem sizin dediğiniz sebebten kaynaklanıyor. Çünkü Seri port Bağlantısı açık ve data geliyorken bağlantıyı kesmeden önce aradaki seri port kablosunu çekip veri akışını kestikten sonra seri portu kapatırsam sıkıntı olmuyor.
Çok mecbur kalırsam eğer seri portu kapatmadan önce işlemciye data göndermeyi kesmesini söyleyeceğim. Ama bu sorunu çözmez. Bunun dışında başka ne yapabilirim?
Hocam hata benim yanlış yazmamdan kaynaklanıyor galiba :)
protected override void OnClosing(CancelEventArgs e)
OnClosed değil OnClosing olacaktı. Bir de böyle deneyin...
Not : Form'un Closed olayından farkı yok, sadece yazması daha kolay. Hem override etme olayını da görmüş olursunuz diye yaptım.
İyi çalışmalar...
closed da formun tüm bileşenleri hafızadan atılırken closing de atılmadan önce bu olay işletilir.
closing işlemi yapılırken genelde
mesajbox(program kapatılsın mı) yapar sonrasında kapatırım.
Yok Hocam çözüm olmadı. Ben bahsettiğim işlemi deneyeceğim. Data alışverişinden MCU'nun haberi olsun. Durduk yere veri göndermesin.
Muhittin Hoca bana kızacak belki ama ben data alımını yine eskisi gibi yaptım. Bu şekilde exceptionlardan kurtuldum. Birde bağlantıyı kesmeden önce mcu ya veri göndermeyi kesmesini söyledim.
Şimdilik dediğim gibi exception almıyorum ama yine donma oluyor. Nasılki Seri port close fonksiyonunu çalıştırdığım zaman sıkıntı oluşmaya başlıyor..
mucit form closing olayına
MCU veriyi kes
seriportu kapat
Formu Kapat.
desene
benimde bir kaç sorum var,
C# da çok yeniyim, hatta ilk uygulamam. Foruma biraz baktım seri porttan veri alıp yazdırmayı çözdüm. Daha sonra bir örnek kod buldum verileri yazdırması daha güzel oldu. Şimdi gelen verilerden grafik çizdirmem lazım.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
foreach (string s in SerialPort.GetPortNames())
{
portnum_text.Text = s;
}
}
private void connect_port_Click(object sender, EventArgs e)
{
try
{
seri_port.PortName = portnum_text.Text;
seri_port.BaudRate = Convert.ToInt32(baud_text.Text);
seri_port.Open();
close_port.Enabled = true;
open_port.Enabled = false;
baud_text.Enabled = false;
portnum_text.Enabled = false;
}
catch
{
MessageBox.Show("Bağlantı kurulamadı.");
}
}
private void close_port_Click(object sender, EventArgs e)
{
seri_port.Close();
close_port.Enabled = false;
open_port.Enabled = true;
baud_text.Enabled = true;
portnum_text.Enabled = true;
}
public void seri_port_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
updateReceivedText(seri_port.ReadExisting());
}
delegate void updateReceivedTextDelegate(string newText);
private void updateReceivedText(string newText)
{
if (received_text.InvokeRequired)
{
// worker thread
updateReceivedTextDelegate del = new updateReceivedTextDelegate(updateReceivedText);
received_text.Invoke(del, new object[] { newText });
}
else
{
System.Threading.Thread.Sleep(5);
received_text.Text += newText;
}
}
private void button1_Click(object sender, EventArgs e)
{
received_text.Clear();
}
}
seri porttan gelen veri şu şekilde,
(http://m1304.hizliresim.com/18/r/mcu2y.png)
Benim programda veriler yalnız şu şekilde geliyor, proteusdaki gibi olmuyor. Üst üste biniyor gelenler. Bunu nasıl düzeltebilirim
(http://p1304.hizliresim.com/18/r/mcu47.png)
Alıntı yapılan: f15eagle - 23 Nisan 2013, 19:00:30
benimde bir kaç sorum var,
C# da çok yeniyim, hatta ilk uygulamam. Foruma biraz baktım seri porttan veri alıp yazdırmayı çözdüm. Daha sonra bir örnek kod buldum verileri yazdırması daha güzel oldu. Şimdi gelen verilerden grafik çizdirmem lazım.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
foreach (string s in SerialPort.GetPortNames())
{
portnum_text.Text = s;
}
}
private void connect_port_Click(object sender, EventArgs e)
{
try
{
seri_port.PortName = portnum_text.Text;
seri_port.BaudRate = Convert.ToInt32(baud_text.Text);
seri_port.Open();
close_port.Enabled = true;
open_port.Enabled = false;
baud_text.Enabled = false;
portnum_text.Enabled = false;
}
catch
{
MessageBox.Show("Bağlantı kurulamadı.");
}
}
private void close_port_Click(object sender, EventArgs e)
{
seri_port.Close();
close_port.Enabled = false;
open_port.Enabled = true;
baud_text.Enabled = true;
portnum_text.Enabled = true;
}
public void seri_port_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
updateReceivedText(seri_port.ReadExisting());
}
delegate void updateReceivedTextDelegate(string newText);
private void updateReceivedText(string newText)
{
if (received_text.InvokeRequired)
{
// worker thread
updateReceivedTextDelegate del = new updateReceivedTextDelegate(updateReceivedText);
received_text.Invoke(del, new object[] { newText });
}
else
{
System.Threading.Thread.Sleep(5);
received_text.Text += newText;
}
}
private void button1_Click(object sender, EventArgs e)
{
received_text.Clear();
}
}
seri porttan gelen veri şu şekilde,
(http://m1304.hizliresim.com/18/r/mcu2y.png)
Benim programda veriler yalnız şu şekilde geliyor, proteusdaki gibi olmuyor. Üst üste biniyor gelenler. Bunu nasıl düzeltebilirim
(http://p1304.hizliresim.com/18/r/mcu47.png)
Hocam seri_port.ReadExisting() fonksiyonu tamponda bulunan veriyi döndürür. Bunun yerine ReadLine deneyebilir misiniz?
Fatih hocam teşekkürler, tam yapmak istediğim işlem oldu.
enkoder tam tur attığında verileri ekrana yazıyor.
Netteki C# örnek ve kitapları genellikle bilgisayar üzerinde işlemler için, biraz daha bize yönelik serialport işlemleri için bir kitap yazı öneriniz var mı acaba ?
Daha yeni başladım nasıl devam etmeliyim.
Bide gelen verilerden 1 kanalı seçip zamanla grafiğini çizmem gerekiyor.
http://hasan-bozkurt.blogspot.com/2009/01/c-ile-grafik-izimi.html (http://hasan-bozkurt.blogspot.com/2009/01/c-ile-grafik-izimi.html)
Linkdeki örneği buldum, uyarlamaya çalışıyorum.
Başka grafik işlemi örnekleri var mı ?
Alıntı yapılan: f15eagle - 25 Nisan 2013, 14:04:33
Fatih hocam teşekkürler, tam yapmak istediğim işlem oldu.
enkoder tam tur attığında verileri ekrana yazıyor.
Netteki C# örnek ve kitapları genellikle bilgisayar üzerinde işlemler için, biraz daha bize yönelik serialport işlemleri için bir kitap yazı öneriniz var mı acaba ?
Daha yeni başladım nasıl devam etmeliyim.
Bide gelen verilerden 1 kanalı seçip zamanla grafiğini çizmem gerekiyor.
http://hasan-bozkurt.blogspot.com/2009/01/c-ile-grafik-izimi.html (http://hasan-bozkurt.blogspot.com/2009/01/c-ile-grafik-izimi.html)
Linkdeki örneği buldum, uyarlamaya çalışıyorum.
Başka grafik işlemi örnekleri var mı ?
Hocam açıkçası kitap öneremem, çünkü hiçbirini okumadım, kusura bakmayın :(
Grafik çizdirmek için MS Charts yani verdiğiniz linkteki örneği kullanabilirsiniz. Kullanımı basittir, internette bulabilirsiniz...
Kolay gelsin, iyi çalışmalar.
Selamlar,
Uzun bir aradan sonra tekrardan C# 'a bakmam gerekti. USB den ADC verisi alıp Line Graph üzerinde göstermem gerekiyor. Visual Studioda biraz formu hazırladım. Char yerleştirdim ve türünü Line olarak ayarladım.
Fakat X ve Y ekseninin değerlerini bir türlü sabit aralıkta yapamadım. Yapmak istediğim LDR den okuduğum Lüx değerini Açısal olarak gösterebilmek. Nasıl ayarlayacağımı bilmiyorum. Mesela X eksenini 0-360 arası 1'er birim aralıklarla , Y eksenini de 0-50000 arası sabit bir şekilde ölçeklendirmek istiyorum. Y ekseninin ölçeği değişmeyecek.
Ayarları nasıl yapacağımı bulamadım. Yardım edebilecek varmı
mesaj birleştirme:: 15 Mayıs 2015, 12:20:13
X ve Y ekseni için ölçeklendirmeyi kod ile yaptım.
chart1.ChartAreas[0].AxisY.Maximum = 50000;
chart1.ChartAreas[0].AxisX.Maximum = 360;
Ayarlardan nasıl yapacağımı bulamadım bir türlü.
Şimdi X eksenini deki grid sayısını arttırmak istiyorum. X eksenini 360 birim uzunluğunda ayarladım ama ekranda 3 tane grid var sadece. Bunun sıklığını nasıl arttırırım.
Chart'ın okadar çok ayarı varki hangisi benim işimi görüyor nerde bulamıyorum bir türlü.
Mesela formu ilk çalıştırdığımda Chart'ın görünümü aşağıdaki gibi oluyor.
(http://s4.postimg.cc/zea9wibsd/Ekran_Al_nt_s.jpg) (http://postimg.cc/)
jpg upload (http://postimg.cc/index.php?lang=turkish)
X ve Y ekseni ve Gridler görünmüyor ama chart'a veri gönderdiğimde görünmeye başlıyor. Bunuda çözmem lazım. Formu çalıştırır çalıştırmaz X ve Y ekseni görünür halde olması lazım.
Yardım ederseniz sevinirim.
mucit ben vb de yapmıştım ama aynıdır.
http://www.muhittinkaplan.com/2012/02/13/stm32f4-discovery-kit-ve-ivmeolcer/ (http://www.muhittinkaplan.com/2012/02/13/stm32f4-discovery-kit-ve-ivmeolcer/) incele bira birşeyler çıkartırsın.
Abi senin kodu inceledim. Senin kullandığın chart'da da aynı problem var. İlk çalıştığı zaman chart'a veri göndermediğimizde klavuz çizgiler eksenler vs görünmüyor.
Bunun yanı sıra chart ta X ekseninde bir türlü istediğimi yapamadım. Anlatabilmek için word üzerinde bir grafik oluşturdum.
(http://s22.postimg.cc/ggl5u5q01/Ekran_Al_nt_s.jpg) (http://postimg.cc/)
bmp resim yükle (http://postimg.cc/index.php?lang=turkish)
Sormak istediğim C# da chart kullanırken X eksenini nasıl resimdeki gibi yaparım? Y eksenine göndereceğim değerin en yüksek değeri 50000 felan ama bu eksen otomatik olsada olur. Sabit olmayadabilir. Fakat X ekseni sabit olması lazım.
Ne yapmam lazım. Bilgili arkadaşlardan ricam yol gösterin lütfen.
sen bunu propertes penceresinden yapmak mı istiyorsun, kodla yaptın sanırım.
Hocam yukarıda verdiğim grafiği word de çizdim.
Ondan önceki mesajımda ise kod ile x ekseninin uzunluğunu ayarlayabildiğimi söyledim. Properties penceresinden yapamadım bir türlü.
mucit resimleri göremiyorum.
Daha güzel yöntemi nedir bilmiyorum, lakin boş chart göstermek için, chart'a boş bir seri ekleyebilirsiniz, rengi transparan adınıda boş yaparsanız görünür. Sonra ilk gerçek veriniz geldiğinde bunu temizleyip onu ekleyebilirsiniz.
Series dummy = new Series();
dummy.ChartType = SeriesChartType.Point;
dummy.Color = Color.Transparent;
dummy.LegendText = " ";
dummy.Points.Add(2);
chart1.Series.Add(dummy);
Chart'ın önceden belli ise (ya da herhangi bir ekseni örneğin X) interval ayarları ile oynanıp birşeyler yapılabilir sanırım. Örneğin 360 maximumunuz için birde minimum 0 ayarlarsanız aşağıdaki kod X eksenini 9 alana böler
chart1.ChartAreas[0].AxisX.IntervalAutoMode = IntervalAutoMode.FixedCount;
chart1.ChartAreas[0].AxisX.Interval = 40;
Abi bu resim görünmüyormu
(http://s22.postimg.cc/ggl5u5q01/Ekran_Al_nt_s.jpg)
Grafiğimin X eksenini Bu resimdeki gibi yapmak istiyorum. Bu resimde Word de çizdim.
Güncell
Arkadaşlar ciddi anlamda yardıma ihtiyacım var.
Bir kaç projemde zedgraph kullanmıştım memnun kaldım. İstediğin özellik varmı yokmu bilmiyorum ama deneyebilirsin.
Birisi senin isteğine benzer bişey yapmış.
http://jenyay.net/ZedGraph/ManyYAxis (http://jenyay.net/ZedGraph/ManyYAxis)
(http://jenyay.net/uploads/ZedGraph/ManyYAxis/zedgraph_manyyaxis.png)
http://sourceforge.net/projects/zedgraph/ (http://sourceforge.net/projects/zedgraph/)
Alıntı Yap
chart1.ChartAreas[0].AxisY.Maximum = 50000;
chart1.ChartAreas[0].AxisX.Maximum = 360;
Ayarlardan nasıl yapacağımı bulamadım bir türlü.
Şimdi X eksenini deki grid sayısını arttırmak istiyorum. X eksenini 360 birim uzunluğunda ayarladım ama ekranda 3 tane grid var sadece. Bunun sıklığını nasıl arttırırım.
Chart'ın okadar çok ayarı varki hangisi benim işimi görüyor nerde bulamıyorum bir türlü.
Tavsiyem chart'ın ayarları ile uğraşmak istemiyorsan, en azından işine yarayacak kadar kısmını kontrol altına al.
Grid'a bak, ben bunun üzerinde ne yapmak isteyeceğim ?
- X birim değiştir.
Y birim değiştir.
X'e göre Y değiştir.
Y'ye göre X değiştir.
Line ekle/çıkar (X,Y)
...
Bunlara metod yaz.
Gelen verilerle de Event'leri tetikle. Mesela normalde ekranda x birimde 10 line olması gerekiyorsa, 0,x birimde 5 line olmasını sağla gibi..
işin sonunda senin grid'i şekillendirmek için herhangi bir manuel veri girmiyor olman gerek.
Kısacası; aynı osiloskop ekranının gelen sinyale göre kendini kalibre etmesi şeklinde bir kontrol elde et.
Sonrasını zaten sen gelen veri yapıyor..
Sen bir daha grid'le uğraşmıyorsun.
Kontrolsüz güç, güç değildir ::)
Kolay gelsin..
Anladığım kadarıyla Visual Studio'nun kendi grafikleri yetersiz. Bazı ayarları mutlaka kod ile vermek gerekiyor. Properties bölümünden yapılsa bile kısıtlı oluyor.
Ben bi ara dev express felan kurdum onla ilerleyeyim dedim ama onunlada fazla karıştırmak istemedim.
Aslında kodla birşeye kadar getirdim. Grafiğin ufak tefek ayrıntıları kaldı.
(http://s23.postimg.cc/j01yhia0b/Ekran_Al_nt_s.jpg)
Sormak istediğim birkaç şey kaldı.
Sağ üst köşedeki Series1 yazısını kaldıramıyorum. Ayarlar bölümünde o yazının değiştirildiği kısımdan yazıyı değiştirebiliyorum. Yazıyı komple sildiğimde tekrardan Series1 yazısı yerine geliyor. Kaldırmanın bir yolu varmı?
X ekseninde ise Min Value ve Max_value değerleriyle X ekseninin değerlerini verebiliyorum.
chart1.ChartAreas[0].AxisX.Minimum = 0;
chart1.ChartAreas[0].AxisX.Maximum = 180;
Buradaki ayarlardan minimun değeri -90, Max değer +90 yapsam tam istediğim gibi oluyor. Fakat bu sefer başka bir problem oluşuyor. X eksenine nokta eklemem gerektiğinide doğrudan X ekseninde -90 dan başlaması gerekekirken 0 dan başlıyor. Aşağıdaki resim açıklayıcı olur sanırım.
(http://s27.postimg.cc/oa813ki5v/Ekran_Al_nt_s.jpg)
Burada Chart her bir veri gönderdiğimde X ekseninin sayacı artıyor. Yeni bir veri gönderdiğimde sonraki noktaya veri ekleniyor. Chart ilk açıldığında X ekseninin tutulduğu sayacın değerini -90 yaparsam sanırım olur ama bunu nasıl yaparım bilmiyorum. Biraz karıştırayım.
mesaj birleştirme:: 16 Mayıs 2015, 23:47:29
Tamam chart1.Series[0].Points.AddXY(X_val,Y_val); işimi görüyor. Kordinatlarla ilgili problem kalmadı.
Sağdaki Series yazısını kaldırabilirsek süper. Olmasada sağlık olsun.
Alıntı yapılan: Mucit23 - 16 Mayıs 2015, 23:32:46
Sağdaki Series yazısını kaldırabilirsek süper. Olmasada sağlık olsun.
Bunun için şöyle bir şey demişler:
http://stackoverflow.com/questions/7404244/how-to-hide-the-series-name-from-showing-in-charting-control (http://stackoverflow.com/questions/7404244/how-to-hide-the-series-name-from-showing-in-charting-control)
Evet Bu işlemde halloldu. Çözüm" IsVisibleInLegend property to false" Satırında. @ fatih6761 Teşekkürler.
Son olarak Formu ilk çalıştırdığımda Chart aktif olmuyordu. Ancak bir veri gönderince aktif hale geliyor. Bunun bir çözümü varmı? Ben form açılırken boş bir veri göndererek geçici olarak hallettim ama hiç aklıma yatmadı.
Daha fazla.degistiremezsin sonucta o grafik bir win apidir ve o toolun sana sundugu bellidir. Sifirdan da yazmayi hic denemedik. Daha iyi grafik icin telerik eklentisi kullanabilirsin ama paralidir. 1 ay ucretsiz paketle işini vorebilirsin. Birde wpf var onu arastirabilirsin ama xaml bilmen gerekir.
Arkadaşlar C# da USB ile Pic tarafına veri göndermeye çalışıyorum. Usb library'si için Aşağıdaki linkteki usbHidPort isimli dll yi kulanıyorum.
https://320volt.com/pic18f4550-ccs-c-usb-termometre/ (https://320volt.com/pic18f4550-ccs-c-usb-termometre/)
Pic tarafına veri gönderirken hangi fonksiyonu kullanıyoruz. Kullanımı nasıl? Bulamadım bir türlü
USB işini hallettim.
Değişken işide tamam. Tür belirtmek gerekiyormuş.
Selamlar
C# da chart ayarları konusunda biraz yardıma ihtiyacım var.
Chart'ın türünü Spline yaptım. Line chart olacak. 24 saatlik veriler var. Şu anda bu verileri charta basıyorum.
Chartın X eksenini zaman eksenini yapmak istiyorum. X eksenindeki giridlere sırayla label nasıl eklerim. Örneğin Chartın x ekseninin 1 saat aralıklarla 24 parçaya böleyim. Label ler ile bunu belirteyim.
Bunu nasıl yaparım?
mesaj birleştirme:: 19 Şubat 2016, 11:36:35
X ekseninin max ve min değerleriyle oynayarak chartı istediğim gibi yaptım.
(http://s9.postimg.cc/v12t1ee3z/Ekran_Al_nt_s.jpg)
Yalnız X eksenindeki değerleri düzenleyemiyorum. X eksenindeki zaman değerlerini düzenlesem tamam olacak.
Değerlerin zaman olarak görünmesi için Series kısmında XvalueType değerini time şeklinde ayarladım. Tam istediğim gibi oldu. Fakat X eksenindeki değerleri değiştiremiyorum.
Zilyon tane ayarı var bu chartın. X eksenindeki değerleri nasıl düzenlerim bilgisi olan var mı?
Veriyi çizelgeye nasıl yazıyorsunuz?
mesaj birleştirme:: 19 Şubat 2016, 12:05:33
İstediğiniz böyle bir şey mi?
private void Form1_Load(object sender, EventArgs e)
{
chart1.ChartAreas[0].AxisX.Interval = 1;
chart1.ChartAreas[0].AxisX.LabelStyle.Angle = -90;
var dateStr = "02/19/2016 00:00:00 AM";
DateTime dt = DateTime.ParseExact(dateStr, "MM/dd/yyyy hh:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture);
for (int i = 0; i < 24; i++)
{
TimeSpan ts = new TimeSpan(i, 0, 0);
dt = dt.Date + ts;
this.chart1.Series["V"].Points.AddXY(dt.ToString("HH:mm"), i*3);
}
}
(http://oi68.tinypic.com/24yaeck.jpg)
Hocam X eksenindeki değerleri öyle olacak.
chart1.Series[0].Points.Add(sayi); fonksiyonu ile charta yeni bir veri ekliyorum. Yalnız bendeki veri sayısı 1440. 24 Saat boyunca 1 dakika aralıklarla ölçüm alınıyor.
Örnek sayısı biraz fazla. O kısmı nasıl ayarlaycağım?
Interval değeriyle oynayıp kaç eşit parçaya bölmesini istediğini ayarlayabilirsin.
1440/24 = 60
Aşağıdaki program da teorik olarak her dakikada bir veri yazıyor.
private void Form1_Load(object sender, EventArgs e)
{
chart1.ChartAreas[0].AxisX.Interval = 60;
chart1.ChartAreas[0].AxisX.LabelStyle.Angle = -90;
var dateStr = "02/19/2016 00:00:00 AM";
DateTime dt = DateTime.ParseExact(dateStr, "MM/dd/yyyy hh:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture);
for (int i = 0; i < 24; i++)
{
TimeSpan ts = new TimeSpan(i, 0, 0);
dt = dt.Date + ts;
for (int k = 0; k < 60; k++)
this.chart1.Series["V"].Points.AddXY(dt.ToString("HH:mm"), i + 10);
}
}
(http://oi64.tinypic.com/9gkb45.jpg)
Hocam sağolun şimdi hallettim sayenizde. Tam anlamıyla istediğim gibi oldu Teşekkür ederim.
Hocam bir sorum daha olacak.
En son verdiğiniz örnek gayet iyi çalışıyor. Fakat şöyle bir sorun var. Charta bir kere veri basıp sonra farklı bir dosya açıp tekrar grafik çizmeye kalksam çizmiyor. Chart'da eski grafik aynen duruyor. Acaba Charta yeni bir data basmadan önce eskisini silmek mi gerekiyor?
Aktif çalışan kodlar aşağıdaki gibi.
private void button2_Click(object sender, EventArgs e)
{
string temp = "";
int i = 9;
FileStream fs = new FileStream(DosyaYolu, FileMode.OpenOrCreate, FileAccess.Read);
StreamReader sw = new StreamReader(fs);
var dateStr = "02/19/2016 00:00:00 AM";
DateTime dt = DateTime.ParseExact(dateStr, "MM/dd/yyyy hh:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture);
//chart1.Series.RemoveAt(0);
for(int saat=0;saat<24;saat++)
{
TimeSpan ts = new TimeSpan(saat+1, 0, 0);
dt = dt.Date + ts;
for (int dak = 0; dak < 60; dak++)
{
string yazi = sw.ReadLine();
i = 9;
temp = "";
while (yazi[i] != 'C')
{
temp += yazi[i];
i++;
}
float sayi = float.Parse(temp);
sayi = sayi / 10;
chart1.Series[0].Points.AddXY(dt.ToString("HH:mm"), sayi);
}
}
sw.Close();
fs.Close();
}
Sorun ne olabilir? Yukarıdaki kodlar çalışınca dosyadan veriler okunup ekrana sırayla basılıyor.
Tam olarak anlamadım. Yapmak istediğiniz şey; mesela button1'a basınca chart1'e bir dosyadan okuduğum sıcaklık verisini çizsin. Button2'ye basınca da yine aynı chart1'e başka bir dosyadan okuyacağım gerilim değerini çizsin, gibi bir şey mi?
chart1.refresh() methodunu kullanabilirsiniz tekrar çizdirmek için.
Yok hocam öyle değil
buton_1 e basınca chart1 e txt dosyasindan veriyi okuyup basıyorum. Sonra başka bir txt dosyası açıyorum. Tekrar buton_1 e basınca yeni dosyadaki veriler charta basilmiyor.
Değerleri güncelledikten sonra chart1.refresh() methodunu kullanmayı denedin mi? Bu method chart'ın yeni değerlerle tekrar çizilmesine zorlar.
Yada öncesinde chart'ı aşağıdaki gibi temizleyebilirsin.
foreach(var series in chart1.Series)
{
series.Points.Clear();
}
Bunlar da olmazsa sorununu gösteren minimum uzunlukta bir projeyi yollarsan akşam bakarım.
Hocam eski noktaları silmek işe yaradı. Teşekkür ederim. Yeni veri göndermeden önce eskisini siliyorum verdiğiniz kod ile. Tekrardan teşekkürler.
Bir soru daha sormak istiyorum.
C# da formun ekran görüntüsünü resim olarak kaydetmek istiyorum. Biraz araştırdım internette ekran görüntüsü alan birkaç yazı buldum. Denedim yaptımda aslında ama kordinatlar tam uyuşuyor. Farklı yerlerin ekran görüntüsü alınıyor.
Ekran görüntüsü alıp kaydetmek için aşağıdaki kodları kullandım. Butona basınca Screenshot adında bir bitmap nesnesi oluşturuluyor. Ardından GFX.CopyFromScreen fonksiyonu ile ekran görüntüsü alınıyor. Yalnız parametrelerde yanlışlık olsa gerekki yanlış kordinatlar alınıyor.
private void button3_Click(object sender, EventArgs e)
{
//Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height
Bitmap Screenshot = new Bitmap(Form1.ActiveForm.Width,Form1.ActiveForm.Height);
Graphics GFX = Graphics.FromImage(Screenshot);
//Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size
GFX.CopyFromScreen(Form1.ActiveForm.Location.X,Form1.ActiveForm.Location.Y,0,0,Form1.ActiveForm.Size);
SaveFileDialog resim = new SaveFileDialog();
resim.ShowDialog();
Screenshot.Save(resim.FileName + ".jpg");
}
Bu GFX.CopyFromScreen fonksiyonuna gönderilen parametreler nasıl olmalı?
https://www.youtube.com/watch?v=DJCKMMDcUI0 (https://www.youtube.com/watch?v=DJCKMMDcUI0)
sanirim bu isinizi gorebilir hocam? (muzigin sesi rahatsizlik verebilir)
CopyFromScreen (https://msdn.microsoft.com/en-us/library/6yfzc507(v=vs.110).aspx) e bakarsan gözden kaçan ama çok önemli bir detay var.
Alıntı YapPerforms a bit-block transfer of color data, corresponding to a rectangle of pixels, from the screen to the drawing surface of the Graphics.
Yani bu methoda aktaracağın parametreler senin bilgisayar ekranındaki koordinatlar olmalı, formdaki değil.
Peki, form'daki koordinatımın ekranda neresi olduğunu nasıl bulacağım dersen;
PointToScreen (https://msdn.microsoft.com/en-us/library/system.windows.forms.control.pointtoscreen(v=vs.110).aspx) methodu var.
Diyelim ki formumuzda bir picturebox olsun ve butona bastığımızda bunun ekran görüntüsünü almak isteyelim.
İlk satırda picturebox'ın sınırlarını bulduktan sonra ikinci satırda da bilgisayar ekranındaki koordinatlarını buluyoruz. Gerisi resim alma ve kaydetme.
private void button1_Click(object sender, EventArgs e)
{
Rectangle bounds = pictureBox1.Bounds;
Point location = pictureBox1.PointToScreen(Point.Empty);
using(Bitmap myBitmap = new Bitmap(bounds.Width, bounds.Height))
{
using(Graphics g = Graphics.FromImage(myBitmap))
{
g.CopyFromScreen(location, Point.Empty, bounds.Size);
}
myBitmap.Save("test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
Selamlar. Şimdi videoya bakıyordum.
Hocam bende picturebox yok. Doğrudan hafızada bir bitmap oluşturup o bitmap'ı kaydetmem gerekir.
Anladığım kadarıyla copyfromscren sadece bilgisayar ekranında işe yarıyor. Dolayısıyla formun bilgisayar ekranındaki kordinatlarını bulmam gerek. PointToScreen fonksiyonunu form için nasıl kullanırım?
ustadim. size tam olarak ne lazim? videodaki adam. new bitmap olusturarak form un screenshot ini aliyor iste?
Picturebox'lı örnek vermemin sebebi belli bir alandaki görüntüyü yakalamak istersen diyeydi. Form görüntüsünü yakalamak istiyorsan Control.DrawToBitmap (https://msdn.microsoft.com/en-us/library/system.windows.forms.control.drawtobitmap(v=vs.110).aspx)'i kullanabilirsin.
private void button2_Click(object sender, EventArgs e)
{
var myForm = Form.ActiveForm;
using (var myBitmap = new Bitmap(myForm.Width, myForm.Height))
{
myForm.DrawToBitmap(myBitmap, new Rectangle(0, 0, myBitmap.Width, myBitmap.Height));
myBitmap.Save("form.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
PictureBox'ı anlamamıştım aslında ama şimdi olayı anladım gibi.
Teşekkürler
@vitruvius, Teşekkürler
@Karamel
Selamlar
c# ile ilgili ufak bir sorum olacak
C# 'da DateTime.Now.ToLongTimeString(); yapısı ile string olarak "21:14:32" formatında anlık saat bilgisini alıyorum. Ben bunu byte byte almak istiyorum. Örneğin Saat bilgisini 1 Byte, Dakika bilgisini 1 Byte, ve Saniye bilgini 1 Byte olacak şekilde nasıl alabilirim?
Alıntı yapılan: Mucit23 - 09 Ağustos 2017, 17:15:46
Selamlar
c# ile ilgili ufak bir sorum olacak
C# 'da DateTime.Now.ToLongTimeString(); yapısı ile string olarak "21:14:32" formatında anlık saat bilgisini alıyorum. Ben bunu byte byte almak istiyorum. Örneğin Saat bilgisini 1 Byte, Dakika bilgisini 1 Byte, ve Saniye bilgini 1 Byte olacak şekilde nasıl alabilirim?
byte saat = Convert.ToByte(DateTime.Now.Hour);
byte dakika = Convert.ToByte(DateTime.Now.Minute);
byte saniye = Convert.ToByte(DateTime.Now.Second);
Selamlar. Konuyu hortlatacağım.
c# da küçük bir yazılım yapıyorum. USB den data almam gerekiyor belirli periyotlarla. Datanın ne zaman geleceği belli değil fakat ben forumdan çıkarken data gelirse yaptıım yazılım aşağıdaki gibi bir hata veriyor ve donuyor.
(https://i.postimg.cc/xCJzCSZp/Ekran-Al-nt-s.jpg)
Bu hata nedir? Nasıl önlerim?
Formdan çıkmadan önce usbhid nesnesinin onDataReceived olayını düşürmelisiniz. Ayrık thread ile işlendiği için form kapandığında kendiliğinden iptal olmuyor.
Öte yandan bu bölüme try-catch eklerseniz sorun kalmaz.
Selamlar
Basit birşey belki ama yapamadım. C# da progressBar üzerine Yüzde olarak progressBar değerini yazdırmak istiyorum. İnternette anlatılan birkaç yöntemi denedim ama olmadı. Bunu nasıl yaparım?
Visual Studioda hazır bir çözüm yok maalesef. Hazır komopnentler var Infragistics vb. ama kullanmaya değer mi? Ben kullanmıyorum. Altenatif olarak kendin yapabilirsin.
Bu tip, komponentin sağlamadığı görsel öğeler için genel yöntem aynıdır. Komponentin Paint vb. olayı içinde kendi ilave yapmak istediğin metin vb. komponentin üzerine çizmendir. Örneğin, ProgressBar nesnesi için;
System.Drawing.Graphics g = progressBar1.CreateGraphics();
g.DrawString("text", this.Font, new SolidBrush(Color.Black), 10, 2);
şeklinde çizim yapabilirsin.
Bu yöntemi kullandığında aslında illaki progress bar da kulanmak zorunda değilsin. Sıradan bir picturebox üzerinde veya label üzerinde aynı şeyi yapabilirsin.
Teşekkürler biraz uğraşayım.
Selamlar
Şöyle bir processing form oluşturmaya çalıştım
(http://perschluter.com/wp-content/uploads/2012/07/process_scr.png)
Form üzerindeki progress bar değerini yaptığım işlemler arttıkça değerini güncellemek istiyorum. Bunun için harici bir form oluşturdum. Bu oluşturduğum Form üzerindeki progressbar elemanını public yaparak Form1 yani Ana form üzerinden ulaşabiliyorum şuanda. Progressbar formunu aktif ettikten sonra yine form1 üzerinde progressbar.value değerini güncelleyerek progressbar değerini değiştirebiliyorum. Ama bu şekilde sanki kulağı tersten tutmak gibi oldu. Pek düzgün çalıştığını da söyleyemem.
Amacım Form1'de bu oluşturduğum form da bir update event tarzı bir olay oluşturmak. Bununla birlikte Form'den bazı sayısal veriler göndermem gerekiyor. Bu işlemi efektif bir şekilde nasıl yaparım?
Çokta tersten sayılmaz. Bu işin muhtelif yolları vardır.
1- Senin Yaptığın gibi,
2- Ana formda statik event oluşturursun. Progresbarı taşıyan formada bu eventin hendlerini eklersin. Ana formda ilerleme oldukça, eventi tetklersin. Gösterge formuda event geldikçe kendini günceller.
3- Ana formda statik value değişkeni tanımlarsın. Gösterge formunda bir timer ile bu değeri sürekli okur ve PB yi güncellersin
4-Gösterge için form işine girmezsin. Ana formun üzerine senin gösterge formu dizynında bir panel eklersin. Normalde bu panelin Visible özelliğini false tutarsın. Lazım olduğunda, True yapıp, PB değerini doğrudan kendi işleminden güncellersin.
gibi hayal gücünle sınırlı çeşitli yollar var. Thread kullanıyorsan 2ve 3. maddede dikkat!
C#'ı sadece yaptığım mikroişlemci tabanlı uygulamalara arayüz yazmak için kullanıyorum. Hep ihtiyaçtan ufak tefek uygulamalar yaza yaza belli bir seviyeye getirdim. Fakat şu thread işlemlerini öğrenemedim henüz. Bu konuda baya eksiğim var.
ben olsam harici form yerine main form üzerinde progressbar yapardım. formdaki tüm görüntüleri ise event değil, mesela 10hz de koşan bir thread üzerinden güncellerdim.
...
abi event-thread falan neden uğraşıyorsunuz ya. koy bir timer güncelle gitsin.
@muhittin_kaplan Abi dur şimdi hele karıştırma ortalığı, Sıfırdan başlamayalım bi daha :D
Cevap yazan arkadaşlara teşekkürler. Sonradan timer ile yaptım. Bu şekilde daha iyi oldu.
Selamlar
ArrayList sınıfı ile global dinamik dizi tanımlıyorum. Amacım double türünden değerleri hafızada tutmak. Boyut kullanıcının gireceği parametrelere göre belirleneceği için Arraylist sınıfını kullanmayı uygun gördüm.
Arraylist.add ile diziye eleman ekliyorum sorun yok fakat diziye eklediğim elemanın N. elemanına doğrudan ulaşmanın bir yolunu bulamadım. Bu nasıl yapılır?
Array list dışında global dinamik dizi kullanmanın başka bir yolu varmı? Her yerde Arraylist çıkıyor
[] operatörünü denedin mi?
veya sadece list kullanabilirsin;
List<double> myList = new List<double>();
myList.Add(1.1);
double i = myList[0];
Alıntı yapılan: brandice5 - 24 Nisan 2020, 10:52:16[] operatörünü denedin mi?
veya sadece list kullanabilirsin;
List<double> myList = new List<double>();
myList.Add(1.1);
double i = myList[0];
Teşekkürler bu yöntem işime yaradı.
Bir soru daha sorayım genel olarak. C# da elde ettiğim bazı verilerle excell de basit bir tablo oluşturuyorum.
C#'da ToString sınıfında double bir verinin yazılış formatını ayarlarken aşağıdaki gibi bir yapı kullanıyorum.
sayımız 15.543634 gibi birşey olsun
sayi.ToString("0.000");
yukarıdaki yapıda yazdırınca olması gerektiği gibi 15.543 değerini yazdırmış oluyorum. Normalde sıkıntı yok. Fakat Bu yapıyı kullanarak elde ettiğim verileri excel tablosuna aktardığımda, excelin hücreleri biçimlendirirken kafası karışıyor. :-[
Normalde Excel sayıları 0,000 şeklinde ondalıklı olarak algılıyor. TR yazım formatında ondalık ayracı olarak virgül kullanılıyor. Fakat EU ve EN formatında ondalık ayracı olarak nokta kullanılıyor. Dolayısıyla ben excel deki hücreye 0.000 formatında bir yazma işlemi yaptığımda excel yazdığım veriyi bazen sayı bazen metin olarak algılıyor. Tabloda istemediğim farklı biçimler oluşuyor. Bunu önlemeye çalışıyorum
c# daki yazım formatını TR formatına çevirmeye çalıştım ama yapamadım. Excel deki formatı değiştireyim ne gelirse gelsin metin olarak algılasın dedim ama onuda beceremedim.
çıkamadım işin içinden. Nasıl çözeriz bu işi fikri olan var mı?
Excel'e aktarım yaptığın kütüphane önemli. Ancak doğru olanı Double veri double olarak, string veri string olarak aktarılmalı. Aksi halde dediğiniz sorunlar oluşur.
Şunu dene;
sayi.ToString("0.000").Replace('.', ',');
Excel için
using Microsoft.Office.Core;
using Excel = Microsoft.Office.Interop.Excel;
sınıflarını kullanıyorum
Alıntı yapılan: brandice5 - 26 Nisan 2020, 00:41:19Şunu dene;
sayi.ToString("0.000").Replace('.', ',');
deneyeceğim. Teşekkürler
Doğrusu:
using System.Globalization;
sayi.ToString("0.000", CultureInfo.CreateSpecificCulture("tr-TR"));
Selamlar
Bu dediklerinizi denedim ama hiçbiri işe yaramadı.
İşin ilginci Excell'e verileri yazarken Nerde nasıl yazağı belli olmuyor Örneğin ilk 10 Satır 1.234 gibi yazarken sonraki 10 satırı 1,234 gibi bir format ta yazabilyor. Yazılacak metnin türünün kod'da belirtmem gerekiyor.
Excelde Sütüna sağ tıklayıp Hücreleri biçimlendir seçeneğiyle açılan pencerede sütün kategorisini Sayı, Metin Tarih gibi değerler seçebiliyor. İşte bunu kodda nasıl yaparım bulamadım doğru yöntemi.
Excel'in kafası karışmış galiba.
Ben bir projede şu kütüphaneyi kullandım. Hiç bir sorun yaşamadım.
http://mikesknowledgebase.com/
alternatif link:
https://mikesknowledgebase.azurewebsites.net/pages/csharp/exporttoexcel.htm
Örnek kullanım da vereyim tam olsun:
public class klas1
{
public int herhangibirsayi;
// burada verdiğimiz değişken isimleri excel'de kolon ismi olarak çıkacak (istersek değiştirebiliriz o ayrı)
public double baskabirsayi;
}
public class klas2
{
public string birstring;
}
public class klas3
{
public DateTime birzaman;
}
// verilerimizi List<> yapısında tutuyoruz:
var list1 = new List<klas1>();
var list2 = new List<klas2>();
var list3 = new List<klas3>();
// bundan sonra listelerimize verilerimizi yazıyoruz..
list1.Add(new klas1() { herhangibirsayi=10, baskabirsayi=123.45 });
.
.
.
// en son excel belgesini oluşturuyoruz
try
{
System.Data.DataTable dt1 = ExportToExcel.CreateExcelFile.ListToDataTable(list1);
System.Data.DataTable dt2 = ExportToExcel.CreateExcelFile.ListToDataTable(list2);
System.Data.DataTable dt3 = ExportToExcel.CreateExcelFile.ListToDataTable(list3);
dt1.TableName = "tablo1"; // her bir tablo excelde sayfa (sheet) olarak çıkacak.
dt2.TableName = "tablo2";
dt3.TableName = "tablo3";
System.Data.DataSet ds = new System.Data.DataSet();
ds.Tables.Add(dt1);
ds.Tables.Add(dt2);
ds.Tables.Add(dt3);
ExportToExcel.CreateExcelFile.CreateExcelDocument(ds, excelfilename);
}
catch (System.Exception ex)
{
System.Windows.MessageBox.Show("Excel dosyası oluşturmada hata oluştu..\r\nException: " + ex.Message);
return;
}
@bocek hocam teşekkürler şimdi hallettim. Excel ile ilgili sorun kalmadı. Teşekkür ederim.
Başka bir sorunum var size danışayım. Uygulamamı tamamladım sayılır. Projeyi derleyip setup dosyası haline dönüştürüyorum. Kendi projeyi geliştirdiğim bilgisayarda sorun yok derlediği gibi çalışıyor. Fakat setup dosyasını başka bir bilgisayara atıp programı oraya kurduğumda programın bazı özellikleri çalışmıyor. Örneğin bir textboxa yazılması gereken veri yazılmıyor. Yada grafik çiziyorum grafik üzerindeki bazı işaretlemeleri yazmıyor. Buna benzer birkaç hata oluşuyor.
Grafikte devexpress toollarını kullanıyorum.
Textbox da sorun yaşamam beni çok şaşırttı. Form üzerinde birçok Textbox var sadece bir kısmı sorunlu çalışıyor.
Sorunlu bilgisayarda visual studio ve devexpress kurulu değil.
Neden olur böyle birşey fikir verebilecek olan var mı?
Program, kullandığı bazı kütüphane dosyalarını bulamıyor olabilir. Mesela devexpress'in bazı dll'leri yüklenmiyor olabilir.
VS Projesinde References'ta bulunan devexpress'e ait referansların üzerinde sağ tıklayıp Properties'lerine göz atın. Orada 'Copy Local' özelliği 'True' değilse derlemede kütüphane dosyasını exe'nin yanına kopyalamıyor demektir. Dolayısıyla setup bu dosyaları görmüyor ve kurulum içerisine dahil etmiyor olabilir.
Kesin sebep budur demiyorum ama bunu bir kontrol edin.
Sanırım burdan bahsediyorsunuz değilmi.
Devexpress tooları true idi ama sistem ile ilgili bazı dll parçacıkları false görünüyor. Bunları düzeltip tekrar deneyeceğim.
Eğer uygulaman EXE nin yanında bir veya daha fazla .net DLL gerektiriyorsa, tüm bu DLL dosyaları "ILMerge" ile EXE nin içine gömebilirsin. EXE boyutu biraz büyük olur ama sadece EXE yi taşıyarak programın heryerde çalışır.
Ya da şu olabilir.
Projenizde kullandığınız .NET Framework versiyonu hedef bilgisayarda yüklü değildir veya daha eski bir versiyon yüklüdür.
Project Properties'te Target Framework satırı vardır. Burada yazar .NET versiyonu. Aynı versiyon hedef blgisayarda da yüklü olmalıdır. Setup sırasında Microsoft'tan linkini verip yükletmelisiniz.
Örneğin 4.7.2 için:
https://support.microsoft.com/tr-tr/help/4054530/microsoft-net-framework-4-7-2-offline-installer-for-windows
Test yaptığım bilgisayarda Windows10 kuruluydu.. Windows 10 da bildiğim kadarıyla netframework standart olarak geliyor. Yani ekstra kurma gibi bir işlem yapılmıyordu. Emin değilim. Uygulama portable de olabilir aslında onu test etmem lazım.
@bocek dediğini kontrol edeceğim.
Aslında devexpress den yana da çok sorunum var. Bunu pc başına geçince anlatacağım.
.net framework uymsuzluğu olursa hiç açmaz. ondan değildir. muhtemelen kullandığınız kütüphanelerin(dll) kurulma sorunu. sizin bilgisayar kütüphaneler olduğu için sıkıntısız çalışıyor, yeni kurulan bilgisayarda kütüphaneler olmadığı için düzgün çalışmıyor. misal, textbox devexpress kütüphanesi tarafından sağlanıyorsa onu sağlayan dll kurulan bilgisayarda yoksa textbox'ta arıza çıkıyor. setup dosyasının içine o dll'leri de ekleyip kurulumda ilgili yerlere kurmanız lazım.
Alıntı yapılan: foseydon - 01 Mayıs 2020, 16:06:03.net framework uymsuzluğu olursa hiç açmaz. ondan değildir. muhtemelen kullandığınız kütüphanelerin(dll) kurulma sorunu. sizin bilgisayar kütüphaneler olduğu için sıkıntısız çalışıyor, yeni kurulan bilgisayarda kütüphaneler olmadığı için düzgün çalışmıyor. misal, textbox devexpress kütüphanesi tarafından sağlanıyorsa onu sağlayan dll kurulan bilgisayarda yoksa textbox'ta arıza çıkıyor. setup dosyasının içine o dll'leri de ekleyip kurulumda ilgili yerlere kurmanız lazım.
Uygulama ayarlarında Net FrameWork Ayarı mevcut. Muhtemelen projeyi ilk oluşturduğum zaman benim bilgiayarımda kurulu sürüme göre projeyi oluşturdu. Bende dikkat etmedim ama net framework sürümü bende 4.6.1 di.
Proje ayarlarında NetFramework sürümünü seçebiliyorum
(https://hizliresim.com/BkyeF1)
Buradaki sürümü daha eski bir sürüm seçersem ne olur?
Bildiğim kadarıyla Windows 10 ile birlikte Net Framework 4.5 standart olarak geliyor.
Kodumun niye yanlış çalıştığını anladım sanırım. Çok basitmiş. Net frameWork sürümü ile ilgili değil sanırım.
Program içerisinde çok ufak 16x16pixel resimler var. Bu resimleri grafik çizdiğimde Legend iconu olarak kullanıyorum.
Program içinde Resim URL'si vererek programda iconun gözükmesini sağlıyorum. Ama URL verirken resimlerin benim pc deki konumunu veriyordum.
Legend1_Item.MarkerImage.Image = new Bitmap(@"C:\Users\my_pc\Dropbox\PC Software\PC_Software2017\PC_Application\PC_Application\Resources\Legend1.png");
Kendi bilgisayarımda çalışıyor elbet ama baka bilgisayarda bu kodlar hata veriyor doğal olarak. Kod büyüyünce gözümden kaçmış.
Bu şekilde 5-6 tane resim var bu resimleri exe içine gömüp kod içinden çağırmam gerekiyor. Bunu nasıl yapabilirim?
Ben şöyle yapıyorum:
Visual Studio'da ProjeIsmi.resx isimli proeje dosyasına çift tıklıyorum projedeki resource'lar açılıyor. Eklemek istediğim resimleri buraya sürükle-bırak yapıyorum böylece projeye resource olarak eklenmiş oluyor. Burada resource ismini istersem değiştiriyorum.
Dikkat edin proje dosyası olarak değil resource olarak eklemiş oluyorum.
Bundan sonra da
Images.GetBitmap(ProjeIsmi.ResminAdi)
fonksiyonu ile istediğim yerde kullanıyorum.
Bende şöyle yaptım. Setup dosyası oluştururken ilgili resimleri de proje dosyasına ekledim. Dolayısıyla setup kurulurken Projenin kurulduğu yere benim resimleri atıyor otomatik olarak. Daha sonra program içinde programın kurulu olduğu dizini bulup, "Programın kurulduğu dizin\resim.jpg" şeklinde ilgili resmi çağırıyorum. Çalışıyor gibi ama uygun bir yöntem mi emin değilim.
Öyle de olur ama çok şık bir yöntem değil bence. Dediğimi yapın siz. Hem bu yöntemle ses, video vb. kaynakları da ekleyip rahatlıkla kullanabilirsiniz.
Teşekkürler. Aynen dediğiniz gibi yaptım. Hem bu proje için hemde ileriki uygulamalar için işime yarayacak güzel bir yöntem öğrenmiş oldum.
iki yonteminde avantaji dezavantaji var. setup dosyasina ekleyip hedef bilgisayara kaynaklari(resim) atarsaniz, yazdiginiz baska programlarda da ayni kaynagi kullabilirsiniz. misal, projeniz 3-4 ayri promramciktan olusuyor hepsine ayri ayri resim gommez boyuttan kar edersiniz. dezavantaji, resimler kullanici tarafindan erisilebilir oluyor. silinirse yine portler.