<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Delphi Can - Delphi ile Web Teknolojileri]]></title>
		<link>https://www.delphican.com/</link>
		<description><![CDATA[Delphi Can - https://www.delphican.com]]></description>
		<pubDate>Mon, 20 Apr 2026 19:23:55 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Delphi ile web programlama(Unigui, Tms Webcore vs vs..)]]></title>
			<link>https://www.delphican.com/showthread.php?tid=8111</link>
			<pubDate>Wed, 23 Apr 2025 21:10:51 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=8111</guid>
			<description><![CDATA[Delphi ile web programlama hakkında ne düşünüyorsunuz?<br />
Biraz nette araştırma, biraz küçük proje denemeleri ve birazda chatgpt sohbeti ile birkaç fikir edindim, ama özellikle gerçek tecrübesi olan kişiler ile tartışmayı çok isterim.<br />
<br />
UniGui denedim;<br />
klasik vcl ile neredeyse tamamen aynı,çok hızlı geliştirme imkanı ve neredeyse hiç ek öğrenme gerektirmeden hızlıca başlayabiliyoruz.<br />
ama herşeyden önce klasik web uygulamalarınan biraz farklı. büyük ölçekli uygulamalarda performans sürpriz. desktop görünümlü web uygulamaları için ideal.<br />
<br />
tms webcore;<br />
hem unigui yada vcl gibi sürükle bırak ile tasarım, hemde harici bir html template kullanma imkanı var. performans daha iyi gibi, dışarıdan bakıldığında tamamen web uyuglaması gibi görünüyor.(seo vs uyumlu) e ticaret gibi bir uygulama bile yapmak mümkün. ama unigui gibi fullstack değil. api içinde server yazmak lazım buda ek zaman maliyeti.<br />
<br />
delphi backend api server tarafında kesinlikle mükemmel çalışabilir, frontend tarafında react, vue gibi frameworkler ile mükememmel uyum içinde çalışabilir ama ciddi bir öğrenme eğrisi var. hele react gibi frameworkler başlıbaşına bir uzmanlık.<br />
<br />
minimum js bilgisi ile delphi + htmx kombinide tercih edilebilir, performans oldukça iddialı ama delphi tarafından html içerik döndürmemiz gerekiyor, buda radserver,tms xdata gibi ürünler ile pekde uyumlu değil.<br />
<br />
sizinde fikirlerinizi ve tecbübelerinizi duymak isterim. özellikle başka component framework vs tavsiyelerinizi.]]></description>
			<content:encoded><![CDATA[Delphi ile web programlama hakkında ne düşünüyorsunuz?<br />
Biraz nette araştırma, biraz küçük proje denemeleri ve birazda chatgpt sohbeti ile birkaç fikir edindim, ama özellikle gerçek tecrübesi olan kişiler ile tartışmayı çok isterim.<br />
<br />
UniGui denedim;<br />
klasik vcl ile neredeyse tamamen aynı,çok hızlı geliştirme imkanı ve neredeyse hiç ek öğrenme gerektirmeden hızlıca başlayabiliyoruz.<br />
ama herşeyden önce klasik web uygulamalarınan biraz farklı. büyük ölçekli uygulamalarda performans sürpriz. desktop görünümlü web uygulamaları için ideal.<br />
<br />
tms webcore;<br />
hem unigui yada vcl gibi sürükle bırak ile tasarım, hemde harici bir html template kullanma imkanı var. performans daha iyi gibi, dışarıdan bakıldığında tamamen web uyuglaması gibi görünüyor.(seo vs uyumlu) e ticaret gibi bir uygulama bile yapmak mümkün. ama unigui gibi fullstack değil. api içinde server yazmak lazım buda ek zaman maliyeti.<br />
<br />
delphi backend api server tarafında kesinlikle mükemmel çalışabilir, frontend tarafında react, vue gibi frameworkler ile mükememmel uyum içinde çalışabilir ama ciddi bir öğrenme eğrisi var. hele react gibi frameworkler başlıbaşına bir uzmanlık.<br />
<br />
minimum js bilgisi ile delphi + htmx kombinide tercih edilebilir, performans oldukça iddialı ama delphi tarafından html içerik döndürmemiz gerekiyor, buda radserver,tms xdata gibi ürünler ile pekde uyumlu değil.<br />
<br />
sizinde fikirlerinizi ve tecbübelerinizi duymak isterim. özellikle başka component framework vs tavsiyelerinizi.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[SAOP Servis Out of Memory Hatası]]></title>
			<link>https://www.delphican.com/showthread.php?tid=8084</link>
			<pubDate>Mon, 10 Mar 2025 15:01:37 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=8084</guid>
			<description><![CDATA[Merhaba,<br />
<br />
e-Fatura için hizmet aldığım firma SOAP servis üzerinden bilgileri sunuyor.<br />
<br />
Kayıtlı GİB kullanıcı listesini önceden SOAP servisten sorunsuz çekiyordum. Bana biz zip dosya içeriği geliyordu. Bende zipi kayıt edip içeriğini açarak gelen xml dosyayı içeriğini parse ederek kullanıyordum.<br />
<br />
Son zamanlarda mükellef firmaların artması ile bana sunulan liste çok fazla şişti ve artık çekmek istediğim zaman out of memory alıyorum.<br />
<br />
Dönüş olarak dosya adı vs diğer bilgilerle birlikte asıl bilgi olan zip dosyanın içeriği TByteSOAPArray tipinde geliyor. Fakat boyutu çok fazla olduğu için işlem devam ederken hata alıyorum.<br />
<br />
Bu konuda nasıl ilerlemeliyim? Böyle bir durumla karşılaşan oldu mu? Gelen bilgiyi bellek yerine dosyaya yazmak gibi bir mantık gördüm.<br />
Fakat nasıl olacağına anlam veremedim. <br />
<br />
Kodum aşağıdaki gibi 27. satırda işlem devam ederken hata alıyorum.<br />
<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">    getServiceValues(adrWSDL, adrURL, adrSvc, adrPrt, usr, pass);&#10;   web_servis := GetIPostBoxService(False, adrWSDL);&#10;&#10;   m_login           := Login.Create;&#10;   m_login_type2     := LoginType2.Create;&#10;   m_getUserListNew  := getUserListNew.Create;&#10;&#10;   m_login_type2.appStr   := ownerFatura.Database.FirmaBilgileri.eFtrAppStr;&#10;   m_login_type2.userName := ownerFatura.Database.FirmaBilgileri.eFtrUserName;&#10;   m_login_type2.passWord := ownerFatura.Database.FirmaBilgileri.eFtrPassWord;&#10;   m_login_type2.version  := ownerFatura.Database.FirmaBilgileri.eFtrVersion;&#10;&#10;   m_login.login := m_login_type2;&#10;   m_login_response := web_servis.Login(m_login);&#10;&#10;   //sessionID al&#10;   m_sessionID := m_login_response.sessionID;&#10;&#10;   m_getUserListNew.login := m_login.login;&#10;&#10;   //tip bilgisini PKList(Posta Kutusu) / GBList(Gönderici Bilgisi) için ayarla&#10;   if is_pk_list then&#10;     m_getUserListNew.listType  := UserListType.PKLIST&#10;   else&#10;     m_getUserListNew.listType  := UserListType.GBLIST;&#10;&#10;    m_userListNewResponse      := web_servis.getUserListNew(m_getUserListNew);&#10;    //gelen base64 bilgiyi binary dosyaya çevir&#10;    TGenel.Base64BinaryToFile(TArray&lt;Byte&gt;(m_userListNewResponse.getUserListNewResult.binaryData.Value),&#10;                              m_userListNewResponse.getUserListNewResult.fileName,&#10;                              ExtractFilePath(Application.ExeName));</pre>]]></description>
			<content:encoded><![CDATA[Merhaba,<br />
<br />
e-Fatura için hizmet aldığım firma SOAP servis üzerinden bilgileri sunuyor.<br />
<br />
Kayıtlı GİB kullanıcı listesini önceden SOAP servisten sorunsuz çekiyordum. Bana biz zip dosya içeriği geliyordu. Bende zipi kayıt edip içeriğini açarak gelen xml dosyayı içeriğini parse ederek kullanıyordum.<br />
<br />
Son zamanlarda mükellef firmaların artması ile bana sunulan liste çok fazla şişti ve artık çekmek istediğim zaman out of memory alıyorum.<br />
<br />
Dönüş olarak dosya adı vs diğer bilgilerle birlikte asıl bilgi olan zip dosyanın içeriği TByteSOAPArray tipinde geliyor. Fakat boyutu çok fazla olduğu için işlem devam ederken hata alıyorum.<br />
<br />
Bu konuda nasıl ilerlemeliyim? Böyle bir durumla karşılaşan oldu mu? Gelen bilgiyi bellek yerine dosyaya yazmak gibi bir mantık gördüm.<br />
Fakat nasıl olacağına anlam veremedim. <br />
<br />
Kodum aşağıdaki gibi 27. satırda işlem devam ederken hata alıyorum.<br />
<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">    getServiceValues(adrWSDL, adrURL, adrSvc, adrPrt, usr, pass);&#10;   web_servis := GetIPostBoxService(False, adrWSDL);&#10;&#10;   m_login           := Login.Create;&#10;   m_login_type2     := LoginType2.Create;&#10;   m_getUserListNew  := getUserListNew.Create;&#10;&#10;   m_login_type2.appStr   := ownerFatura.Database.FirmaBilgileri.eFtrAppStr;&#10;   m_login_type2.userName := ownerFatura.Database.FirmaBilgileri.eFtrUserName;&#10;   m_login_type2.passWord := ownerFatura.Database.FirmaBilgileri.eFtrPassWord;&#10;   m_login_type2.version  := ownerFatura.Database.FirmaBilgileri.eFtrVersion;&#10;&#10;   m_login.login := m_login_type2;&#10;   m_login_response := web_servis.Login(m_login);&#10;&#10;   //sessionID al&#10;   m_sessionID := m_login_response.sessionID;&#10;&#10;   m_getUserListNew.login := m_login.login;&#10;&#10;   //tip bilgisini PKList(Posta Kutusu) / GBList(Gönderici Bilgisi) için ayarla&#10;   if is_pk_list then&#10;     m_getUserListNew.listType  := UserListType.PKLIST&#10;   else&#10;     m_getUserListNew.listType  := UserListType.GBLIST;&#10;&#10;    m_userListNewResponse      := web_servis.getUserListNew(m_getUserListNew);&#10;    //gelen base64 bilgiyi binary dosyaya çevir&#10;    TGenel.Base64BinaryToFile(TArray&lt;Byte&gt;(m_userListNewResponse.getUserListNewResult.binaryData.Value),&#10;                              m_userListNewResponse.getUserListNewResult.fileName,&#10;                              ExtractFilePath(Application.ExeName));</pre>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Aktif Calısan Unigui Projeri]]></title>
			<link>https://www.delphican.com/showthread.php?tid=8067</link>
			<pubDate>Thu, 20 Feb 2025 22:24:45 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=8067</guid>
			<description><![CDATA[Merhaba programlamada yeniyim unigui ile kendimce birseyler yapmaya calısıyorum sitede aradım aktif calısan program bulamadım linklerin coğu calısmıyor ornek calısan linkler varsa paylasabilir misiniz ?<br />
<br />
Yanlıs yerden mi baslıyorum web ıcın diyede dusunmedim değil ...]]></description>
			<content:encoded><![CDATA[Merhaba programlamada yeniyim unigui ile kendimce birseyler yapmaya calısıyorum sitede aradım aktif calısan program bulamadım linklerin coğu calısmıyor ornek calısan linkler varsa paylasabilir misiniz ?<br />
<br />
Yanlıs yerden mi baslıyorum web ıcın diyede dusunmedim değil ...]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Unigui Dll+ Ssl]]></title>
			<link>https://www.delphican.com/showthread.php?tid=8018</link>
			<pubDate>Fri, 17 Jan 2025 13:42:32 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=8018</guid>
			<description><![CDATA[Merhabalar, unigui ile yaptığımız uygulamalarda ssl sertifikasını şimdiye kadar kullanmadım. Ama dünden beri hostingteki c panele ssl kurdum olmadı. Uygulamanın çalıştığı windows sunucuda ssl kurdum olmadı. <br />
Daha doğrusu windows sunucuda ssl ayarladım. Benim uygulama yerine basit bir index.html koyduğum zaman çalışıyor ssl sertifikası ama benim uygulamaya yön verdiğimde ise çalışmıyor. Kaynak kodunda sayfada uygulama linkini görebiliyorum ama sayfa uygulama için tepki vermiyor boş sayfa veriyor. <br />
Bu konuda uğraşan oldumu arkadaşlar?]]></description>
			<content:encoded><![CDATA[Merhabalar, unigui ile yaptığımız uygulamalarda ssl sertifikasını şimdiye kadar kullanmadım. Ama dünden beri hostingteki c panele ssl kurdum olmadı. Uygulamanın çalıştığı windows sunucuda ssl kurdum olmadı. <br />
Daha doğrusu windows sunucuda ssl ayarladım. Benim uygulama yerine basit bir index.html koyduğum zaman çalışıyor ssl sertifikası ama benim uygulamaya yön verdiğimde ise çalışmıyor. Kaynak kodunda sayfada uygulama linkini görebiliyorum ama sayfa uygulama için tepki vermiyor boş sayfa veriyor. <br />
Bu konuda uğraşan oldumu arkadaşlar?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[UniGui Mobil]]></title>
			<link>https://www.delphican.com/showthread.php?tid=7918</link>
			<pubDate>Thu, 31 Oct 2024 16:59:07 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=7918</guid>
			<description><![CDATA[UniGui Mobil ile basit bir uygulama yapıp server attım... <br />
uygulamaya girerken "Can't Find variable:UniGetValues şeklinde bir hata alıyorum"<br />
local bilgisayarımda sorun yok]]></description>
			<content:encoded><![CDATA[UniGui Mobil ile basit bir uygulama yapıp server attım... <br />
uygulamaya girerken "Can't Find variable:UniGetValues şeklinde bir hata alıyorum"<br />
local bilgisayarımda sorun yok]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[TMS Web Core AI]]></title>
			<link>https://www.delphican.com/showthread.php?tid=7909</link>
			<pubDate>Wed, 23 Oct 2024 08:57:05 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=7909</guid>
			<description><![CDATA[<!-- start: video_youtube_embed --><br />
<iframe width="560" height="315" src="//www.youtube.com/embed/WtsLnlps7Ys/" frameborder="0" allowfullscreen></iframe><br />
<!-- end: video_youtube_embed -->]]></description>
			<content:encoded><![CDATA[<!-- start: video_youtube_embed --><br />
<iframe width="560" height="315" src="//www.youtube.com/embed/WtsLnlps7Ys/" frameborder="0" allowfullscreen></iframe><br />
<!-- end: video_youtube_embed -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Unigui FastReport DialogPage]]></title>
			<link>https://www.delphican.com/showthread.php?tid=7902</link>
			<pubDate>Fri, 18 Oct 2024 11:58:02 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=7902</guid>
			<description><![CDATA[Merhabalar,<br />
<br />
VCL uygulamalarda tasarladığım ve kullandığım fastreport tasarımlarını, unigui web mobil uygulamada eğer dialog page yoksa direk  rahatlıkla kullanabiliyoruz. <br />
Ancak dialogpage varsa bunu web uygulamada doğrudan açamıyoruz tabi desteklemiyor unigui.<br />
<br />
Benim Aklıma gelen düşünce şu :<br />
bu fastreport tasarımları (*.fr3) xml içerikli tarasımlar olduğu için,<br />
bir unigui web uygulamada bu raporu tetiklerken, <br />
ilgili xmli açıp içerisindeki dialogpage nesnelerini unigui formda da runtime create edilebilir mi ona bakıyorum.<br />
Bu xml dosyada nesnelerin with left top height vb birçok özelliği mevcut.<br />
<br />
sizce bu fasterport dialogpage tasarımlarını bu şekilde uniguiye entegre etmek sağlıklı olur mu ?<br />
Yada farklı bir tavsiyeniz varmı ?<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.delphican.com/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=2802" target="_blank" title="">fast.png</a> (Dosya Boyutu: 23,23 KB / İndirme Sayısı: 35)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Merhabalar,<br />
<br />
VCL uygulamalarda tasarladığım ve kullandığım fastreport tasarımlarını, unigui web mobil uygulamada eğer dialog page yoksa direk  rahatlıkla kullanabiliyoruz. <br />
Ancak dialogpage varsa bunu web uygulamada doğrudan açamıyoruz tabi desteklemiyor unigui.<br />
<br />
Benim Aklıma gelen düşünce şu :<br />
bu fastreport tasarımları (*.fr3) xml içerikli tarasımlar olduğu için,<br />
bir unigui web uygulamada bu raporu tetiklerken, <br />
ilgili xmli açıp içerisindeki dialogpage nesnelerini unigui formda da runtime create edilebilir mi ona bakıyorum.<br />
Bu xml dosyada nesnelerin with left top height vb birçok özelliği mevcut.<br />
<br />
sizce bu fasterport dialogpage tasarımlarını bu şekilde uniguiye entegre etmek sağlıklı olur mu ?<br />
Yada farklı bir tavsiyeniz varmı ?<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.delphican.com/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=2802" target="_blank" title="">fast.png</a> (Dosya Boyutu: 23,23 KB / İndirme Sayısı: 35)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[TMS SSL (HTTPS)]]></title>
			<link>https://www.delphican.com/showthread.php?tid=7894</link>
			<pubDate>Fri, 11 Oct 2024 17:47:25 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=7894</guid>
			<description><![CDATA[merhabalar TMS web core ile yapmış olduğum uygulama http:// ile çalışıyor ancak https://(SSL) güvenli bağlantı ile çalışmıyor bana yardımcı olabilrseniz sevinirm]]></description>
			<content:encoded><![CDATA[merhabalar TMS web core ile yapmış olduğum uygulama http:// ile çalışıyor ancak https://(SSL) güvenli bağlantı ile çalışmıyor bana yardımcı olabilrseniz sevinirm]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[TMS WEB CORE TÜKÇE DİL SORUNU]]></title>
			<link>https://www.delphican.com/showthread.php?tid=7884</link>
			<pubDate>Mon, 30 Sep 2024 18:03:36 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=7884</guid>
			<description><![CDATA[arkdaşlar selamlar...<br />
TMS WEB CORE  ile bir uygulama yaptım... ancak türkçe kelimelerde bir sorunum var... bazen türçe karakterleri tanıyor bazende tanımıyor...  index.htlm kodum aşağıdaki gibidir<br />
<div class="codeblock">
<div class="title">Kod:<br />
</div><div class="body" dir="ltr"><code>&lt;!DOCTYPE html&gt;<br />
&lt;html&gt;<br />
  &lt;head&gt;<br />
    &lt;meta charset="UTF-8"/&gt;<br />
    &lt;meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /&gt;<br />
    &lt;meta http-equiv="Pragma" content="no-cache" /&gt;<br />
    &lt;meta http-equiv="Expires" content="0" /&gt;<br />
    &lt;meta name="viewport" content="width=device-width, initial-scale=1"&gt;<br />
    &lt;meta &#36;(ThemeColor)&gt;<br />
    &lt;noscript&gt;Tarayıcınız bu siteyi desteklemiyor&lt;/noscript&gt;<br />
<br />
    &lt;title&gt;CEDUEX&lt;/title&gt;<br />
      &lt;link href="Html_Admin/images/logo.png" rel="icon" type="image/x-icon"/&gt;<br />
<br />
     &lt;link href="Html_Admin/assets/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet"/&gt;<br />
     &lt;link href="Html_Admin/assets/vendor/bootstrap-icons/bootstrap-icons.css" rel="stylesheet"/&gt;<br />
     &lt;link href="Html_Admin/assets/vendor/boxicons/css/boxicons.min.css" rel="stylesheet"/&gt;<br />
     &lt;link href="Html_Admin/assets/vendor/quill/quill.snow.css" rel="stylesheet"/&gt;<br />
     &lt;link href="Html_Admin/assets/vendor/quill/quill.bubble.css" rel="stylesheet"/&gt;<br />
     &lt;link href="Html_Admin/assets/vendor/remixicon/remixicon.css" rel="stylesheet"/&gt;<br />
     &lt;link href="Html_Admin/assets/vendor/simple-datatables/style.css" rel="stylesheet"/&gt;<br />
     &lt;link href="Html_Admin/assets/css/style.css" rel="stylesheet"/&gt;<br />
     &lt;link href="Html_Admin/assets/css/GenelCss.css" rel="stylesheet"/&gt;<br />
<br />
<br />
     &lt;script src="Html_Admin/assets/vendor/apexcharts/apexcharts.min.js"&gt;&lt;/script&gt;<br />
     &lt;script src="Html_Admin/assets/vendor/bootstrap/js/bootstrap.bundle.min.js"&gt;&lt;/script&gt;<br />
     &lt;script src="Html_Admin/assets/vendor/quill/quill.min.js"&gt;&lt;/script&gt;<br />
     &lt;script src="Html_Admin/assets/vendor/simple-datatables/simple-datatables.js"&gt;&lt;/script&gt;<br />
     &lt;script src="Html_Admin/assets/vendor/tinymce/tinymce.min.js"&gt;&lt;/script&gt;<br />
     &lt;script src="Html_Admin/assets/vendor/php-email-form/validate.js"&gt;&lt;/script&gt;<br />
     &lt;script src="Html_Admin/assets/js/main.js"&gt;&lt;/script&gt;<br />
<br />
     &lt;script src="https://download.tmssoftware.com/tmsweb/slider/swiper.min.js" type="text/javascript"&gt;&lt;/script&gt;<br />
<br />
     &lt;link href="https://download.tmssoftware.com/tmsweb/slider/swiper.min.css" rel="stylesheet"/&gt;<br />
<br />
    &lt;script src="Html_Admin/assets/vendor/chart.js/chart.min.js"&gt;&lt;/script&gt;<br />
    &lt;script src="Html_Admin/assets/vendor/echarts/echarts.min.js"&gt;&lt;/script&gt;<br />
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js"&gt;&lt;/script&gt;<br />
<br />
<br />
    &lt;script src="https://www.gstatic.com/charts/loader.js" type="text/javascript"&gt;&lt;/script&gt;<br />
<br />
<br />
    &lt;script src="&#36;(ProjectName).js" type="text/javascript"&gt;&lt;/script&gt;<br />
    &lt;style&gt;<br />
    &lt;/style&gt;<br />
&lt;/head&gt;<br />
<br />
&lt;body&gt;<br />
    &lt;meta &#36;(BodyParameters)/&gt;<br />
&lt;/body&gt;<br />
<br />
&lt;script type="text/javascript"&gt;<br />
   rtl.run();<br />
&lt;/script&gt;<br />
<br />
&lt;/html&gt;</code></div></div>
]]></description>
			<content:encoded><![CDATA[arkdaşlar selamlar...<br />
TMS WEB CORE  ile bir uygulama yaptım... ancak türkçe kelimelerde bir sorunum var... bazen türçe karakterleri tanıyor bazende tanımıyor...  index.htlm kodum aşağıdaki gibidir<br />
<div class="codeblock">
<div class="title">Kod:<br />
</div><div class="body" dir="ltr"><code>&lt;!DOCTYPE html&gt;<br />
&lt;html&gt;<br />
  &lt;head&gt;<br />
    &lt;meta charset="UTF-8"/&gt;<br />
    &lt;meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /&gt;<br />
    &lt;meta http-equiv="Pragma" content="no-cache" /&gt;<br />
    &lt;meta http-equiv="Expires" content="0" /&gt;<br />
    &lt;meta name="viewport" content="width=device-width, initial-scale=1"&gt;<br />
    &lt;meta &#36;(ThemeColor)&gt;<br />
    &lt;noscript&gt;Tarayıcınız bu siteyi desteklemiyor&lt;/noscript&gt;<br />
<br />
    &lt;title&gt;CEDUEX&lt;/title&gt;<br />
      &lt;link href="Html_Admin/images/logo.png" rel="icon" type="image/x-icon"/&gt;<br />
<br />
     &lt;link href="Html_Admin/assets/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet"/&gt;<br />
     &lt;link href="Html_Admin/assets/vendor/bootstrap-icons/bootstrap-icons.css" rel="stylesheet"/&gt;<br />
     &lt;link href="Html_Admin/assets/vendor/boxicons/css/boxicons.min.css" rel="stylesheet"/&gt;<br />
     &lt;link href="Html_Admin/assets/vendor/quill/quill.snow.css" rel="stylesheet"/&gt;<br />
     &lt;link href="Html_Admin/assets/vendor/quill/quill.bubble.css" rel="stylesheet"/&gt;<br />
     &lt;link href="Html_Admin/assets/vendor/remixicon/remixicon.css" rel="stylesheet"/&gt;<br />
     &lt;link href="Html_Admin/assets/vendor/simple-datatables/style.css" rel="stylesheet"/&gt;<br />
     &lt;link href="Html_Admin/assets/css/style.css" rel="stylesheet"/&gt;<br />
     &lt;link href="Html_Admin/assets/css/GenelCss.css" rel="stylesheet"/&gt;<br />
<br />
<br />
     &lt;script src="Html_Admin/assets/vendor/apexcharts/apexcharts.min.js"&gt;&lt;/script&gt;<br />
     &lt;script src="Html_Admin/assets/vendor/bootstrap/js/bootstrap.bundle.min.js"&gt;&lt;/script&gt;<br />
     &lt;script src="Html_Admin/assets/vendor/quill/quill.min.js"&gt;&lt;/script&gt;<br />
     &lt;script src="Html_Admin/assets/vendor/simple-datatables/simple-datatables.js"&gt;&lt;/script&gt;<br />
     &lt;script src="Html_Admin/assets/vendor/tinymce/tinymce.min.js"&gt;&lt;/script&gt;<br />
     &lt;script src="Html_Admin/assets/vendor/php-email-form/validate.js"&gt;&lt;/script&gt;<br />
     &lt;script src="Html_Admin/assets/js/main.js"&gt;&lt;/script&gt;<br />
<br />
     &lt;script src="https://download.tmssoftware.com/tmsweb/slider/swiper.min.js" type="text/javascript"&gt;&lt;/script&gt;<br />
<br />
     &lt;link href="https://download.tmssoftware.com/tmsweb/slider/swiper.min.css" rel="stylesheet"/&gt;<br />
<br />
    &lt;script src="Html_Admin/assets/vendor/chart.js/chart.min.js"&gt;&lt;/script&gt;<br />
    &lt;script src="Html_Admin/assets/vendor/echarts/echarts.min.js"&gt;&lt;/script&gt;<br />
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js"&gt;&lt;/script&gt;<br />
<br />
<br />
    &lt;script src="https://www.gstatic.com/charts/loader.js" type="text/javascript"&gt;&lt;/script&gt;<br />
<br />
<br />
    &lt;script src="&#36;(ProjectName).js" type="text/javascript"&gt;&lt;/script&gt;<br />
    &lt;style&gt;<br />
    &lt;/style&gt;<br />
&lt;/head&gt;<br />
<br />
&lt;body&gt;<br />
    &lt;meta &#36;(BodyParameters)/&gt;<br />
&lt;/body&gt;<br />
<br />
&lt;script type="text/javascript"&gt;<br />
   rtl.run();<br />
&lt;/script&gt;<br />
<br />
&lt;/html&gt;</code></div></div>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Ftp Dosya Gönderme İşlemi Hakkında]]></title>
			<link>https://www.delphican.com/showthread.php?tid=7867</link>
			<pubDate>Sat, 07 Sep 2024 01:15:00 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=7867</guid>
			<description><![CDATA[<div class="codeblock">
<div class="title">Kod:<br />
</div><div class="body" dir="ltr"><code>procedure Tfmain.btnftpgonderClick(Sender: TObject);<br />
var oldfile,newfile:string;<br />
begin<br />
  try<br />
  FTP1.Disconnect;<br />
  oldfile:= qloginbackuptransfersurucu.Text+qloginbackuptransferdosyaadi.Text+'&#92;'+islemkodu+'.zip';<br />
  newfile:= islemkodu+'.zip';<br />
  FTP1.host := '**';   <br />
  FTP1.username := '**';<br />
  FTP1.password := '**';<br />
  FTP1.port := 21;<br />
  FTP1.Connect;<br />
  if FTP1.Connected  = true then<br />
    begin<br />
    memo.Lines.Add(DateTimeToStr(now)+' '+islemkodu+' Sunucuya Bağlandı...');<br />
    FTP1.Put(oldfile , newfile);<br />
    memo.Lines.Add(DateTimeToStr(now)+' '+islemkodu+' Sunucuya Dosya Aktarıldı...');<br />
    end;<br />
  except<br />
  on E : Exception do<br />
    begin<br />
    ShowMessage('Exception = '+E.Message);<br />
    end;<br />
  end;<br />
end;</code></div></div>
<br />
<br />
Merhabalar, yukardaki kodlarla resim veya text dosyasını sunucuya gönderebiliyorum ancak zipli 50-100 mb veya 2-3 gb dosyaları gönderiyor görünüyor. Ancak sunucudan download edip zipden çıkarırken hata veriyor. Birden fazla metot denedim hepsinde aynı hatayı aldım.]]></description>
			<content:encoded><![CDATA[<div class="codeblock">
<div class="title">Kod:<br />
</div><div class="body" dir="ltr"><code>procedure Tfmain.btnftpgonderClick(Sender: TObject);<br />
var oldfile,newfile:string;<br />
begin<br />
  try<br />
  FTP1.Disconnect;<br />
  oldfile:= qloginbackuptransfersurucu.Text+qloginbackuptransferdosyaadi.Text+'&#92;'+islemkodu+'.zip';<br />
  newfile:= islemkodu+'.zip';<br />
  FTP1.host := '**';   <br />
  FTP1.username := '**';<br />
  FTP1.password := '**';<br />
  FTP1.port := 21;<br />
  FTP1.Connect;<br />
  if FTP1.Connected  = true then<br />
    begin<br />
    memo.Lines.Add(DateTimeToStr(now)+' '+islemkodu+' Sunucuya Bağlandı...');<br />
    FTP1.Put(oldfile , newfile);<br />
    memo.Lines.Add(DateTimeToStr(now)+' '+islemkodu+' Sunucuya Dosya Aktarıldı...');<br />
    end;<br />
  except<br />
  on E : Exception do<br />
    begin<br />
    ShowMessage('Exception = '+E.Message);<br />
    end;<br />
  end;<br />
end;</code></div></div>
<br />
<br />
Merhabalar, yukardaki kodlarla resim veya text dosyasını sunucuya gönderebiliyorum ancak zipli 50-100 mb veya 2-3 gb dosyaları gönderiyor görünüyor. Ancak sunucudan download edip zipden çıkarırken hata veriyor. Birden fazla metot denedim hepsinde aynı hatayı aldım.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[8 Haziran Delphi İstanbul Meetup]]></title>
			<link>https://www.delphican.com/showthread.php?tid=7748</link>
			<pubDate>Sat, 01 Jun 2024 19:16:45 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=7748</guid>
			<description><![CDATA[8 Haziran Delphi İstanbul Meetup<br />
Description: <br />
Delphi kullanıcıları olarak uzun bir aradan sonra bir araya geliyoruz. Gönüllüler olarak yaklaşık 30 yıllık Delphi serüvenimize hem açık kaynak sayısını arttırmak, hem de Delphi camiasını desteklemek için bir tamamın açık kaynak olarak yayınlanacak ERP projesi geliştirmeye karar verdik. Delphi'ye gönül vermiş herkesi destek için bekliyoruz. MeetUp sırasında diğer Delphi diğer geliştiricileriyle tanışabilir ve network'ünüzü geliştirmek için bir fırsat yakalayabilirsiniz.<br />
Presenter(s): Prof. Dr. Beytullah Gültekin Çetiner, Ahmet Nuri Deniz<br />
Date: 08 June 2024<br />
Starts: 1:30 PM (UTC+3) <br />
Ends: 6:00 PM<br />
Location: Teknopark Istanbul<br />
Registration Link: <a href="https://forms.gle/w71cMCHqKtW7qsYC9" target="_blank">https://forms.gle/w71cMCHqKtW7qsYC9</a>]]></description>
			<content:encoded><![CDATA[8 Haziran Delphi İstanbul Meetup<br />
Description: <br />
Delphi kullanıcıları olarak uzun bir aradan sonra bir araya geliyoruz. Gönüllüler olarak yaklaşık 30 yıllık Delphi serüvenimize hem açık kaynak sayısını arttırmak, hem de Delphi camiasını desteklemek için bir tamamın açık kaynak olarak yayınlanacak ERP projesi geliştirmeye karar verdik. Delphi'ye gönül vermiş herkesi destek için bekliyoruz. MeetUp sırasında diğer Delphi diğer geliştiricileriyle tanışabilir ve network'ünüzü geliştirmek için bir fırsat yakalayabilirsiniz.<br />
Presenter(s): Prof. Dr. Beytullah Gültekin Çetiner, Ahmet Nuri Deniz<br />
Date: 08 June 2024<br />
Starts: 1:30 PM (UTC+3) <br />
Ends: 6:00 PM<br />
Location: Teknopark Istanbul<br />
Registration Link: <a href="https://forms.gle/w71cMCHqKtW7qsYC9" target="_blank">https://forms.gle/w71cMCHqKtW7qsYC9</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[TMS Web Core - WebHttpRequest ile istek dönmüyor]]></title>
			<link>https://www.delphican.com/showthread.php?tid=7715</link>
			<pubDate>Thu, 09 May 2024 12:37:58 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=7715</guid>
			<description><![CDATA[Merhaba,<br />
TMS Web Core'u testler başladım. <br />
WebHttpRequest ile aşağıdaki gibi istek gönderdiğimde OnResponse olayına herhangi bir sonuç dönmediğini gördüm. <br />
<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">&#10; WebHttpRequest3.URL := 'https://www.delphican.com';&#10; WebHttpRequest3.Execute;&#10;</pre>
<br />
Kendi sunucuma attığım siteklerde de sonuç dönmedi.<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">&#10; WebHttpRequest3.URL := 'http://91.151.95.210:8080/test';&#10; WebHttpRequest3.Execute;&#10;</pre>
<br />
Bileşen şu şekilde:<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">&#10;object WebHttpRequest3: TWebHttpRequest&#10; OnResponse = WebHttpRequest3Response&#10; Left = 624&#10; Top = 560&#10;end&#10;</pre>
<br />
OnResponse Olayı:<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">&#10;WebMemo2.Lines.Add('server response: ' + AResponse);&#10;</pre>
<br />
Aşağıdaki linke istek atınca sonuç dönüyor:<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">  WebHttpRequest3.URL := 'https://dummy.restapiexample.com/api/v1/employees';&#10;  WebHttpRequest3.Execute;</pre>
<br />
<br />
Sebebi ne olabilir?]]></description>
			<content:encoded><![CDATA[Merhaba,<br />
TMS Web Core'u testler başladım. <br />
WebHttpRequest ile aşağıdaki gibi istek gönderdiğimde OnResponse olayına herhangi bir sonuç dönmediğini gördüm. <br />
<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">&#10; WebHttpRequest3.URL := 'https://www.delphican.com';&#10; WebHttpRequest3.Execute;&#10;</pre>
<br />
Kendi sunucuma attığım siteklerde de sonuç dönmedi.<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">&#10; WebHttpRequest3.URL := 'http://91.151.95.210:8080/test';&#10; WebHttpRequest3.Execute;&#10;</pre>
<br />
Bileşen şu şekilde:<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">&#10;object WebHttpRequest3: TWebHttpRequest&#10; OnResponse = WebHttpRequest3Response&#10; Left = 624&#10; Top = 560&#10;end&#10;</pre>
<br />
OnResponse Olayı:<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">&#10;WebMemo2.Lines.Add('server response: ' + AResponse);&#10;</pre>
<br />
Aşağıdaki linke istek atınca sonuç dönüyor:<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">  WebHttpRequest3.URL := 'https://dummy.restapiexample.com/api/v1/employees';&#10;  WebHttpRequest3.Execute;</pre>
<br />
<br />
Sebebi ne olabilir?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Unigui Mobile Desktop]]></title>
			<link>https://www.delphican.com/showthread.php?tid=7665</link>
			<pubDate>Fri, 29 Mar 2024 09:09:10 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=7665</guid>
			<description><![CDATA[Merhabalar,<br />
<br />
 Uniguide Mobile bir projede align top / client / bottom ile yerleştiridiğim bileşenlerin,<br />
 projenin desktopta da açıldığında dağılmaması yada daha düzenli durması için <br />
 mükemmel olmasa da nasıl yerleştirmek gerekir, tasarım tavsiyeniz var mı ?<br />
<br />
<br />
 Teşekkürler,]]></description>
			<content:encoded><![CDATA[Merhabalar,<br />
<br />
 Uniguide Mobile bir projede align top / client / bottom ile yerleştiridiğim bileşenlerin,<br />
 projenin desktopta da açıldığında dağılmaması yada daha düzenli durması için <br />
 mükemmel olmasa da nasıl yerleştirmek gerekir, tasarım tavsiyeniz var mı ?<br />
<br />
<br />
 Teşekkürler,]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[WebBroker ve TMS Web Core ile REST WEB API Yaklaşımı 2]]></title>
			<link>https://www.delphican.com/showthread.php?tid=7625</link>
			<pubDate>Mon, 04 Mar 2024 16:14:39 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=7625</guid>
			<description><![CDATA[İlk makale de REST yaklaşımı ile temel manipülasyon tekniklerini örneklendirmiştik. Örneğimizi biraz daha geliştirerek profil resmi ekleme özelliği ekledim. Haliyle bu durum dosya upload gibi süreçlerin dahil edilmesini gerektirdi. Ayrıca manipülasyon işlemleri için yeni bir HTTP metoduna sahibiz; PATCH. Bununla beraber GET metodu ile kaynağımızın istediğimiz alanına erişebilme imkanına da sahip olacağız. <br />
<br />
<img src="https://i.imgur.com/Ik1r3en.png" border="0" alt="Ik1r3en.png" /><br />
<br />
Web Core ile yeni tasarım görünümü görseldeki gibi güncelledim.<br />
Profil resimlerinin depolanması için WebBroker sunucusunun çalıştığı dizini kullanacağız. Bu bağlamda, profil resmi yüklendiğinde, sunucu dizininde gerekli kontroller ardından kullanıcı id 'ne ait klasör oluşturulmakta ve profil resmi bu dizin altına yüklenmektedir. Elbette veri tabanında BLOB türünde alan oluşturmak bir diğer seçenek olabilir. Örneğimizde jpg ve png formatlarını kullansak da bunların haricinde pdf ve benzeri dosyalar ile de çalışabilirsiniz. WebBroker tarafında dosya adı üzerinden MIME tespiti yapılmaktadır. Bu durum web uygulamasına ek olarak farklı özellikler eklemek isterseniz size yardımcı olacaktır.<br />
Ufak bir açıklama yapmakta fayda olacaktır. Profil resmi için öncelikle kişi oluşturuyor ve sonrasında oluşturduğumuz kişi için profil resmi yüklüyoruz. Web Core tarafında tasarımı bu işleve uygun olarak hazırladım.<br />
<br />
CustomersController modülünü kontrol eden yeni kod bloğumuz aşağıdaki gibi güncellenmiştir.<br />
<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;&#10; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);&#10;var&#10; CustomersController: TCustomersController;&#10; ControllerResult: TControllerResult;&#10; ActionPath, id, field: String;&#10; PathSections: TArray&lt;String&gt;;&#10;begin&#10; if Request.MethodType in [mtGet, mtPost, mtPut, mtDelete, mtPatch] then&#10; begin&#10;&#10;   CustomersController := TCustomersController.Create;&#10;   try&#10;     ActionPath := TWebActionItem(Sender).PathInfo.Replace('*', '');&#10;     PathSections := Request.PathInfo.Replace(ActionPath, '').Replace('/', '', [rfIgnoreCase]).Split(['/']);&#10;     if Length(PathSections) &gt; 0 then&#10;       id := PathSections[0];&#10;     if Length(PathSections) &gt; 1 then&#10;       field := PathSections[1];&#10;&#10;     case Request.MethodType of&#10;       mtGet:&#10;         ControllerResult := CustomersController.Select(id, field);&#10;&#10;       mtPut:&#10;         ControllerResult := CustomersController.Update(id, Request.Content);&#10;&#10;       mtPost:&#10;         if Request.Files.Count = 0 then&#10;           ControllerResult := CustomersController.Insert(Request.Content)&#10;         else&#10;           ControllerResult := CustomersController.UpdateWithField(id, field, Request.Files[0].FileName, Request.Files[0].Stream);&#10;&#10;       mtDelete:&#10;         ControllerResult := CustomersController.Delete(id);&#10;&#10;       mtPatch:&#10;         ControllerResult := CustomersController.UpdateWithField(id, field, Request.Content);&#10;     end;&#10;&#10;     Response.StatusCode := ControllerResult.StatusCode;&#10;     Response.ContentType := ControllerResult.ResponseType;&#10;     Response.ContentStream := ControllerResult.Response;&#10;   finally&#10;     CustomersController.Free;&#10;   end;&#10;&#10; end&#10; else&#10;   Response.StatusCode := 405;&#10;end;</pre>
WebBroker ile dosya transfer işlemlerini gerçekleştirmek için uses bölümüne <span style="font-weight: bold;">Web.ReqMulti</span> birimini tanımlıyoruz. Bu sayede Request.Files özelliği ile sunucuya upload edilen dosyalara erişebiliyoruz.<span style="font-weight: bold;"> Request.Files.Count</span> ile kaç adet upload işlemi olduğunu, <span style="font-weight: bold;">Request.Files[0].FileName</span> ile upload edilen dosya adını ve yine <span style="font-weight: bold;">TMemoryStream(Request.Files[0].Stream)</span> gibi sarmalama ile upload edilen dosyayı kaydetme işlemlerini gerçekleştirebilmekteyiz.<br />
<br />
TMS Web Core tarafında ise <span style="font-weight: bold;">WebFilePicker </span>bileşeni kullanıyoruz. Birden fazla dosya upload işlemine de olanak sağlayan bu bileşen kolay bir kullanıma sahip. WebFilePicker bileşenini forma eklediğinizde ve uygulamayı çalıştırdığınızda kendi özel görünümünü kullanmaktadır. Örneğimizde ise onu gizleyerek Profile Resmi butonu ile tetiklemekteyiz. Dosya seçmemizin akabinde WebFilePicker bileşeninin <span style="font-weight: bold;">Change </span>olayı tetiklenecek ve bizde burada upload işlemini gerçekleştireceğiz. Bileşen, upload işleminde oluşabilecek hata gibi olayların yanı sıra transfer edilen bayt miktarı hakkında bilgi sağlayan ayrıntılı bir olay listesine sahip. <br />
<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">procedure TForm1.WebFilePicker1Change(Sender: TObject);&#10;begin&#10; if WebFilePicker1.Files.Count &gt; 0 then&#10; begin&#10;   WebFilePicker1.Files[0].Upload(FURI + '/' + GetId + '/picture');&#10; end;&#10;end;</pre>
<br />
WebBroker sunucusuna Postman üzerinden dosya göndererek süreci test edelim.<br />
<br />
<img src="https://i.imgur.com/UxP0iRm.png" border="0" alt="UxP0iRm.png" /><br />
<br />
<br />
Görüldüğü üzere upload işlemi gerçekleştirdik ve neticesinde sunucu tarafından 201 durum kodu ile kaynağın oluşturulduğuna dair yanıt aldık. <br />
<br />
Şimdi oluşturduğumuz kaynağa erişmeye çalışalım. Haliyle GET metodunu kullanıyoruz. <span style="font-weight: bold;">URI </span>alanına dikkat ederseniz userId den sonra <span style="font-weight: bold;">picture</span> ifadesini görecekseniz. Yazının başında belirtiğimiz gibi GET metodu ile artık kaynağın istediğimiz alanına direk olarak erişebiliyoruz ki bu aynı zamanda customers tablosunun field 'ını ifade eder.<br />
<br />
<br />
<img src="https://i.imgur.com/wL0wUCf.png" border="0" alt="wL0wUCf.png" /><br />
<br />
<br />
<br />
Son olarak ele alacağımız PATCH metodu. Hatırlarsanız ilk makale de kaynakta değişiklik yapmak istediğimizde PUT metodunu kullandığımızı ifade etmiştim. Bu metot ile tek seferde tüm alanlar bazında güncelleme işlemi gerçekleştirebilmekteyiz. Fakat bazen güncelleme tek bir alan bazında yapılmak istenebilir. Buradaki örnekden bağımsız, bir stok uygulaması için ürüne ait mevcut ürün adedini azaltmak/artırmak gibi işlemler söz konusu olabilir. REST yaklaşımında kaynak üzerindeki bu tarz kısmi güncellemeler için PATCH metodu kullanılmaktadır. <br />
<br />
<img src="https://i.imgur.com/dSQe4c4.png" border="0" alt="dSQe4c4.png" /><br />
<br />
<br />
WebBroker ve Web Core tarafındaki son güncellemeleri içeren kaynak kodlar makale ekinde mevcuttur. Faydalı olması dileğiyle.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.delphican.com/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=2584" target="_blank" title="">WebBrokerAndWebCore.zip</a> (Dosya Boyutu: 1,39 MB / İndirme Sayısı: 22)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[İlk makale de REST yaklaşımı ile temel manipülasyon tekniklerini örneklendirmiştik. Örneğimizi biraz daha geliştirerek profil resmi ekleme özelliği ekledim. Haliyle bu durum dosya upload gibi süreçlerin dahil edilmesini gerektirdi. Ayrıca manipülasyon işlemleri için yeni bir HTTP metoduna sahibiz; PATCH. Bununla beraber GET metodu ile kaynağımızın istediğimiz alanına erişebilme imkanına da sahip olacağız. <br />
<br />
<img src="https://i.imgur.com/Ik1r3en.png" border="0" alt="Ik1r3en.png" /><br />
<br />
Web Core ile yeni tasarım görünümü görseldeki gibi güncelledim.<br />
Profil resimlerinin depolanması için WebBroker sunucusunun çalıştığı dizini kullanacağız. Bu bağlamda, profil resmi yüklendiğinde, sunucu dizininde gerekli kontroller ardından kullanıcı id 'ne ait klasör oluşturulmakta ve profil resmi bu dizin altına yüklenmektedir. Elbette veri tabanında BLOB türünde alan oluşturmak bir diğer seçenek olabilir. Örneğimizde jpg ve png formatlarını kullansak da bunların haricinde pdf ve benzeri dosyalar ile de çalışabilirsiniz. WebBroker tarafında dosya adı üzerinden MIME tespiti yapılmaktadır. Bu durum web uygulamasına ek olarak farklı özellikler eklemek isterseniz size yardımcı olacaktır.<br />
Ufak bir açıklama yapmakta fayda olacaktır. Profil resmi için öncelikle kişi oluşturuyor ve sonrasında oluşturduğumuz kişi için profil resmi yüklüyoruz. Web Core tarafında tasarımı bu işleve uygun olarak hazırladım.<br />
<br />
CustomersController modülünü kontrol eden yeni kod bloğumuz aşağıdaki gibi güncellenmiştir.<br />
<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;&#10; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);&#10;var&#10; CustomersController: TCustomersController;&#10; ControllerResult: TControllerResult;&#10; ActionPath, id, field: String;&#10; PathSections: TArray&lt;String&gt;;&#10;begin&#10; if Request.MethodType in [mtGet, mtPost, mtPut, mtDelete, mtPatch] then&#10; begin&#10;&#10;   CustomersController := TCustomersController.Create;&#10;   try&#10;     ActionPath := TWebActionItem(Sender).PathInfo.Replace('*', '');&#10;     PathSections := Request.PathInfo.Replace(ActionPath, '').Replace('/', '', [rfIgnoreCase]).Split(['/']);&#10;     if Length(PathSections) &gt; 0 then&#10;       id := PathSections[0];&#10;     if Length(PathSections) &gt; 1 then&#10;       field := PathSections[1];&#10;&#10;     case Request.MethodType of&#10;       mtGet:&#10;         ControllerResult := CustomersController.Select(id, field);&#10;&#10;       mtPut:&#10;         ControllerResult := CustomersController.Update(id, Request.Content);&#10;&#10;       mtPost:&#10;         if Request.Files.Count = 0 then&#10;           ControllerResult := CustomersController.Insert(Request.Content)&#10;         else&#10;           ControllerResult := CustomersController.UpdateWithField(id, field, Request.Files[0].FileName, Request.Files[0].Stream);&#10;&#10;       mtDelete:&#10;         ControllerResult := CustomersController.Delete(id);&#10;&#10;       mtPatch:&#10;         ControllerResult := CustomersController.UpdateWithField(id, field, Request.Content);&#10;     end;&#10;&#10;     Response.StatusCode := ControllerResult.StatusCode;&#10;     Response.ContentType := ControllerResult.ResponseType;&#10;     Response.ContentStream := ControllerResult.Response;&#10;   finally&#10;     CustomersController.Free;&#10;   end;&#10;&#10; end&#10; else&#10;   Response.StatusCode := 405;&#10;end;</pre>
WebBroker ile dosya transfer işlemlerini gerçekleştirmek için uses bölümüne <span style="font-weight: bold;">Web.ReqMulti</span> birimini tanımlıyoruz. Bu sayede Request.Files özelliği ile sunucuya upload edilen dosyalara erişebiliyoruz.<span style="font-weight: bold;"> Request.Files.Count</span> ile kaç adet upload işlemi olduğunu, <span style="font-weight: bold;">Request.Files[0].FileName</span> ile upload edilen dosya adını ve yine <span style="font-weight: bold;">TMemoryStream(Request.Files[0].Stream)</span> gibi sarmalama ile upload edilen dosyayı kaydetme işlemlerini gerçekleştirebilmekteyiz.<br />
<br />
TMS Web Core tarafında ise <span style="font-weight: bold;">WebFilePicker </span>bileşeni kullanıyoruz. Birden fazla dosya upload işlemine de olanak sağlayan bu bileşen kolay bir kullanıma sahip. WebFilePicker bileşenini forma eklediğinizde ve uygulamayı çalıştırdığınızda kendi özel görünümünü kullanmaktadır. Örneğimizde ise onu gizleyerek Profile Resmi butonu ile tetiklemekteyiz. Dosya seçmemizin akabinde WebFilePicker bileşeninin <span style="font-weight: bold;">Change </span>olayı tetiklenecek ve bizde burada upload işlemini gerçekleştireceğiz. Bileşen, upload işleminde oluşabilecek hata gibi olayların yanı sıra transfer edilen bayt miktarı hakkında bilgi sağlayan ayrıntılı bir olay listesine sahip. <br />
<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">procedure TForm1.WebFilePicker1Change(Sender: TObject);&#10;begin&#10; if WebFilePicker1.Files.Count &gt; 0 then&#10; begin&#10;   WebFilePicker1.Files[0].Upload(FURI + '/' + GetId + '/picture');&#10; end;&#10;end;</pre>
<br />
WebBroker sunucusuna Postman üzerinden dosya göndererek süreci test edelim.<br />
<br />
<img src="https://i.imgur.com/UxP0iRm.png" border="0" alt="UxP0iRm.png" /><br />
<br />
<br />
Görüldüğü üzere upload işlemi gerçekleştirdik ve neticesinde sunucu tarafından 201 durum kodu ile kaynağın oluşturulduğuna dair yanıt aldık. <br />
<br />
Şimdi oluşturduğumuz kaynağa erişmeye çalışalım. Haliyle GET metodunu kullanıyoruz. <span style="font-weight: bold;">URI </span>alanına dikkat ederseniz userId den sonra <span style="font-weight: bold;">picture</span> ifadesini görecekseniz. Yazının başında belirtiğimiz gibi GET metodu ile artık kaynağın istediğimiz alanına direk olarak erişebiliyoruz ki bu aynı zamanda customers tablosunun field 'ını ifade eder.<br />
<br />
<br />
<img src="https://i.imgur.com/wL0wUCf.png" border="0" alt="wL0wUCf.png" /><br />
<br />
<br />
<br />
Son olarak ele alacağımız PATCH metodu. Hatırlarsanız ilk makale de kaynakta değişiklik yapmak istediğimizde PUT metodunu kullandığımızı ifade etmiştim. Bu metot ile tek seferde tüm alanlar bazında güncelleme işlemi gerçekleştirebilmekteyiz. Fakat bazen güncelleme tek bir alan bazında yapılmak istenebilir. Buradaki örnekden bağımsız, bir stok uygulaması için ürüne ait mevcut ürün adedini azaltmak/artırmak gibi işlemler söz konusu olabilir. REST yaklaşımında kaynak üzerindeki bu tarz kısmi güncellemeler için PATCH metodu kullanılmaktadır. <br />
<br />
<img src="https://i.imgur.com/dSQe4c4.png" border="0" alt="dSQe4c4.png" /><br />
<br />
<br />
WebBroker ve Web Core tarafındaki son güncellemeleri içeren kaynak kodlar makale ekinde mevcuttur. Faydalı olması dileğiyle.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.delphican.com/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=2584" target="_blank" title="">WebBrokerAndWebCore.zip</a> (Dosya Boyutu: 1,39 MB / İndirme Sayısı: 22)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[unigui formlarını ayrı dosya da tutmak]]></title>
			<link>https://www.delphican.com/showthread.php?tid=7596</link>
			<pubDate>Tue, 13 Feb 2024 15:50:10 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=7596</guid>
			<description><![CDATA[<span style="color: #333333;"><span style="font-size: x-small;"><span style="font-size: small;">Merhaba dostlar, unigui projesinde, formları ayrı dosyalarda tutmak mümkün mü? normal vcl masaüstü uygulamalarda formları dll olarak exe den ayırabiliyorduk, unigui projesinde benzer bir ayrım varmıdır.? yaklaşık 20 form var ve şimdiden exe 12 mb oldu, isterim ki formlar ayrı dosyalarda olsun... teşekkürler.</span></span></span>]]></description>
			<content:encoded><![CDATA[<span style="color: #333333;"><span style="font-size: x-small;"><span style="font-size: small;">Merhaba dostlar, unigui projesinde, formları ayrı dosyalarda tutmak mümkün mü? normal vcl masaüstü uygulamalarda formları dll olarak exe den ayırabiliyorduk, unigui projesinde benzer bir ayrım varmıdır.? yaklaşık 20 form var ve şimdiden exe 12 mb oldu, isterim ki formlar ayrı dosyalarda olsun... teşekkürler.</span></span></span>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[WebBroker ve TMS Web Core ile REST WEB API Yaklaşımı]]></title>
			<link>https://www.delphican.com/showthread.php?tid=7595</link>
			<pubDate>Tue, 13 Feb 2024 15:13:59 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=7595</guid>
			<description><![CDATA[REST, en basit anlamda bir web api geliştirme yaklaşımıdır. Temel prensip, bir uç kaynaktaki ve bu aynı zamanda URI olarak ifade edilmektedir; HTTP metotları ile veri manipülasyonu yapmak ve ardından yapılan manipülasyon neticesini HTTP status kodları ile geri döndürmektedir. Bu yaklaşımı uygulayan servisler ise <span style="font-weight: bold;">RESTfull </span>olarak adlandırılmaktadır.<br />
HTTP 'nin çoğu yerde stateless yani durumsuz bir protokol olduğunu okumuşsunuzdur. Bunun anlamı, protokol peşi sıra yapılan istekleri ilişkilendirmez ve her http isteği birbirinden bağımsız olarak değerlendirilir. REST mimarisinin temel prensiblerinden biri de budur. Kısacası istemci, sunucu için gerekli olan tüm bilgileri sağlayabilir. Sunucu taraf bunları istemci yerine kendi üzerinde tutmak durumunda olmamalıdır. Burada ilk akla gelebilecek Session kavramıdır. REST yaklaşımında ise bu durum, http headerlarında taşınan <span style="font-weight: bold;">TOKEN </span>anahtarları ile gerçekleştirilmektedir. Bu, <span style="font-weight: bold;">Authorization </span>ve <span style="font-weight: bold;">Authentication </span>gibi kavramları içerebilen bir yapıdır.<br />
Fakat şu an için biz, REST yaklaşımının temel manipülasyon yöntemlerini basit ve yalın bir şekilde irdelemeye çalışacağız.<br />
<br />
İstemci tarafında TMS firmasının geliştirdiği Web Core ürününü kullanacağım. Onunla işlevi, kişi ekleme, silme, güncelleme ve listeleme olan basit bir web uygulama arabirimi hazırladım. REST yaklaşımına temel olarak değinmek için yeterli.<br />
Sunucu tarafında ise Delphi 'nin web sunucu yazılımları geliştirmek için bir çatısı olan WebBroker'ı kullanacağım.<br />
WebBroker, Web API isteklerinin karşılanması ve TMS Web Core ile oluşturulan html, js gibi dosyaların sunulmasını sağlayacak. Böylece iki yapıyı yerelde birleştirmiş olacağız.<br />
Elbette TMS Web Core ürünü istemci tarafı hedefler. Dolaysıyla sunucu tarafında seçim yapmakta özgürsünüz. Ve yine TMS 'in XData gibi kendi REST sunucu çözümleride Web Core ile tam entegre çalışmaktadır. Diğer yandan NodeJS bile iyi seçim olabilir.<br />
Veri tabanı olarak ise SQLite kullanacağım. FireDAC 'ın statik kütüphane desteği ile ek olarak sqlite.dll kütüphanesine ihtiyacımız olmayacak. Uygulamamız customers tablosunu kullanıyor ve onu olabilecek en minimal yapıda oluşturdum. Şu an ki örneğimiz için bize yeterli olacaktır.<br />
<br />
<img src="https://i.imgur.com/n0Wa8tl.png" border="0" alt="n0Wa8tl.png" /><br />
<br />
<span style="font-size: medium;"><span style="font-weight: bold;"><span style="font-size: small;"><span style="font-size: medium;">Web formumuza işlevlere ait genel görünümler</span></span></span></span><br />
<br />
<span style="font-weight: bold;"><span style="font-size: small;"><span style="font-size: medium;">Kişi Ekleme</span></span></span><br />
<br />
<img src="https://i.imgur.com/tNbLdx8.gif" border="0" alt="tNbLdx8.gif" /><br />
<br />
<br />
<span style="font-size: medium;"><span style="font-weight: bold;">Kişi Bilgisi Güncelleme</span></span><br />
<br />
<img src="https://i.imgur.com/BhqQmua.gif" border="0" alt="BhqQmua.gif" /><br />
<br />
<br />
<span style="font-weight: bold;"><span style="font-size: medium;">Kişi Silme</span></span><br />
<br />
<img src="https://i.imgur.com/FdTiFdN.gif" border="0" alt="FdTiFdN.gif" /><br />
<br />
<br />
Hazırladığımız basit web arabiriminin arka planda hangi HTTP metodlarını hangi durumlarda icra ettiğini açıklamaya çalışacağım.<br />
Bunlar aynı zamanda bizim Back-End servislerimiz olarak ifade edilmektedir. TMS Web Core kaynak kodlarında bu servislerin uygulamasını göreceksiniz. Fakat yine de REST yaklaşımını temel olarak kavrayabilmek adına HTTP çağrımlarını irdelemek faydalı olacaktır. Back-End servis testlerini yaparken Postman uygulamasını kullandım. Eğer isterseniz Delphi 'nin Tools &gt; REST Debugger aracınıda kullanabilirsiniz.<br />
<br />
<span style="font-weight: bold;"><span style="color: #cc3333;"><span style="font-size: medium;">HTTP POST METODU</span></span></span><br />
<br />
Yeni bir kişi oluşturmak için POST metodunu kullanıyorum. Bunun anlamı veri tabanı tarafında bir INSERT işleminin söz konusu olduğudur. Görüleceği üzere "firstname", "lastname" ve "country" parametreleri bir JSON objesi olarak gönderilmekte. İstek neticesinde sunucu yanıtında bu parametrelere ek olarak "id" alanı değeride geri döndürülmektedir. "id" alanı kayıtımıza ait benzersiz kimlik numarasıdır. Sunucu tarafında bunu oluşturabilmek için GUID 'den yararlandım. Mongo ve benzeri NoSQL veri tabanları ile çalıştıysanız bu size tanıdık gelecektir.<br />
Burada bir parantez açmak istiyorum. Genel geçer olarak, Primary Key için Integer türünde ve veri tabanının otomatik atadığı ardışık sayılar dizisi kullanılmaktadır. Fakat biraz sonra göreceğimiz DELETE gibi isteklerde, bu ardışık sayı dizisinin kullanıcılar tarafından bir şekilde manüple edilebilmesi söz konusu olabilir. Bu nedenle GUID gibi kayıta ait kimlik bilgileri, en azından ardışık sayı dizilerine göre daha tutarlı ve güvenlidir.<br />
Diğer üzerinde durulması gereken konu ise Status kodudur. Dikkat ederseniz "201" olarak geri döndürmekteyiz. Bu status kodunun karşılığı "Created" olarak ifade edilir. Yani URI 'de bir kaynak başarılı olarak oluşturuldu demektir. Geleneksel WEB API yaklaşımında ise sunucu tarafından "200" kodu döndürülmektir. Fakat öncesinde belirtiğimiz gibi REST yaklaşımında, HTTP Metotları sunucu tarafında veri manüplasyonu anlamlandırmasını sağlarken, istemci tarafına nihai sonucu status kodu ile aktarmaktadır.<br />
<br />
<img src="https://i.imgur.com/eqrwf32.png" border="0" alt="eqrwf32.png" /><br />
<br />
<span style="font-weight: bold;"><span style="color: #cc3333;"><span style="font-size: medium;">HTTP GET METODU</span></span></span><br />
<br />
Listele butonu, kişiler listesini almaktadır. Bunun için <span style="font-weight: bold;">GET </span>metodu isteği oluşturacağız. Bu istek, veri tabanı tarafında SELECT ifadesi olarak karşılık bulur. GET isteği neticesinde kişiler listesi bir JSON Array olarak geri döndürülmektedir. JSON dizisinden aldığımız firstname ve lastname değerleri ile web uygulama formumuzdaki açılır liste kutusu içeriğini oluşturmaktayız.<br />
<br />
Status koduna tekrar dikkat edelim. <span style="font-weight: bold;">"200"</span> olarak geri döndürülmüştür. Eğer kişi listesi boş olsaydı, <span style="font-weight: bold;">"204"</span>, yani <span style="font-weight: bold;">"No Content"</span> olarak ifade edilen status kodu geri döndürülecektir.<br />
<br />
<img src="https://i.imgur.com/lqniMMy.png" border="0" alt="lqniMMy.png" /><br />
<br />
<br />
Bu sefer açılır liste kutusu ile sadece seçtiğimiz kişiye ait bilgileri getirmek istiyoruz. Tekrar bir GET isteği oluşturacağız.<br />
<br />
Ama dikkat ederseniz URI 'de <span style="font-weight: bold;">e912b902721f44699762d031cbef4b62</span> ifadesinin eklendiğini göreceksiniz. Bu ifade, kayıta ait benzersiz kimlik bilgisidir. REST yaklaşımında, URI ye eklenen bu değer ile sadece ilgili kayıta ait bilgileri getirilmesi sağlanır.<br />
<br />
<img src="https://i.imgur.com/XcbbYBl.png" border="0" alt="XcbbYBl.png" /><br />
<br />
<span style="color: #cc3333;"><span style="font-weight: bold;"><span style="font-size: medium;">HTTP PUT METODU</span></span></span><br />
<br />
Açılır liste kutusundan seçtiğimiz "Julinanne Moore" için kişi bilgilerinde değişiklik yapmak istiyoruz.<br />
Bunun için <span style="font-weight: bold;">PUT </span>metodunu kullanacağız. Bu metot veri tabanı tarafında UPDATE olarak karşılık bulur.<br />
Kişiye ait benzersiz kimlik bilgisini URI de eklenmiştir. Kişi bilgileri JSON objesi olarak istek gövdesinde sunucuya iletilmektedir.<br />
<br />
<img src="https://i.imgur.com/rWqKcQN.png" border="0" alt="rWqKcQN.png" /><br />
<br />
<br />
Bir önceki PUT isteğinde sunucuya "firstname", "lastname" ve "country" parametrelerinin tümünü göndermiştik. Fakat bazen sadece belli bir parametre için değişiklik yapmak isteyebiliriz. Buradan hareketle "Julianne Moore" kişisinin Country bilgisini değiştirmek için istek gövdesinde sadece country parametre değerini iletebiliriz. Görüleceği üzere Country bilgisi "Turkey" olarak güncellenmiştir.<br />
<br />
<img src="https://i.imgur.com/j1pJsUy.png" border="0" alt="j1pJsUy.png" /><br />
<br />
<br />
<span style="font-weight: bold;"><span style="color: #cc3333;"><span style="font-size: medium;">HTTP DELETE METODU</span></span></span><br />
<br />
Son olarak "Julianne Moore" kişisini silmek istediğimizi varsayalım. Bunun için <span style="font-weight: bold;">DELETE </span>isteği oluşturacağız ve kimlik bilgisini URI ye ekleyeceğiz. Bu işlem veri tabanı tarafında DELETE olarak karşılık bulmaktadır.<br />
İşlemin başarılı neticelenmesi ile status kodu <span style="font-weight: bold;">"204"</span> olarak geri döndürülmüştür. Yani kaynak artık silinmiştir ve yoktur.<br />
<br />
<img src="https://i.imgur.com/oO6xVAM.png" border="0" alt="oO6xVAM.png" /><br />
<br />
<br />
<span style="font-weight: bold;">WebBroker üzerine;</span><br />
<br />
<img src="https://i.imgur.com/u9XKWSP.png" border="0" alt="u9XKWSP.png" /><br />
<br />
Sunucu tarafında 8080 numaraları port kullanılmıştır. Bunu istediğiniz gibi değiştirebilirsiniz.<br />
<br />
WebBroker Action Editor ile açılan form da iki Path tanımı göreceksiniz. Bunlardan biri Default olarak işaretlenir.<br />
PathInfo sütununda <span style="font-weight: bold;">/api/customers*</span> ifadesine dikkat edin. Fakat PathInfo ifadesinin son tarafındaki <span style="font-weight: bold;">"*"</span> önemlidir.<br />
Bunun anlamı /api/customers ile başlayan tüm isteklerin bu modül birimi tarafından değerlendirileceği anlamına gelir.<br />
Yani <span style="font-weight: bold;">http://localhost:8080/api/customers</span> ve <span style="font-weight: bold;">http://localhost:8080/api/customers/e912b902721f44699762d031cbef4b62</span> isteklerini aynı birim modülüne yönlendiriyoruz.<br />
<br />
<img src="https://i.imgur.com/6y2DeSA.png" border="0" alt="6y2DeSA.png" /><br />
<br />
WebBrokerServer uygulaması çalışma görüntüsü görseldeki gibi olacaktır. Görüleceği üzere Server Console uygulaması olarak oluşturulmuştur. Daha gelişkin uygulamalarda ISAPI tercih edebilirsiniz.<br />
<br />
<img src="https://i.imgur.com/uEcf5QN.png" border="0" alt="uEcf5QN.png" /><br />
<br />
Son olarak Delphi WebBroker çatısı Windows ve Linux platformlarında çalışabilmektedir. TMS Web Core istemci tarafı olmasından hareketle isterseniz Linux sunucularında uygulamanızı dağıtma şansına sahip olursunuz.<br />
<br />
<span style="font-weight: bold;">TMS Web Core üzerine;</span><br />
<br />
<img src="https://i.imgur.com/tidjYMW.png" border="0" alt="tidjYMW.png" /><br />
<br />
Eğer mevcut tasarımda değişiklik yaparsanız öncelikle uygulamayı Compile edin. Ardından Open Output Path in Explorer ile Web Core ile oluşturduğumuz nihai uygulama dosyalarını WebBroker server uygulaması dizinine kopyalayın. Mevcut projemizde Server uygulama dizinimizin içeriği görseldeki gibidir.<br />
<br />
<img src="https://i.imgur.com/XviapXO.png" border="0" alt="XviapXO.png" /><br />
<br />
<br />
Her iki projeye ait tüm kaynak kod ve database dosyası makale ekinde mevcuttur. Faydalı olması dileğiyle.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.delphican.com/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=2571" target="_blank" title="">WebBrokerAndWebCore.zip</a> (Dosya Boyutu: 1,93 MB / İndirme Sayısı: 50)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[REST, en basit anlamda bir web api geliştirme yaklaşımıdır. Temel prensip, bir uç kaynaktaki ve bu aynı zamanda URI olarak ifade edilmektedir; HTTP metotları ile veri manipülasyonu yapmak ve ardından yapılan manipülasyon neticesini HTTP status kodları ile geri döndürmektedir. Bu yaklaşımı uygulayan servisler ise <span style="font-weight: bold;">RESTfull </span>olarak adlandırılmaktadır.<br />
HTTP 'nin çoğu yerde stateless yani durumsuz bir protokol olduğunu okumuşsunuzdur. Bunun anlamı, protokol peşi sıra yapılan istekleri ilişkilendirmez ve her http isteği birbirinden bağımsız olarak değerlendirilir. REST mimarisinin temel prensiblerinden biri de budur. Kısacası istemci, sunucu için gerekli olan tüm bilgileri sağlayabilir. Sunucu taraf bunları istemci yerine kendi üzerinde tutmak durumunda olmamalıdır. Burada ilk akla gelebilecek Session kavramıdır. REST yaklaşımında ise bu durum, http headerlarında taşınan <span style="font-weight: bold;">TOKEN </span>anahtarları ile gerçekleştirilmektedir. Bu, <span style="font-weight: bold;">Authorization </span>ve <span style="font-weight: bold;">Authentication </span>gibi kavramları içerebilen bir yapıdır.<br />
Fakat şu an için biz, REST yaklaşımının temel manipülasyon yöntemlerini basit ve yalın bir şekilde irdelemeye çalışacağız.<br />
<br />
İstemci tarafında TMS firmasının geliştirdiği Web Core ürününü kullanacağım. Onunla işlevi, kişi ekleme, silme, güncelleme ve listeleme olan basit bir web uygulama arabirimi hazırladım. REST yaklaşımına temel olarak değinmek için yeterli.<br />
Sunucu tarafında ise Delphi 'nin web sunucu yazılımları geliştirmek için bir çatısı olan WebBroker'ı kullanacağım.<br />
WebBroker, Web API isteklerinin karşılanması ve TMS Web Core ile oluşturulan html, js gibi dosyaların sunulmasını sağlayacak. Böylece iki yapıyı yerelde birleştirmiş olacağız.<br />
Elbette TMS Web Core ürünü istemci tarafı hedefler. Dolaysıyla sunucu tarafında seçim yapmakta özgürsünüz. Ve yine TMS 'in XData gibi kendi REST sunucu çözümleride Web Core ile tam entegre çalışmaktadır. Diğer yandan NodeJS bile iyi seçim olabilir.<br />
Veri tabanı olarak ise SQLite kullanacağım. FireDAC 'ın statik kütüphane desteği ile ek olarak sqlite.dll kütüphanesine ihtiyacımız olmayacak. Uygulamamız customers tablosunu kullanıyor ve onu olabilecek en minimal yapıda oluşturdum. Şu an ki örneğimiz için bize yeterli olacaktır.<br />
<br />
<img src="https://i.imgur.com/n0Wa8tl.png" border="0" alt="n0Wa8tl.png" /><br />
<br />
<span style="font-size: medium;"><span style="font-weight: bold;"><span style="font-size: small;"><span style="font-size: medium;">Web formumuza işlevlere ait genel görünümler</span></span></span></span><br />
<br />
<span style="font-weight: bold;"><span style="font-size: small;"><span style="font-size: medium;">Kişi Ekleme</span></span></span><br />
<br />
<img src="https://i.imgur.com/tNbLdx8.gif" border="0" alt="tNbLdx8.gif" /><br />
<br />
<br />
<span style="font-size: medium;"><span style="font-weight: bold;">Kişi Bilgisi Güncelleme</span></span><br />
<br />
<img src="https://i.imgur.com/BhqQmua.gif" border="0" alt="BhqQmua.gif" /><br />
<br />
<br />
<span style="font-weight: bold;"><span style="font-size: medium;">Kişi Silme</span></span><br />
<br />
<img src="https://i.imgur.com/FdTiFdN.gif" border="0" alt="FdTiFdN.gif" /><br />
<br />
<br />
Hazırladığımız basit web arabiriminin arka planda hangi HTTP metodlarını hangi durumlarda icra ettiğini açıklamaya çalışacağım.<br />
Bunlar aynı zamanda bizim Back-End servislerimiz olarak ifade edilmektedir. TMS Web Core kaynak kodlarında bu servislerin uygulamasını göreceksiniz. Fakat yine de REST yaklaşımını temel olarak kavrayabilmek adına HTTP çağrımlarını irdelemek faydalı olacaktır. Back-End servis testlerini yaparken Postman uygulamasını kullandım. Eğer isterseniz Delphi 'nin Tools &gt; REST Debugger aracınıda kullanabilirsiniz.<br />
<br />
<span style="font-weight: bold;"><span style="color: #cc3333;"><span style="font-size: medium;">HTTP POST METODU</span></span></span><br />
<br />
Yeni bir kişi oluşturmak için POST metodunu kullanıyorum. Bunun anlamı veri tabanı tarafında bir INSERT işleminin söz konusu olduğudur. Görüleceği üzere "firstname", "lastname" ve "country" parametreleri bir JSON objesi olarak gönderilmekte. İstek neticesinde sunucu yanıtında bu parametrelere ek olarak "id" alanı değeride geri döndürülmektedir. "id" alanı kayıtımıza ait benzersiz kimlik numarasıdır. Sunucu tarafında bunu oluşturabilmek için GUID 'den yararlandım. Mongo ve benzeri NoSQL veri tabanları ile çalıştıysanız bu size tanıdık gelecektir.<br />
Burada bir parantez açmak istiyorum. Genel geçer olarak, Primary Key için Integer türünde ve veri tabanının otomatik atadığı ardışık sayılar dizisi kullanılmaktadır. Fakat biraz sonra göreceğimiz DELETE gibi isteklerde, bu ardışık sayı dizisinin kullanıcılar tarafından bir şekilde manüple edilebilmesi söz konusu olabilir. Bu nedenle GUID gibi kayıta ait kimlik bilgileri, en azından ardışık sayı dizilerine göre daha tutarlı ve güvenlidir.<br />
Diğer üzerinde durulması gereken konu ise Status kodudur. Dikkat ederseniz "201" olarak geri döndürmekteyiz. Bu status kodunun karşılığı "Created" olarak ifade edilir. Yani URI 'de bir kaynak başarılı olarak oluşturuldu demektir. Geleneksel WEB API yaklaşımında ise sunucu tarafından "200" kodu döndürülmektir. Fakat öncesinde belirtiğimiz gibi REST yaklaşımında, HTTP Metotları sunucu tarafında veri manüplasyonu anlamlandırmasını sağlarken, istemci tarafına nihai sonucu status kodu ile aktarmaktadır.<br />
<br />
<img src="https://i.imgur.com/eqrwf32.png" border="0" alt="eqrwf32.png" /><br />
<br />
<span style="font-weight: bold;"><span style="color: #cc3333;"><span style="font-size: medium;">HTTP GET METODU</span></span></span><br />
<br />
Listele butonu, kişiler listesini almaktadır. Bunun için <span style="font-weight: bold;">GET </span>metodu isteği oluşturacağız. Bu istek, veri tabanı tarafında SELECT ifadesi olarak karşılık bulur. GET isteği neticesinde kişiler listesi bir JSON Array olarak geri döndürülmektedir. JSON dizisinden aldığımız firstname ve lastname değerleri ile web uygulama formumuzdaki açılır liste kutusu içeriğini oluşturmaktayız.<br />
<br />
Status koduna tekrar dikkat edelim. <span style="font-weight: bold;">"200"</span> olarak geri döndürülmüştür. Eğer kişi listesi boş olsaydı, <span style="font-weight: bold;">"204"</span>, yani <span style="font-weight: bold;">"No Content"</span> olarak ifade edilen status kodu geri döndürülecektir.<br />
<br />
<img src="https://i.imgur.com/lqniMMy.png" border="0" alt="lqniMMy.png" /><br />
<br />
<br />
Bu sefer açılır liste kutusu ile sadece seçtiğimiz kişiye ait bilgileri getirmek istiyoruz. Tekrar bir GET isteği oluşturacağız.<br />
<br />
Ama dikkat ederseniz URI 'de <span style="font-weight: bold;">e912b902721f44699762d031cbef4b62</span> ifadesinin eklendiğini göreceksiniz. Bu ifade, kayıta ait benzersiz kimlik bilgisidir. REST yaklaşımında, URI ye eklenen bu değer ile sadece ilgili kayıta ait bilgileri getirilmesi sağlanır.<br />
<br />
<img src="https://i.imgur.com/XcbbYBl.png" border="0" alt="XcbbYBl.png" /><br />
<br />
<span style="color: #cc3333;"><span style="font-weight: bold;"><span style="font-size: medium;">HTTP PUT METODU</span></span></span><br />
<br />
Açılır liste kutusundan seçtiğimiz "Julinanne Moore" için kişi bilgilerinde değişiklik yapmak istiyoruz.<br />
Bunun için <span style="font-weight: bold;">PUT </span>metodunu kullanacağız. Bu metot veri tabanı tarafında UPDATE olarak karşılık bulur.<br />
Kişiye ait benzersiz kimlik bilgisini URI de eklenmiştir. Kişi bilgileri JSON objesi olarak istek gövdesinde sunucuya iletilmektedir.<br />
<br />
<img src="https://i.imgur.com/rWqKcQN.png" border="0" alt="rWqKcQN.png" /><br />
<br />
<br />
Bir önceki PUT isteğinde sunucuya "firstname", "lastname" ve "country" parametrelerinin tümünü göndermiştik. Fakat bazen sadece belli bir parametre için değişiklik yapmak isteyebiliriz. Buradan hareketle "Julianne Moore" kişisinin Country bilgisini değiştirmek için istek gövdesinde sadece country parametre değerini iletebiliriz. Görüleceği üzere Country bilgisi "Turkey" olarak güncellenmiştir.<br />
<br />
<img src="https://i.imgur.com/j1pJsUy.png" border="0" alt="j1pJsUy.png" /><br />
<br />
<br />
<span style="font-weight: bold;"><span style="color: #cc3333;"><span style="font-size: medium;">HTTP DELETE METODU</span></span></span><br />
<br />
Son olarak "Julianne Moore" kişisini silmek istediğimizi varsayalım. Bunun için <span style="font-weight: bold;">DELETE </span>isteği oluşturacağız ve kimlik bilgisini URI ye ekleyeceğiz. Bu işlem veri tabanı tarafında DELETE olarak karşılık bulmaktadır.<br />
İşlemin başarılı neticelenmesi ile status kodu <span style="font-weight: bold;">"204"</span> olarak geri döndürülmüştür. Yani kaynak artık silinmiştir ve yoktur.<br />
<br />
<img src="https://i.imgur.com/oO6xVAM.png" border="0" alt="oO6xVAM.png" /><br />
<br />
<br />
<span style="font-weight: bold;">WebBroker üzerine;</span><br />
<br />
<img src="https://i.imgur.com/u9XKWSP.png" border="0" alt="u9XKWSP.png" /><br />
<br />
Sunucu tarafında 8080 numaraları port kullanılmıştır. Bunu istediğiniz gibi değiştirebilirsiniz.<br />
<br />
WebBroker Action Editor ile açılan form da iki Path tanımı göreceksiniz. Bunlardan biri Default olarak işaretlenir.<br />
PathInfo sütununda <span style="font-weight: bold;">/api/customers*</span> ifadesine dikkat edin. Fakat PathInfo ifadesinin son tarafındaki <span style="font-weight: bold;">"*"</span> önemlidir.<br />
Bunun anlamı /api/customers ile başlayan tüm isteklerin bu modül birimi tarafından değerlendirileceği anlamına gelir.<br />
Yani <span style="font-weight: bold;">http://localhost:8080/api/customers</span> ve <span style="font-weight: bold;">http://localhost:8080/api/customers/e912b902721f44699762d031cbef4b62</span> isteklerini aynı birim modülüne yönlendiriyoruz.<br />
<br />
<img src="https://i.imgur.com/6y2DeSA.png" border="0" alt="6y2DeSA.png" /><br />
<br />
WebBrokerServer uygulaması çalışma görüntüsü görseldeki gibi olacaktır. Görüleceği üzere Server Console uygulaması olarak oluşturulmuştur. Daha gelişkin uygulamalarda ISAPI tercih edebilirsiniz.<br />
<br />
<img src="https://i.imgur.com/uEcf5QN.png" border="0" alt="uEcf5QN.png" /><br />
<br />
Son olarak Delphi WebBroker çatısı Windows ve Linux platformlarında çalışabilmektedir. TMS Web Core istemci tarafı olmasından hareketle isterseniz Linux sunucularında uygulamanızı dağıtma şansına sahip olursunuz.<br />
<br />
<span style="font-weight: bold;">TMS Web Core üzerine;</span><br />
<br />
<img src="https://i.imgur.com/tidjYMW.png" border="0" alt="tidjYMW.png" /><br />
<br />
Eğer mevcut tasarımda değişiklik yaparsanız öncelikle uygulamayı Compile edin. Ardından Open Output Path in Explorer ile Web Core ile oluşturduğumuz nihai uygulama dosyalarını WebBroker server uygulaması dizinine kopyalayın. Mevcut projemizde Server uygulama dizinimizin içeriği görseldeki gibidir.<br />
<br />
<img src="https://i.imgur.com/XviapXO.png" border="0" alt="XviapXO.png" /><br />
<br />
<br />
Her iki projeye ait tüm kaynak kod ve database dosyası makale ekinde mevcuttur. Faydalı olması dileğiyle.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.delphican.com/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=2571" target="_blank" title="">WebBrokerAndWebCore.zip</a> (Dosya Boyutu: 1,93 MB / İndirme Sayısı: 50)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[TMS Web Core - Database]]></title>
			<link>https://www.delphican.com/showthread.php?tid=7578</link>
			<pubDate>Fri, 26 Jan 2024 18:22:07 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=7578</guid>
			<description><![CDATA[Selamlar, <br />
<br />
TMS Web Core framework unu inceleme fırsatı bulduk , gerçekten harika bir platform yaratmışlar.Tek takıldığım konu veritabanı işlemleri için rest api kullanmak zorundayız sanırım, onunda çözümü TMS 'nin ürünü olan XData mıdır? veya rest api yi ücretsiz yaratabileceğimiz bir platform var mı ? CRUD işlemleri için ....]]></description>
			<content:encoded><![CDATA[Selamlar, <br />
<br />
TMS Web Core framework unu inceleme fırsatı bulduk , gerçekten harika bir platform yaratmışlar.Tek takıldığım konu veritabanı işlemleri için rest api kullanmak zorundayız sanırım, onunda çözümü TMS 'nin ürünü olan XData mıdır? veya rest api yi ücretsiz yaratabileceğimiz bir platform var mı ? CRUD işlemleri için ....]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Gelen tablo veri akışı (TDS) Hatası]]></title>
			<link>https://www.delphican.com/showthread.php?tid=7572</link>
			<pubDate>Wed, 24 Jan 2024 08:37:37 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=7572</guid>
			<description><![CDATA[Tablodaki float tipi alana 0 değerini göndermeye çalışırken bu hatayı veriyor. İşin garibi local sunucuda uygulamayı çalıştırdığımda bu hatayı vermezken, uygulamayı serverden çalıştırdığımda bu hatayı veriyor. Bu şekilde hata ile karşılaşan varmı arkadaşlar?<br />
<br />
<img src="https://akturksoft.com/hata.png" width="400" height="400" border="0" alt="hata.png" />]]></description>
			<content:encoded><![CDATA[Tablodaki float tipi alana 0 değerini göndermeye çalışırken bu hatayı veriyor. İşin garibi local sunucuda uygulamayı çalıştırdığımda bu hatayı vermezken, uygulamayı serverden çalıştırdığımda bu hatayı veriyor. Bu şekilde hata ile karşılaşan varmı arkadaşlar?<br />
<br />
<img src="https://akturksoft.com/hata.png" width="400" height="400" border="0" alt="hata.png" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[unigui mobile geolocation]]></title>
			<link>https://www.delphican.com/showthread.php?tid=7564</link>
			<pubDate>Fri, 19 Jan 2024 15:55:58 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=7564</guid>
			<description><![CDATA[Merhabalar,<br />
<br />
unigui mobile projesinde, geolocation konum için browserlar   bildiğim kadarıyla doğrudan sensöre erişip konum bilgisi alamamıyor,<br />
int ağ bağlantısı üzerinden yada ip üzerinden telekominikasyon lokasyona göre yaklaşık bir konum buluyor,<br />
 ip üzerinden bulan çok çeşitli servisler mevcut<br />
ancak bunlarda net konumu vermiyor bildiğim kadarıyla..<br />
Hardware sensörü gibi daha net bir konumu unigui mobilden alabilir miyiz? <br />
Bir yolu varmı?<br />
<br />
Teşekkürler.]]></description>
			<content:encoded><![CDATA[Merhabalar,<br />
<br />
unigui mobile projesinde, geolocation konum için browserlar   bildiğim kadarıyla doğrudan sensöre erişip konum bilgisi alamamıyor,<br />
int ağ bağlantısı üzerinden yada ip üzerinden telekominikasyon lokasyona göre yaklaşık bir konum buluyor,<br />
 ip üzerinden bulan çok çeşitli servisler mevcut<br />
ancak bunlarda net konumu vermiyor bildiğim kadarıyla..<br />
Hardware sensörü gibi daha net bir konumu unigui mobilden alabilir miyiz? <br />
Bir yolu varmı?<br />
<br />
Teşekkürler.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[SessionManager.Sessions Varyant Paylaşım]]></title>
			<link>https://www.delphican.com/showthread.php?tid=7557</link>
			<pubDate>Mon, 15 Jan 2024 10:44:30 +0300</pubDate>
			<guid isPermaLink="false">https://www.delphican.com/showthread.php?tid=7557</guid>
			<description><![CDATA[Merhabalar,<br />
<br />
Unigui de henüz login olan yada olmayan tüm aktif oturumlara ihtiyacım olmuştu.<br />
Bununla ilgili olarak bir demoyu <br />
"C:\Program Files (x86)\FMSoft\Framework\uniGUI\Demos\Desktop\Session List" dizininde buldum.<br />
Altta kodun bir kısmı var.<br />
<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">  &#10;var&#10;  S : TUniGUISessions;&#10;  U : TUniGUISession;&#10;  I : Integer;&#10;begin&#10;S := UniServerModule.SessionManager.Sessions;&#10; S.Lock; &#10; try&#10;   SetLength(ASessionList, S.SessionList.Count);&#10;&#10;   for I := 0 to S.SessionList.Count - 1  do&#10;   begin&#10;     U := S.SessionList[I];&#10;     ASessionList[I].ASessionId := U.SessionId;&#10;     ASessionList[I].AIP := U.RemoteIP;&#10;     ASessionList[I].ALastTime := U.LastTimeStamp;&#10;     if U.UniMainModule &lt;&gt; nil then &#10;       ASessionList[I].AMyVar := (U.UniMainModule as TUniMainModule).FMyStringVar;&#10;   end;&#10; finally&#10;   S.Unlock; &#10; end;</pre>
<br />
Görüldüğü üzere UniServerModule.SessionManager.Sessions nesnesi üzerinde oturumlar listesi <br />
S değişkenine alınıp döngü ile işleniyor.<br />
<br />
Burada dikkatimi çeken şey ise bu session list nesnesi üzerinden doğrudan ilgili oturumun UniMainModulüne erişip public deki bir <br />
değişkenin değerini okuyabiliyor olması. örneğin aktif user kod ad vb.<br />
<br />
Peki şu an oturum açmış bütün userların UniMainModulüne erişip public  değerlerini okuyabiliyorsam acaba yazabilir miydim? Aklında deli sorular.<br />
Hemen bir demo UniMainModulüne public bir değişken oluşturup, <br />
herhangi bir userdan,  istediğim diğer bir userın bu public değerini değiştirmeye çalıştım Debugger hata vermedi yazamazsın vs gibi.<br />
<br />
Evet tam da tahmin ettiğim gibi bir userdan istediğim herhangi bir userın public değişkenlerine erişip veri yazabiliyordum.<br />
Aklıma gelen ilk şey ; Veritabanına uğramadan doğrudan doğruya kullanıcılar arası bildirim iletişim mesajlaşma vs yapılabilir.<br />
Yani bir nevi webSocket uygulaması gibi clientlar arası haberleşme protokolü uygulanabilir.<br />
yada Bir kullanıcının diğer bir kullanıcıyı tetiklemesi sağlanabilir.<br />
Gerisi hayal gücünüze kalmış.<br />
<br />
<br />
Ancak önemli bir husus : Oturumları okuyabilmek için UniServerModule üzerindeki <br />
oturum nesnesini (UniServerModule.SessionManager.Sessions) okurken lock/unlock ediyoruz.<br />
Bunu çok sık yapmak yada lock süresini çok uzun tutmak sistem tutarsızlıklarına sebep olacağı belirtiliyor buna dikkat. <br />
Unigui Forumda bunula ilgili çeşitli soru cevaplar da mevcut.]]></description>
			<content:encoded><![CDATA[Merhabalar,<br />
<br />
Unigui de henüz login olan yada olmayan tüm aktif oturumlara ihtiyacım olmuştu.<br />
Bununla ilgili olarak bir demoyu <br />
"C:\Program Files (x86)\FMSoft\Framework\uniGUI\Demos\Desktop\Session List" dizininde buldum.<br />
Altta kodun bir kısmı var.<br />
<br />
<script type="text/javascript" src="https://www.delphican.com/inc/plugins/syntax/scripts/shBrush_delphi.js"></script><pre class="brush: delphi;">  &#10;var&#10;  S : TUniGUISessions;&#10;  U : TUniGUISession;&#10;  I : Integer;&#10;begin&#10;S := UniServerModule.SessionManager.Sessions;&#10; S.Lock; &#10; try&#10;   SetLength(ASessionList, S.SessionList.Count);&#10;&#10;   for I := 0 to S.SessionList.Count - 1  do&#10;   begin&#10;     U := S.SessionList[I];&#10;     ASessionList[I].ASessionId := U.SessionId;&#10;     ASessionList[I].AIP := U.RemoteIP;&#10;     ASessionList[I].ALastTime := U.LastTimeStamp;&#10;     if U.UniMainModule &lt;&gt; nil then &#10;       ASessionList[I].AMyVar := (U.UniMainModule as TUniMainModule).FMyStringVar;&#10;   end;&#10; finally&#10;   S.Unlock; &#10; end;</pre>
<br />
Görüldüğü üzere UniServerModule.SessionManager.Sessions nesnesi üzerinde oturumlar listesi <br />
S değişkenine alınıp döngü ile işleniyor.<br />
<br />
Burada dikkatimi çeken şey ise bu session list nesnesi üzerinden doğrudan ilgili oturumun UniMainModulüne erişip public deki bir <br />
değişkenin değerini okuyabiliyor olması. örneğin aktif user kod ad vb.<br />
<br />
Peki şu an oturum açmış bütün userların UniMainModulüne erişip public  değerlerini okuyabiliyorsam acaba yazabilir miydim? Aklında deli sorular.<br />
Hemen bir demo UniMainModulüne public bir değişken oluşturup, <br />
herhangi bir userdan,  istediğim diğer bir userın bu public değerini değiştirmeye çalıştım Debugger hata vermedi yazamazsın vs gibi.<br />
<br />
Evet tam da tahmin ettiğim gibi bir userdan istediğim herhangi bir userın public değişkenlerine erişip veri yazabiliyordum.<br />
Aklıma gelen ilk şey ; Veritabanına uğramadan doğrudan doğruya kullanıcılar arası bildirim iletişim mesajlaşma vs yapılabilir.<br />
Yani bir nevi webSocket uygulaması gibi clientlar arası haberleşme protokolü uygulanabilir.<br />
yada Bir kullanıcının diğer bir kullanıcıyı tetiklemesi sağlanabilir.<br />
Gerisi hayal gücünüze kalmış.<br />
<br />
<br />
Ancak önemli bir husus : Oturumları okuyabilmek için UniServerModule üzerindeki <br />
oturum nesnesini (UniServerModule.SessionManager.Sessions) okurken lock/unlock ediyoruz.<br />
Bunu çok sık yapmak yada lock süresini çok uzun tutmak sistem tutarsızlıklarına sebep olacağı belirtiliyor buna dikkat. <br />
Unigui Forumda bunula ilgili çeşitli soru cevaplar da mevcut.]]></content:encoded>
		</item>
	</channel>
</rss>