23 Ekim 2012 Salı

Skin'lenemeyen TdxTRibbon Nesnesi

Evet böyle bir problem ile karşı karşıya kaldığınızda,yani formunuz üzerinde bir adet TdxRibbon eklemişsiniz,ve tüm nesneler skin ile kaplanırken, ribbon'unuz skin kaplamamıyorsa bilin ki uses 'de dxSkinsdxRibbonPainter uniti tanımlı değildir.tanımlayıp sorunu çözebilirsiniz.

İyi Çalışmalar

22 Ekim 2012 Pazartesi

Class Helper İle Nesne Oluşturmak

Sınıflardan nesne referansı oluştururken,kodun tekrar etmesi,kodun yönetimini zorlaştırıyor, ve sürekli aynı kodu defalarca yazmak bizi yavaşlatıyor.

 Önce :

var  
 aQuery: TUniQuery;
begin
  aQuery := TUniQuery.Create(Application);
  aQuery.SQL.Text := 'sql kodun';
  aQuery.Execute;
  FreeAndNil(aQuery);
end;
TUniquery sınıfına bir "class extension function" yazıyoruz. Dikkat ederseniz bu sefer nesneye extension function olarak değilde, sınıfa extension function olarak yazıyoruz. O sebeble bu işi daha pratik hale getiriyoruz.


 Sonra :

unit uUniHelper;
interface

uses
  Vcl.Forms,
  System.SysUtils,
  System.Classes,
  Data.DB, 
  MemDS,
  DBAccess, 
  Uni;

type
  TUniQueryHelper = class helper for TUniQuery
  public
    class function CreatefromSQL(aSQL: string): TUniQuery;
  end;

implementation


{ TUniQueryHelper }
class function TUniQueryHelper.CreatefromSQL(aSQL: string): TUniQuery;
var
  aQuery: TUniQuery;
begin
  aQuery := TUniQuery.Create(Application);
  aQuery.Connection := UniConnection1;
  aQuery.SQL.Text := aSQL;
  aQuery.Execute;
  Result := aQuery;
end;

end.
var
  aQuery: TUniQuery;
begin
  aQuery := TUniQuery.CreatefromSQL('sql kodun');
  FreeAndNil(aQuery);
end;

iyi çalışmalar.

12 Ekim 2012 Cuma

Datasnap rest sunucusu ile iletişim(Android Client)

Daha önce iOS(Objective-C) ortamından erişip bir UITableView nesnesi servisten gelen json veriyi yazdırmıştık. Şimdi ise Android(Java) ortamından datasnap server'a erişip bir listview nesnesine nasıl okuyabiliriz.Bunu öğrenicez. Datasnap Uygulaması oluştururken "Mobile Connectors" seçeneğini seçip devam ettiğiniz de size ilgili platformların mini frameworklerini de oluşturuyor.objective-c için SBJson ismindeki framework örnek verilebilir. Yine android(java) için Embarcadero firmasının yazdığı com.embarcedero.javaandroid paketi(mini framework diyebiliriz) Yukarıda bahsettiğim frameworkleri datasnap uygulamanızı oluştururken "Mobile Connectors" seçeneğini işaretlediğinizde projenizin dizininde "proxy" klasöründe ilgili frameworkü bulabilirsiniz.

 activity_main.xml



    
    


MainActivity.java

package com.datasnap.restfulclient;

import java.io.IOException;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {

 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
      
        try {
   this.bindListView();
  } catch (ClientProtocolException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (JSONException e) {
   e.printStackTrace();
  }
    }
    
    
    private void bindListView() throws ClientProtocolException, IOException, JSONException{
     ArrayList list=this.GetPersonList();
   
        ArrayAdapter arrayAdapter =      
                new ArrayAdapter(this,android.R.layout.simple_list_item_1, list);
                      
        final ListView listView1=(ListView)this.findViewById(R.id.listView1);
        listView1.setAdapter(arrayAdapter);
    }
    
    
    
    private ArrayList GetPersonList() throws ClientProtocolException, IOException, JSONException{
     ArrayList list=new ArrayList();
     String json=this.getDataFromRest("http://192.168.0.16:8080/datasnap/rest/TServerMethods1/GetPersonList");
     JSONObject jsonObject=new JSONObject(json);
     JSONArray arrayLevel1=jsonObject.getJSONArray("result");
     JSONArray arrayLevel2=(JSONArray)arrayLevel1.get(0);
     for(int I=0; I< arrayLevel2.length(); I++){
      JSONObject items=(JSONObject)arrayLevel2.getJSONObject(I);
      String firstName=items.get("firstname").toString();
      String lastName=items.get("lastname").toString();
      list.add(firstName+" "+lastName);
     }
     return list;
    }
    
    
    
    private String getDataFromRest(String httpUrl) throws ClientProtocolException,IOException{
     HttpClient httpClient=new DefaultHttpClient();
     HttpGet httpMethod=new HttpGet(httpUrl.toString());
     httpMethod.setHeader("Content-type", "application/json");
     HttpResponse httpResponse=httpClient.execute(httpMethod);
     int status=httpResponse.getStatusLine().getStatusCode();
     if (status==200){
      HttpEntity entity=httpResponse.getEntity();
      String data=EntityUtils.toString(entity);
      return data;
     }else{
      return null;
     }
    }
    
    
 

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}



