<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CETURK &#187; VSTO</title>
	<atom:link href="http://www.ceturk.com/etiket/vsto/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ceturk.com</link>
	<description>Türkiye&#039;nin Bilişim Platformu</description>
	<lastBuildDate>Wed, 25 Jan 2012 10:19:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>C# ile OCR(Optical Character Recognition) &#8211; VSTO</title>
		<link>http://www.ceturk.com/c-sharp-ile-ocroptical-character-recognition-vsto/</link>
		<comments>http://www.ceturk.com/c-sharp-ile-ocroptical-character-recognition-vsto/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 01:43:00 +0000</pubDate>
		<dc:creator>Olcay KÜK</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[C# ile OCR]]></category>
		<category><![CDATA[OCR]]></category>
		<category><![CDATA[Optical Character Recognition]]></category>
		<category><![CDATA[VSTO]]></category>
		<category><![CDATA[Yasin Sirke]]></category>
		<category><![CDATA[Yasin Sirkecili]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=3442</guid>
		<description><![CDATA[Herkese merhabalar; Bugünkü konumuz printer, daktilo, fotokopi vb. kağıt halindeki çıktılardan tutunda plaka tanıma sistemlerine kadar uzanan insan hayatını kolaylaştıran en sevdiğim yapay zeka uygulamalarından olan OCR(Optical Character Recognition) uygulamasının C# ile nasıl yapılacağına basitce bakacağız. Amacımız JPG dosyasındaki text verileri tanımlayıp *.txt dosyasına aktaracak bir OCR(Optical Character Recognition) uygulaması gerçekleştirmek. İlk olarak projemize COM [...]]]></description>
			<content:encoded><![CDATA[<p>Herkese merhabalar;</p>
<p>Bugünkü konumuz printer, daktilo, fotokopi vb. kağıt halindeki çıktılardan tutunda plaka tanıma sistemlerine kadar uzanan insan hayatını kolaylaştıran en sevdiğim yapay zeka uygulamalarından olan OCR(Optical Character Recognition) uygulamasının C# ile nasıl yapılacağına basitce bakacağız. Amacımız JPG dosyasındaki text verileri tanımlayıp *.txt dosyasına aktaracak bir OCR(Optical Character Recognition) uygulaması gerçekleştirmek.<br />
<span id="more-3442"></span><br />
İlk olarak projemize COM objesi olan Microsoft Office Document Imaging 12.0 Type Library referansını ekliyoruz. bu referans eklendiğinde MODI adında bir namespace&#8217;in kullanılabilir olduğunu göreceksiniz. Bu API Office 2003 ile birlikte geldiğinden Office 2003 veya üstü versiyonlarla kullanabilirsiniz. Ben projemi bir ASP.NET Web uygulaması olarak gerçekleştirdim siz isterseniz Windows Application kullanarak taranan veriyi richtextbox&#8217;a aktarabilirsiniz.</p>
<p>uygulamamızın xhtml görünümü şöyledir;</p>
<div>
<pre class="brush:csharp">
<form id="form1">
</form>
</pre>
</div>
<p>Sadece bir FileUpload ve button kontrolü kullandığımız projenin icrası şu yönde olacaktır; Resim seçildikten sonra eğer jpg formatındaysa resmin adı değiştirilip jpgs diye bir klasöre aktarılacak daha sonra burda OCR işlemi gerçekleştirilecek.</p>
<div>
<pre class="brush:csharp">if(FileUpload1.HasFile)
{
stringuzanti = System.IO.Path.GetExtension(FileUpload1.FileName.ToLower().Replace("", "i"));
if(uzanti == ".jpg")
{
stringdosyaadi = DateTime.Now.ToString().Replace(".", "").Replace(":", "").Replace("/", "").Replace("-", "").Replace(" ", "");
dosyaadi += uzanti;
FileUpload1.SaveAs(HttpContext.Current.Server.MapPath("~/jpgs/"+ dosyaadi));
System.IO.FileStreamfstream;
System.IO.StreamWriterswriter;
try
{
MODI.Documentmdoc = newMODI.Document();
mdoc.Create(HttpContext.Current.Server.MapPath("~/jpgs/"+ dosyaadi));
mdoc.OCR(MODI.MiLANGUAGES.miLANG_TURKISH, true, true);
MODI.Imagemimg = mdoc.Images[0] asMODI.Image;
fstream = newSystem.IO.FileStream(HttpContext.Current.Server.MapPath("~/yasin.txt"), System.IO.FileMode.OpenOrCreate);
swriter = newSystem.IO.StreamWriter(fstream);
swriter.Write(mimg.Layout.Text);
swriter.Close();
fstream.Close();
}
catch
{
ScriptManager.RegisterStartupScript(Page, typeof(string), Guid.NewGuid().ToString(), "alert('Hata olutu');", true);
}
}
else
{
ScriptManager.RegisterStartupScript(Page, typeof(string), Guid.NewGuid().ToString(), "alert('.jpg formatında bir dosya seçiniz.');", true);
}
}
else
{
ScriptManager.RegisterStartupScript(Page, typeof(string), Guid.NewGuid().ToString(), "alert('Dosya seçmediniz.');", true);
}</pre>
</div>
<p>Kodlarımızı açıklayacak olursak;</p>
<p>İlk olarak System.IO.Path sınıfı altındaki getextension fonksiyonundan faydalanarak aktarılan dosyanın .jpg uzantısına sahip olup olmadığını kontrol ediyoruz. Daha sonra bu dosyayı jpgs adında oluşturduğumuz klasöre aktarıyoruz.(Dosya adının çakışmasını engellemek için tarihe göre isim değiştiriyoruz) Sonrasında Jpg file içerisinde taranan karakterleri *.txt dosyasına aktarmamızı sağlayacak olan filestream ve streamwriter classlarından birer instance yaratıyoruz.</p>
<p>MODI.Documentmdoc = newMODI.Document();</p>
<p>ile mdoc adında MODI.Document classından OCR işleminde kullanacağımız yeni bir instance türettik.</p>
<p>mdoc nesnesinin Create fonksiyonunu kullanarak parametre olarak taranacak jpg dosyasının yolunu belirtiyoruz.</p>
<p>mdoc nesnesinin sahip olduğu en önemli fonksiyonumuz olan OCR fonksiyonuna gönderdiğimiz parametrelerle tarama işleminin sonuçlanmasını sağlıyoruz. Burdaki parametrelere ait açıklamalar şöyledir;</p>
<p>1 -) <strong>LangId </strong>: MODI.MiLANGUAGES enum değişkeninde tanımlanan karakter setlerinden size uygun olanı seçmenizi sağlar.<br />
2- ) <strong>OCROrientImage </strong>: Sayfanın yatay veya dikey olup olmadığının API tarafından algılanmasını sağlayan boolean tipli bir değerdir.<br />
3- ) <strong>OCRStraightenImage </strong>:  API tarafından image üzerindeki karakter tanımayı engelleyici eğimlerin otomatik olarak düzenmesine karar veren  boolean tipli değişkendir.</p>
<p>daha sonra MODI.Image tipinde oluşturduğumuz mimg nesnemize mdoc içerisindeki resimlerden istediğimizi aktarıyoruz.(Biz tek bir resim üzerinde işlem yaptığımızdan 0 index&#8217;ine sahip resmi aktardık)</p>
<p>bu işlemleri tamamladıktan sonra taranan ve karakter haline çevrilen verileri yasin.txt dosyasına yazarak filestream, streamwriter nesnelerinden türettiğimiz instance&#8217;ları Close(); methoduyla sonlandırarak jpg file içerisindeki karakterlerin yasin.txt dosyasına aktardığını gözlemleyebiliriz.</p>
<p>OCR işlemlerinin en basit hali bu şekilde uygulanabilir, dilerseniz siz daha detaylı OCR uygulamaları geliştirebilirsiniz.</p>
<p>Tüm yazılımcı arkadaşlara mutlu günler dilerim&#8230;</p>
<p>iyi çalışmalar,<br />
<strong>Yasin SİRKECİLİ</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/c-sharp-ile-ocroptical-character-recognition-vsto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.ceturk.com/images/200016.gif" length="10216" type="image/jpg" />	</item>
		<item>
		<title>Smart Client &amp; Click Once &amp; VSTO</title>
		<link>http://www.ceturk.com/smart-client-click-once-vsto/</link>
		<comments>http://www.ceturk.com/smart-client-click-once-vsto/#comments</comments>
		<pubDate>Thu, 18 Aug 2005 21:23:28 +0000</pubDate>
		<dc:creator>Levent Yildiz</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Click Once]]></category>
		<category><![CDATA[Levent YILDIZ]]></category>
		<category><![CDATA[Smart Client]]></category>
		<category><![CDATA[VSTO]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=352</guid>
		<description><![CDATA[Tüm yazılımcı arkadaşlara selamlar, Bu makalemde SmartClient ve bu mimari ile birlikte gelen ClickOnce teknolojisinden ayrıca VSTO ile nasıl uygulama geliştirebileceğimizden bahsedecegim. İlk bakışta bu üç konu size tamamen farklı gelebilir fakat makalenin ilerleyen satırlarında aslında bu üç konunun birbiriyle nasıl sıkı ilişki içinde olduğunu göreceksiniz.   Smart Client Smart Client mimarisine giriş yapmadan önce [...]]]></description>
			<content:encoded><![CDATA[<div><span style="font-size: x-small; font-family: MS Sans Serif;">Tüm yazılımcı arkadaşlara selamlar,</span></div>
<div><span style="font-size: x-small; font-family: MS Sans Serif;">Bu makalemde SmartClient ve bu mimari ile birlikte gelen ClickOnce teknolojisinden ayrıca VSTO ile nasıl uygulama geliştirebileceğimizden bahsedecegim.<br />
İlk bakışta bu üç konu size tamamen farklı gelebilir fakat makalenin ilerleyen satırlarında aslında bu üç konunun birbiriyle nasıl sıkı ilişki içinde olduğunu göreceksiniz.</span></div>
<p> </p>
<div><span style="font-size: x-small; font-family: MS Sans Serif;"><span style="text-decoration: underline;"><strong>Smart Client</strong></span><br />
Smart Client mimarisine giriş yapmadan önce Microsoft&#8217;un neden böyle bir mimari geliştirme ihtiyacı duyduğu konusuna değinelim.</span></div>
<p> </p>
<p> </p>
<p><span style="font-size: x-small; font-family: MS Sans Serif;"></span><span style="font-size: x-small; font-family: MS Sans Serif;">Bu sorunlara baktığımızda çoğu .NET framework ile çözülmüştür.Geriye kalan problemlerin ise .NET VS2005 ile çözülmesi planlanmaktadır.İsterseniz VS.NET 2005 B2 ile gelen bu çözümlere bir göz atalım. <strong><span style="text-decoration: underline;"><br />
</span></strong><br />
<span style="text-decoration: underline;"><strong>Click Once</strong></span><br />
Click Once Microsoft tarafından geliştirilen masaüstü uygulamalarını dağıtmayı, web uygulamalarını dağıtmak kadar kolaylaştıran yeni bir teknolojidir.<br />
Dağıtma işlemi sizinde bildiğiniz üzere herhangi bir kurulum dosyasını bir ftp veya web sunucusu sayesinde yayımlayarak gerçekleştirilebilir.<br />
Fakat Click Once teknolojisinin farkı uygulamaların sadece dağıtılmasında değil, güncellemelerin de aynı şekilde dağıtımasını sağlamasındadır.</p>
<p>VS2005 ile gelen bu teknolojiyi açıklamaya isterseniz bir örnek ile devam edelim.</p>
<p>C# ile basit bir hesaplama programı yazalım.</p>
<p>VS2005 ile yeni bir windows application projesi oluşturalım.</p>
<p> </p>
<p><img class="alignnone size-full wp-image-666" src="http://www.ceturk.com/images/sc11.jpg" alt="sc11" width="590" height="423" /></p>
<p> </p>
<p>Formda kullanıcıdan 2 değer alalım ve bunları gene kullanıcının seçtiği bir işleme göre hesaplayıp sonucu verelim.</p>
<p> </p>
<p><img class="alignnone size-full wp-image-667" src="http://www.ceturk.com/images/sc21.jpg" alt="sc21" width="375" height="303" /></p>
<p> &lt;code&gt;<span style="font-size: x-small; font-family: Courier New;">using System;<br />
using System.Collections.Generic;<br />
using System.ComponentModel;<br />
using System.Data;<br />
using System.Drawing;<br />
using System.Text;<br />
using System.Windows.Forms;namespace BasitHesaplama<br />
{<br />
public partial class Form1 : Form<br />
{<br />
public Form1()<br />
{<br />
InitializeComponent();<br />
}private void button1_Click(object sender, EventArgs e)<br />
{<br />
if (radioButton1.Checked)<br />
{<br />
toolStripProgressBar1.Maximum = 3;<br />
int Toplam = Convert.ToInt32(textBox1.Text);<br />
toolStripProgressBar1.Value += 1;<br />
Toplam += Convert.ToInt32(textBox2.Text);<br />
toolStripProgressBar1.Value += 1;<br />
textBox3.Text = Toplam.ToString();<br />
toolStripProgressBar1.Value += 1;<br />
toolStripProgressBar1.Value = 0;<br />
}<br />
} </span>&lt;/code&gt;</p>
<p>private void button2_Click(object sender, EventArgs e)<br />
{<br />
textBox1.Text = &#8220;&#8221;;<br />
textBox2.Text = &#8220;&#8221;;<br />
textBox3.Text = &#8220;&#8221;;<br />
}<br />
}<br />
}</p>
<p> </p>
<p> </p>
<p><span style="font-size: x-small; font-family: MS Sans Serif;">Projeyi derledikten sonra Solution Explorer çerçevesinde projemize sağ click yapalım.</span></span></p>
<table border="0" cellspacing="1">
<tbody>
<tr>
<td width="296"><span style="font-size: x-small; font-family: MS Sans Serif;"><img class="alignnone size-full wp-image-668" src="http://www.ceturk.com/images/sc3.jpg" alt="sc3" width="294" height="525" /></span></td>
</tr>
<tr>
<td><span style="font-size: x-small; font-family: MS Sans Serif;">VS2005 ile gelen ve click once&#8217;a ait bir<br />
özellik olan Publish i tıklayalım.<img class="alignnone size-full wp-image-669" src="http://www.ceturk.com/images/sc4.jpg" alt="sc4" width="497" height="396" />Publish wizard projemizi web sunucusunda hangi lokasyona dağıtmak istediğimizi<br />
soracaktır.Dağıtım lokasyonunu seçip next butonuna basarak işleme devam edelim. </p>
<p> </p>
<p></span></td>
</tr>
</tbody>
</table>
<div><span style="font-size: x-small; font-family: MS Sans Serif;">Bir sonraki aşamada Publish Wizard bizden dağıtım tipini seçmemizi isteyecektir.</span></div>
<div></div>
<div><span style="font-size: x-small; font-family: MS Sans Serif;"><span style="text-decoration: underline;"><img class="alignnone size-full wp-image-670" src="http://www.ceturk.com/images/sc5.jpg" alt="sc5" width="498" height="396" />- Yes, this application will be available online or offline</span><br />
Start menu&#8217;ye programın kısayolu eklenir.Ayrıca kullanıcı programı isterse Denetim Masası/Program ekle kaldır ile kaldırabilir.<br />
<span style="text-decoration: underline;">- No, this application is only available online.</span><br />
Herhangi bir kısayol eklenmez.Program sadece dağıtım noktasından çalıştırılır.</span></div>
<p> </p>
<p><span style="font-size: x-small; font-family: MS Sans Serif;"></span> </p>
<table border="0" cellspacing="1">
<tbody>
<tr>
<td><span style="font-size: x-small; font-family: MS Sans Serif;">Evet artık kurulum tamamlanmış ve programımız çalışmıştır.<br />
<img class="alignnone size-full wp-image-678" src="http://www.ceturk.com/images/sc13.jpg" alt="sc13" width="369" height="300" /></span></td>
</tr>
<tr>
<td><span style="font-size: x-small; font-family: MS Sans Serif;">Ayrıca kurulum Start Menude programlara da kendisini eklemiştir.<br />
<img class="alignnone size-full wp-image-677" src="http://www.ceturk.com/images/sc12.jpg" alt="sc12" width="541" height="274" /></span></td>
</tr>
</tbody>
</table>
<div><span style="font-size: x-small; font-family: MS Sans Serif;">Aslında ClickOnce teknolojisi bu noktadan sonra önem kazanmaktadır.<br />
Eğer biz projemizde herhangi bir değişiklik yaparsak, yeni sürüm nasıl dağıtılacak.<br />
Hesaplama projemize bir de çıkarma özelliğini ekleyelim.</span></div>
<div><span style="font-size: x-small; font-family: MS Sans Serif;"><img src="http://www.ceturk.com/resimler/csharp/ly/sc13.JPG" border="0" alt="" width="369" height="300" /></span></div>
<p> </p>
<p><span style="font-size: x-small; font-family: MS Sans Serif;">Proje kodumuzu aşağıdaki gibi güncelleyelim.</span></p>
<p> <span style="font-size: x-small; font-family: MS Sans Serif;">&lt;code&gt;using System;<br />
using System.Collections.Generic;<br />
using System.ComponentModel;<br />
using System.Data;<br />
using System.Drawing;<br />
using System.Text;<br />
using System.Windows.Forms;namespace BasitHesaplama<br />
{<br />
public partial class Form1 : Form<br />
{<br />
public Form1()<br />
{<br />
InitializeComponent();<br />
}private void button1_Click(object sender, EventArgs e)<br />
{<br />
if (radioButton1.Checked)<br />
{<br />
toolStripProgressBar1.Maximum = 3;<br />
int Toplam = Convert.ToInt32(textBox1.Text);<br />
toolStripProgressBar1.Value += 1;<br />
Toplam += Convert.ToInt32(textBox2.Text);<br />
toolStripProgressBar1.Value += 1;<br />
textBox3.Text = Toplam.ToString();<br />
toolStripProgressBar1.Value += 1;<br />
toolStripProgressBar1.Value = 0;<br />
}<br />
else<br />
{<br />
toolStripProgressBar1.Maximum = 3;<br />
int Toplam = Convert.ToInt32(textBox1.Text);<br />
toolStripProgressBar1.Value += 1;<br />
Toplam -= Convert.ToInt32(textBox2.Text);<br />
toolStripProgressBar1.Value += 1;<br />
textBox3.Text = Toplam.ToString();<br />
toolStripProgressBar1.Value += 1;<br />
toolStripProgressBar1.Value = 0;<br />
}<br />
}<br />
private void button2_Click(object sender, EventArgs e)<br />
{<br />
textBox1.Text = &#8220;&#8221;;<br />
textBox2.Text = &#8220;&#8221;;<br />
textBox3.Text = &#8220;&#8221;;<br />
}<br />
}<br />
}<br />
&lt;/code&gt;</span> </p>
<p><span style="font-size: x-small; font-family: MS Sans Serif;">Kodumuzu derledikten sonra projemiz dağıtıma hazır hale gelecektir.<br />
Daha önce yaptığımız gibi projemizi Publish Wizard yardımıyla dağıtalım.<br />
Peki kullanıcılar herseferinde ilgili web adresine gidip projeyi tekrar yüklemek zorundalar mı?</span></p>
<p> </p>
<div><span style="font-size: x-small; font-family: MS Sans Serif;">Click once teknolojisi sayesinde kullanıcılar Start Menu den programı çalıştırdıklarında program ilk önce ilgili web adresine gidip herhangi bir güncelleme mevcut mu diye kontrol edecektir.Eğer herhangi bir güncelleme mevcut ise otomatik olarak download edecek ve güncellemeyi gerçekleştirecektir.</span></div>
<p> </p>
<div><span style="font-size: x-small; font-family: MS Sans Serif;">Daha önce kurulumunu yapmış olduğumuz BasitHesaplama projemizi Start Menu/Programlar/BasitHesaplama menusunden çalıştıralım.</span></div>
<p> </p>
<p> </p>
<p><span style="font-size: x-small; font-family: MS Sans Serif;"></span></p>
<table border="0" cellspacing="1" width="100%">
<tbody>
<tr>
<td> </td>
<td width="100%" bgcolor="#dadada"><span style="font-size: x-small; font-family: MS Sans Serif;">Click Once dağıtımlarını ister CD ile ister bir network paylaşımı ile isterseniz de internet üzerinden yapabilirsiniz.</span></td>
</tr>
</tbody>
</table>
<div><span style="font-size: x-small; font-family: MS Sans Serif;"><br />
<span style="text-decoration: underline;"><strong>VSTO (Visual Studio Tools for Office)</strong></span><br />
Bildiğiniz gibi uzun süredir VBA yardımı ile Microsoft Office uygulamalarına dinamiklik kazandırıyoruz.Excel&#8217;in veya Word&#8217;ün sunmuş olduğu makrolar ve standart fonksiyonların yetersiz kaldığı yerlerde VBA kodları kullanarak bu açıkları kapatıyorduk.Fakat dağıtım problemlerinden ve VBA dilinin gelişmemiş olmasından dolayı Ms Office uygulamalarını büyük projelere dahil edemiyorduk.Bunun yanısıra tüm kullanıcılar bilgisayarla tanıştıklarından beri kullandıkları veya bilgisayarla tanışmalarına sebep olan Office uygulamalarını kullanmak için can atıyordu.</span></div>
<div><span style="font-size: x-small; font-family: MS Sans Serif;">Genellikle bu aşamada kullanıcılar ile programcılar karşı karlıya gelmekteydi.</span></div>
<p> </p>
<div><span style="font-size: x-small; font-family: MS Sans Serif;">İsterseniz biraz objektif davranıp kendimizi mesleğimizden soyutlayıp soruna kullanıcı gözünden bakalım.</span></div>
<p> </p>
<p> </p>
<p><span style="font-size: x-small; font-family: MS Sans Serif;"></span><span style="font-size: x-small; font-family: MS Sans Serif;">Projemizi derleyelim ve çalıştıralım.<br />
Bu işlemi yaptığımızda Ms Office Excel&#8217;in devreye girdiğini ve dökümanın açıldığını göreceksiniz.<br />
<img class="alignnone size-full wp-image-685" src="http://www.ceturk.com/images/sc22.jpg" alt="sc22" width="487" height="275" /></span></p>
<p>Kullanıcı olarak Ms Office uygulamalarına alışmış durumdayız.Office uygulamalarının bize sunduğu rahatlık mevcut.İstenen herhangi bir yere resim,logo vs yapıştırabiliyor, kendi formüllerimizi yaratabiliyor, hatta kendi küçük programlarımızı yazıp kullanabiliyoruz.Kısacası çok ama çok rahat bir şekilde kişiselleştirebiliyor, istediğimiz zaman programcıya bağımlı olmadan değişiklikler yapabiliyor ve bunu diğer kişiler ile Outlook&#8217;un send butonu uzaklığında paylaşabiliyoruz.</p>
<p>Bu rahatlığı kaybetmeyi kim ister ki.</p>
<p>Fakat programcı gözünden baktığımızda ise bu excel uygulamalarının tek bir kanaldan dağıtımı,güncellenmesi gibi sorunlarla karşılaşıyoruz.</p>
<p>VSTO bize bu iki tarafı uzlaştıracak bir yapı sunmaktadır.VS.NET 2003 ile başlayan ve son halini VS.NET 2005 ile alan VSTO ile .NET dillerini kullanarak Microsoft Office uygulamaları geliştirebiliyoruz.Yani artık .NET dilinin bize sağladığı bütün olanaklardan(Web servisleri, %100 OOP yapısı vs) bir Office uygulaması geliştirirken faydalanabileceğiz.Bu siz de taktir edersiniz ki programcılar ve kullanıcılar barış yolunda atılmış önemli bir adımdır.</p>
<p>VSTO 2005 için önerilen kurulum;<br />
- .NET Framework 2.0 B2<br />
- VS.NET 2005 B2<br />
- Visual Studio Tools for Office 2005 B2<br />
- Microsoft Office 2003 SP1 (&#8220;.NET programmability support&#8221; bileşeni seçilmeli)</p>
<p>Bu kurulumları gerçekleştirip VS.NET 2005 de yeni bir proje yaratmak istediğimizde artık karşımıza yeni seçenekler çıkacaktır.</p>
<p>Artık Visual C# projeleri arasında Office projelerini de görmekteyiz.</p>
<p>Yeni bir excel projesi için &#8220;Excel Workbook&#8221;&#8216;u seçebilirsiniz.<br />
Ardından proje sihirbazı bize yeni bir dökümanla başlamak veya mevcut bir döküman üzerinden çalışmak seçeneklerini suncacktır.<br />
<img class="alignnone size-full wp-image-681" src="http://www.ceturk.com/images/sc18.jpg" alt="sc18" width="522" height="438" /></p>
<p>Basit bir başlangıç yapmak için yeni bir döküman yaratma seçeneğini seçebilirsiniz.<br />
Proje sihirbazı işini bitirdiğinde VS.NET geliştirme ortamı açılır ve karşımıza sanki bir Ms Excel dökümanı üzerinde çalışıyormuşuz gibi standart sheet lerimiz çıkar.<br />
<img class="alignnone size-full wp-image-682" src="http://www.ceturk.com/images/sc19.jpg" alt="sc19" width="434" height="334" /><br />
Gördüğünüz gibi VS.NET IDE sinde Excel menüleri yerleşmiştir.</p>
<p>Artık projemizi geliştirmeye başlayabiliriz.<br />
MsSQL sunucusundan kur bilgilerini alarak kullanıcının anlık kur hesaplama işlemini gerçekleştirecek bir Office projesi geliştirelim.<br />
Tablomuz şekildeki gibi olsun.<br />
<img class="alignnone size-full wp-image-683" src="http://www.ceturk.com/images/sc20.jpg" alt="sc20" width="402" height="447" /><br />
ve tablomuza bugünün bilgilerini girelim.<br />
18/08/2005 USD 1.33<br />
18/08/2005 EUR 1.66</p>
<p>Şimdi projemize geri dönelim ve sheet1 üzerine veritabanından kur bilgilerini okumamızı sağlayacak bir button yerleştirelim.<br />
Kur bilgilerinin alınacağı iki adet hücremiz olsun ve bu hücrelerin isimleri RngUSDCurr ve RngEURCurr olsun.<br />
En son olarak kullanıcının hesap yapacağı hücreleri oluşturalım.<br />
<img class="alignnone size-full wp-image-684" src="http://www.ceturk.com/images/sc211.jpg" alt="sc211" width="519" height="372" /></p>
<p>Artık tek yapmamız gereken &#8220;Kur Bilgilerini Al&#8221; butonuna basıldığında Veritabanından mevcut güne ait kur bilgilerini okumak olacaktır.<br />
Dizayn zamanında butona çift tıkladığımızda karşımıza Sheet1.cs adı altında bir C# kod sayfası çıkacaktır.Sheet1 ile ilgili bütün C# kodunu bu dosyaya yazabiliriz.<br />
Kodumuzu buton&#8217;un click event&#8217;ine yazalım.  </p>
<p>&lt;code&gt;using System;<br />
using System.Data;<br />
using System.Drawing;<br />
using System.Windows.Forms;<br />
using Microsoft.VisualStudio.Tools.Applications.Runtime;<br />
using Excel = Microsoft.Office.Interop.Excel;<br />
using Office = Microsoft.Office.Core;<br />
using System.Data.SqlClient;namespace ExcelWorkbook10<br />
{<br />
public partial class Sheet1<br />
{<br />
private void Sheet1_Startup(object sender, System.EventArgs e)<br />
{<br />
System.Threading.Thread.CurrentThread.CurrentCulture = new<br />
System.Globalization.CultureInfo(1033);<br />
}<br />
private void Sheet1_Shutdown(object sender, System.EventArgs e)<br />
{<br />
}<br />
#region VSTO Designer generated code<br />
///<br />
/// Required method for Designer support &#8211; do not modify<br />
/// the contents of this method with the code editor.<br />
///<br />
private void InternalStartup()<br />
{<br />
this.btnCurr.Click += new System.EventHandler(this.btnCurr_Click);<br />
this.Shutdown += new System.EventHandler(this.Sheet1_Shutdown);<br />
this.Startup += new System.EventHandler(this.Sheet1_Startup);<br />
}<br />
#endregionprivate void btnCurr_Click(object sender, EventArgs e)<br />
{<br />
RngEURCurr.Value2 = &#8220;&#8221;;<br />
RngUSDCurr.Value2 = &#8220;&#8221;;<br />
//<br />
SqlConnection conSQL=new SqlConnection();<br />
SqlCommand cmdSQL = new SqlCommand();<br />
cmdSQL.CommandType = CommandType.Text;<br />
cmdSQL.Connection = conSQL;<br />
cmdSQL.CommandText = &#8220;SELECT * FROM dbo.EXC_TBL WHERE (DATEDIFF(d, GETDATE(), EXC_DATE) = 0)&#8221;;<br />
//<br />
try<br />
{<br />
conSQL.ConnectionString = &#8220;Server=MOBILEADMIN;Database=Test;Trusted_Connection=True&#8221;;<br />
conSQL.Open();<br />
}<br />
catch<br />
{<br />
MessageBox.Show(&#8220;DB erişiminde hata oluştu.&#8221;);<br />
return;<br />
}<br />
//<br />
SqlDataReader drdSQL;<br />
drdSQL = cmdSQL.ExecuteReader();<br />
while (drdSQL.Read())<br />
{<br />
if (drdSQL.GetString(1) == &#8220;USD&#8221;)<br />
{<br />
RngUSDCurr.Value2 = drdSQL.GetSqlMoney(2).ToDecimal();<br />
}<br />
else if (drdSQL.GetString(1)== &#8220;EUR&#8221;)<br />
{<br />
RngEURCurr.Value2 = drdSQL.GetSqlMoney(2).ToDecimal();<br />
}<br />
}<br />
drdSQL.Close();<br />
conSQL.Close();<br />
//<br />
MessageBox.Show(&#8220;Güncellenme tamamlandı&#8221;);<br />
}<br />
}<br />
} &lt;/code&gt;</p>
<p> </p>
<div><span style="font-size: x-small; font-family: MS Sans Serif;">Artık projemizi hazirladik ve kullanıcılara dağıtıma hazır duruma getirdik.Fakat ya biz sheet&#8217;de bir değişiklik olursa bunu kullanıcılara nasıl dağıtacağız?<br />
Nasıl ki BasitHesaplama projemizde Solution Explorer&#8217;dan Publish seçeneğini tıklayarak ClickOnce teknolojisini kullandıysak aynı olanağa VSTO uygulamalarında da sahibiz.Bu sayede VSTO projelerimizde yapacağımız herhangi bir değişiklik veya yenilemede dağıtım ClickOnce teknolojisi ile otomatik olarak yapılacaktır.</span></div>
<p> </p>
<div><span style="font-size: x-small; font-family: MS Sans Serif;">Daha öncede belirttiğim gibi Ms Office dökümanları bir şekilde uygulamaların bir parçası haline gelmelidir, VSTO ve ClickOnce birleşimi bize bu altyapıyı sunmakta ve bu sayede &#8220;Office SmartClient&#8221; uygulamaları geliştirmemize olanak sağlamaktadır.</span></div>
<p> </p>
<p> </p>
<p><span style="font-size: x-small; font-family: MS Sans Serif;"></span> </p>
<hr />
<p>Umarım Smart Client , Click Once ve VSTO arasındaki bağı yeterince açıklayabilmişimdir.</p>
<p><span style="font-size: x-small; font-family: MS Sans Serif;">Evet bir makalenin daha sonuna geldik.Umarım yararlı olmuştur.<br />
Hepinize mutlu günler dilerim.<br />
</span></p>
<table border="0" cellspacing="1" width="100%">
<tbody>
<tr>
<td> </td>
<td width="100%" bgcolor="#dadada"><span style="font-size: x-small; font-family: MS Sans Serif;"><strong>Kaynaklar</strong><br />
<a href="http://msdn.microsoft.com/smartclient/">http://msdn.microsoft.com/</a><br />
<a href="http://msdn.microsoft.com/smartclient/">http://msdn.microsoft.com/smartclient/</a><br />
<a href="http://msdn.microsoft.com/clickonce/">http://msdn.microsoft.com/clickonce/</a><br />
<a href="http://msnd.microsoft.com/vsto/">http://msnd.microsoft.com/vsto/</a> </span></td>
</tr>
</tbody>
</table>
<p><img class="alignnone size-full wp-image-679" src="http://www.ceturk.com/images/sc14.jpg" alt="sc14" width="477" height="207" /></p>
<p>Program çalışmadan önce ilgili dağıtım lokasyonunu kontrol ederek bir güncelleme olduğunu anlamış ve güncelleme işlemi için kullanıcıdan onay istemektedir.<br />
Kullanıcı onayından sonra gerekli güncellemeler yapılarak yeni sürüm yüklenir.</p>
<p><img class="alignnone size-full wp-image-680" src="http://www.ceturk.com/images/sc15.jpg" alt="sc15" width="504" height="258" /></p>
<p>Yes seçeneğini seçip Next butonuna basalım.</p>
<p> </p>
<p><img class="alignnone size-full wp-image-671" src="http://www.ceturk.com/images/sc6.jpg" alt="sc6" width="497" height="396" /></p>
<p> </p>
<p>Son olarak Publish Wizard bizden onay ister, Finish butonuna tıklayıp dağıtımı gerçekleştiriyoruz.</p>
<p> </p>
<p><img class="alignnone size-full wp-image-672" src="http://www.ceturk.com/images/sc7.jpg" alt="sc7" width="590" height="407" /></p>
<p> </p>
<p>Dağıtım tamamlandıktan sonra ilgili web sitesi otomatik olarak açılır.<br />
Bu link&#8217;ten kullanıcılar kurulumlarını gerçekleştirebilirler.<br />
İşte bu nokta kullanıcının ilk ve son defa install butonuna clicklediği noktadır. <strong>(Click Once)</strong></p>
<p> </p>
<p><img class="alignnone size-full wp-image-673" src="http://www.ceturk.com/images/sc8.jpg" alt="sc8" width="378" height="127" /></p>
<p> </p>
<p>Kullanıcı install butonuna tıkladıktan sonra kurulum başlar.</p>
<p> </p>
<p><img class="alignnone size-full wp-image-674" src="http://www.ceturk.com/images/sc9.jpg" alt="sc9" width="514" height="267" /></p>
<p><img class="alignnone size-full wp-image-675" src="http://www.ceturk.com/images/sc10.jpg" alt="sc10" width="504" height="257" /></p>
<p> </p>
<p> </p>
<p> </p>
<p><span style="text-decoration: underline;">Arayüz zenginliği ve uygulama dağıtım kolaylığı dengesi;<br />
</span>Yazilim geliştirme internetin yaygınlaşmasıyla ve teknolojilerin gelişmesiyle yavaş yavaş web tabanlı uygulamalara doğru yöneldi.Internet tabanlı uygulamaların kolay dağıtılabilir olmasının yanısıra masaüstü uygulamalara nazaran daha az gelişmiş bir arabirime sahip olması ve masaüstü yazılımların bunun tam tersi olarak dağıtılması zor ve arabiriminin kuvvetli olması bu yönde bir açığın doğmasına neden oldu.</p>
<p><span style="text-decoration: underline;">Masaüstü uygulamaları ve Web uygulamaları entegrasyonu;</span><br />
Bundan 10 sene öncesinde piyasada bulunan paket programlar hemen hemen her gün hata veriyordu, yönetilmesi zor sistemlerdi.Son 5-6 seneye baktığımızda ise bu problemlerin çözülmesinde büyük yol katedildi.Artık sorunsuz çalışan, yönetimi kolay sistemler mevcut.Fakat bu sistemleri ele aldığımızda yazılımlar tamamiyle şirketlerin kendi iş proseslerinin hızlanmasında ve hatasız çalışmasında rol oynuyor.</p>
<p>Buna bir örnek vermemiz gerekirse; bir üretim prosesini ele alalım.Fabrika üretim aşamasında entegre yazılımlar hammaddenin bittiğini algılar ve fabrikanın stok modülünden gerekli hammaddenin üretim sahasına çekilmesini talep eder.Eğer stokta hammadde varsa gerekli işlemler yapılır.Bu aşamaya kadar çalışan yazılımlar tamamiyle fabrika içindedir.</p>
<p>Eğer stokta gerekli hammadde kalmamışsa, bu aşamada yeni nesil yazılımlar devreye girmeli ve tedarikçi firmadan gerekli siparişi vermelidir.</p>
<p>Microsoft aslında bu açığı kapatmak için ilk girişimlerini .NET platformunu geliştirerek atmış, web servislerini devreye sokmuştur.Bu sayede masaüstü uygulamaları ile internet arasında bir bağlantı katmanı oluşturulmuş veri akışı sağlanmıştır.</p>
<p>Böylece yazılımlar, şirketlerin kendi departmanları arasındaki proseslerin idaresinde rol almalarının yanısıra, iş ilişkisi içinde bulunan şirketlerin aralarındaki proseslerde de görev almaya, bu prosesleri yönetmeye başlamışlardır.</p>
<p><span style="text-decoration: underline;">Bağlantılı ve Bağlantısız çalışabilme sıkıntısı;<br />
</span>Ürettiğimiz yazılımlar çoğunlukla şirket bünyesinde kullanılıyordu.Sunucularla client&#8217;lar arasında fiziksel hatlar mevcuttu.Yeni nesil yazılımlara ihtiyaç sonucunda .NET platformu geliştirildi fakat bu beraberinde yeni bir sorun getirdi.Bağlantı. Sahaya çıkan bir müsteri temsilcisi pda&#8217;sında yüklü olan yazılımları çalıştırabiliyor fakat bu sürekli bir bağlantı gerektiriyordu.</p>
<p><span style="text-decoration: underline;">Ofis uygulamaları,makrolar &#8211; Programcı ile Kullanıcı çatışması;</span><br />
Microsoft Office uygulamaları kullanım kolaylığı ve performansı ile kullanıcıların yoğun olarak kullandıkları, fakat büyük projelerde dağıtım sorunu ve makro dili yetersizliğinden dolayı programcılar tarafından tercih edilmeyen uygulamalardı.Şirketlerin yazılım geliştirme departmanları bu sorunlarla sürekli karşılaşmaktadır.<br />
Müşteriyi kullanıcı olarak düşünürsek, kullanıcı her zaman haklıdır.Ms Office dökümanları bir şekilde uygulamaların bir parçası haline gelmelidir.</p>
<p> </p>
<p><img class="alignnone size-full wp-image-665" src="http://www.ceturk.com/images/sc16.jpg" alt="sc16" width="450" height="314" /><br />
<span style="font-size: xx-small; font-family: MS Sans Serif;">Smart Client mimarisi </span></p>
<p> </p>
<div><span style="font-size: x-small; font-family: MS Sans Serif;">Smart Client bu sorunlara çözüm getiren, yani internet uygulamalarının dağıtım ve geniş erişim kolaylığını alan ve bunları desktop uygulamalarının yerel veri erişimi ve zengin kullanıcı arabirimi ile birleştiren, bağlantılı ve bağlantısız çalışma olanağı sağlayarak kullanıcıya daha efektif ve daha az maliyetle çalışma imkanı sunan, ve bütün bu özelliklerin mobil cihazlarda da çalışmasını öngören bu sayede kullanıcının mobilitesini sağlayan yeni bir uygulama geliştirme mimarisidir.</span></div>
<p> </p>
<div><span style="font-size: x-small; font-family: MS Sans Serif;">Aslında Smart Client bir devrim değil bir evrimdir.Kullanıcının en efektif şekilde çalışabilmesi için gerekli yazılımların geliştirilmesi için bize standartlar getirir.Eğer geliştirdiğiniz uygulama yukarıdaki problemlere çözüm getiriyorsa uygulamanız bir Smart Client uygulamasıdır.</span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/smart-client-click-once-vsto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.ceturk.com/images/sc16.jpg" length="38297" type="image/jpg" />	</item>
	</channel>
</rss>

