Aceminin C# sorulari

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

tunayk

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.

Mucit23

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?

tunayk

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.
           

Mucit23

Teşekkürler biraz uğraşayım.

Mucit23

Selamlar

Şöyle bir processing form oluşturmaya çalıştım



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?

tunayk

Ç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!

Mucit23

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.

berat23

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.

muhittin_kaplan

#263
...

foseydon

abi event-thread falan neden uğraşıyorsunuz ya. koy bir timer güncelle gitsin.

Mucit23

@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.

Mucit23

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

brandice5

[] operatörünü denedin mi?

veya sadece list kullanabilirsin;

List<double> myList = new List<double>();
myList.Add(1.1);
double i = myList[0];

Mucit23

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ı?

tunayk

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.