AndroidManifest.xml dosyasına çift tıklayıp gelen ekrandan "Permissions" sekmesinden "android.permission.INTERNET" değerini ekliyorsunuz. Ekledikten sonra AndroidManifest.xml dosyasının içeriği aşağıdaki gibi olacaktır.

 AndroidManifest.xml



    
    

    
        
            
                

                
            
        
    



Eğer yukarıdaki "android.permission.INTERNET" değerini eklemez iseniz android uygulamanız datasnap rest sunucunuza erişmeyecektir.


İyi Çalışmalar.

11 Ekim 2012 Perşembe

İlk Android Demom

Daha önce de android geliştirme işine girmiştim.Fakat bana göre geliştirme araçlarının kurulum zırvalıkları ve simulatörün bazı uyuzlukları yüzünden uğraşmayı bırakıp x-code'a dalmıştım.
Neyse dün yine yeniden başladım.Ve ilk işe yaramayan  :) "Hello world" mahiyetinde ki uygulamamı yaptıktan sonra bir android cihaza yükleyip çalıştırdım.Ve paylaşmak istedim.

activity_main.xml



    

MainActivity.java

package com.example.helloworld;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
 import android.view.View;
import android.widget.*;
public class MainActivity extends Activity {
    @Override 
   public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
        final TextView textView1=(TextView)findViewById(R.id.textView1);
        final EditText editText1=(EditText)findViewById(R.id.editText1);
        final Button button1=(Button)findViewById(R.id.button1);
        button1.setText("Bas Bana");
        button1.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
                                            textView1.setText(editText1.getText());
                                            editText1.setBackgroundColor(Color.YELLOW);
                                            button1.setText("Bastın Bana");
   }
  });   
    }
    @Override
   public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
       return true;
    }
}

Projeyi burdan indirebilirsiniz.
İyi Çalışmalar.

8 Ekim 2012 Pazartesi

JQuery Ajax Response Tamamlanamama Sorunu

fasillistcountbyyilandfasilno.php isminde bir php scriptim var.
Ve bu script içersinde bir tablonun satır sayısını yazdırıyorum.

function getfasilListCountByYilandfasilno(yil,fasilno) fonksiyonu ile de
sonucu almaya çalışıyorum.Fakat response tamamlanmadan "sResult" varsayılan değeri 0 ile
birlikte geri dönüyor.Yani bizim getfasilListCountByYilandfasilno fonksiyonun görevini
tam yerini getirmiş olamıyordu.Jquery Ajax Request parametrelerini aşağıdaki gibi düzenleyerek
çözelbildim.
function getfasilListCountByYilandfasilno(yil,fasilno){
    sResult=0;
    $.ajax({
        type: 'GET',
        url: 'fasillistcountbyyilandfasilno.php',
        cache: true,
        async: false,
        contentType: "application/x-www-form-urlencoded",
        data: 'fasilno='+fasilno+'&yil='+yil,
        success: function(ajaxResponse) {
            sResult=ajaxResponse;
        },
    });
    return sResult;
}

İyi çalışmalar.

2 Ekim 2012 Salı

UITabBarItem Nesnesini Özelleştirmek

UITabBarItem nesnesini nasıl kendi isteğimize göre seçili ve seçili olmayan simgeler ekleyebiliriz bunu göstermeye çalışıcam.

Bir UITabBar nesnesi ve üzerinde bir UITabBarItem nesnesi olduğunu varsayıyoruz.
30X30 transparan png formatında seçili ve seçili olmayan şeklinde iki tane resim dosyası hazırlıyorsunuz.
Daha sonra bunları projenize ekliyorsunuz.

mainViewController.h

@interface mainViewController : UIViewController
  @property(nonatomic,retain) IBOutlet UITabBarItem * tabBarItemBilgi;
@end

mainViewController.m

@synthesize tabBarItemBilgi;
-(void) loadIconSettings
{
    UIImage *iconInfo=[UIImage imageNamed:@"icon_info.png"];        //normal icon
    UIImage *iconInfoSel=[UIImage imageNamed:@"icon_info_sel.png"]; //Seçildiğinde gözükecek icon
    [tabBarItemBilgi setFinishedSelectedImage:iconInfoSel withFinishedUnselectedImage:iconInfo];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self loadIconSettings];   
}

Tanımladığınız tabBarItemBilgi Outlet'ini ilgili UITabBarItem nesnesi üzerine sürükleyip bırakıyorsunuz.(Bir nevi Controller'da tanımladığımız tabBarItemBilgi nesnesine View den gelecek olan veriyi tanımladık).


Kaynaklar :

UITabBarItem Class Reference
UITabBar Class Reference
İyi Çalışmalar.