20 Temmuz 2013 Cumartesi

ExtJS 4 Php JSON XML Örnekleri

ExtJS 4 ve Php ile xml ve json verikaynaklarından okuma işleminin nasıl yapılabileceğini gösteren kod örnekleridir.

Vakti zamanında çok derinliklerine kadar dalmıştım. :)
Kod örneklerine aşağıdaki adresten erişebilirsiniz.



https://github.com/ismailkocacan/ExtJS-4_Php_JSON_Ornekleri


9 Mayıs 2013 Perşembe

Generic Listte En Büyük Nesneyi Bulmak !

Biliyorum çok boktan bir başlık oldu.
Aşağıda TKisi recordu ve TKisi recorlarından oluşan generic bir listimiz var(TKisiList).
Amacımız bu TKisiList de ki "id" değeri en büyük olan TKisi instance'ı bulmak(!).

Bunun için TKisiList sınıfına getMaxIdKisi() methodu ekleyip listenin içindeki her bir elemanın id değerini karşılaştırarak id değeri en büyük olan kişi nesnesini buluyoruz.


unit Kisi;

interface

uses
  System.Generics.Defaults,
  System.Generics.Collections;

type
  TKisi = record
    adi: string;
    soyadi: string;
    id: Integer;
  end;

  TKisiList = class(TList)
  public
    function getMaxIdKisi(): TKisi;
  end;

implementation

{ TKisiList }
function TKisiList.getMaxIdKisi: TKisi;
var
  comparer: IComparer;
  i, c: Integer;
begin
  comparer := TComparer.Default;
  c := Self.Items[0].id;
  for i := 1 to Self.Count - 1 do
  begin
    if comparer.Compare(Self[i].id, c) > 0 then
    begin
      c := Self[i].id;
      Result := Self[i];
    end;
  end;
end;

end.


var
  Form3: TForm3;

implementation

uses Kisi;

{$R *.dfm}

procedure TForm3.FormCreate(Sender: TObject);
var
  kisi: TKisi;
  kisiList: TKisiList;

  idEnbuyukKisi:TKisi;
begin
  kisiList:=TKisiList.Create;
  kisi.id:=30;
  kisi.adi:='İSMAİL';
  kisi.soyadi:='KOCACAN';
  kisiList.Add(kisi);


  kisi.id:=20;
  kisi.adi:='KEMAL';
  kisi.soyadi:='BAYAT';
  kisiList.Add(kisi);

  kisi.id:=31;
  kisi.adi:='HAYDAR';
  kisi.soyadi:='DÜMEN';
  kisiList.Add(kisi);


  idEnbuyukKisi:=kisiList.getMaxIdKisi;
  Caption:=Format('%s %s ',[idEnbuyukKisi.adi,idEnbuyukKisi.soyadi]);
end;

Örneği(XE2) burdan indirebilirsiniz.

25 Nisan 2013 Perşembe

RTTI Object Mapping

Veritabanı içersinde aşağıdaki gibi tablo olduğunu varsayalım. Amacımız bu tablodaki bir satırlık kaydı,delphi tarafında ifade edecek olan TKisi sınıfından oluşturulan, instance,ın alanlarına basmak ! Bu iş içinde delphi reflection kütüphanesi RTTI kütüphanesini kullanıyoruz.
CREATE TABLE [dbo].[Kisi](
 [id] [int] IDENTITY(1,1) NOT NULL,
 [adi] [varchar](10) NULL,
 [soyadi] [varchar](10) NULL,
 [yasi] [smallint] NULL,
 [dogumTarihi] [smalldatetime] NULL,
 CONSTRAINT [PK_Kisi] PRIMARY KEY CLUSTERED 
(
 [id] ASC
)WITH (PAD_INDEX  = OFF, 
       STATISTICS_NORECOMPUTE  = OFF, 
    IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS  = ON, 
    ALLOW_PAGE_LOCKS  = ON) 
    ON [PRIMARY]
) ON [PRIMARY]

insert into Kisi (adi,soyadi,yasi,dogumTarihi) values ('İSMAİL','KOCACAN',23,'1990.06.01')

Veri erişim methodlarımız.

DataAccess.pas

unit DataAccess;

interface

uses
  Forms,
  Data.DB,
  Data.Win.ADODB;

function createConnection: TADOConnection;
function createDataset(sql: string): TDataSet;

implementation

function createConnection: TADOConnection;
var
  connection: TADOConnection;
const
  CONNECTION_STRING='Provider=SQLOLEDB.1;Password=123;User ID=sa;Initial Catalog=DB;Data Source=.\SQLR2';
begin
  connection := TADOConnection.Create(Application);
  connection.ConnectionString :=CONNECTION_STRING;
  connection.Open();
  Result := connection;
end;

function createDataset(sql: string): TDataSet;
var
  query: TADOQuery;
begin
  query := TADOQuery.Create(Application);
  query.connection := createConnection;
  query.sql.Text := sql;
  query.Open;
  Result := query;
end;

end.

Dataset'teki alanlar ile nesnenin alanlarını eşitleyen,map methodu. Kullanım : TRttiObjectMapping.map(TDataSet sınıfından türemiş bir instance,TObject den türemiş bir nesne);

RttiObjectMapping.pas

unit RttiObjectMapping;

interface

uses
  Data.DB,
  System.Rtti;

type

  TRttiObjectMapping = class
  public
    class procedure map(dataset: TDataSet; instance: TObject);
  end;

implementation

{ TRttiObjectMapping }
class procedure TRttiObjectMapping.map(dataset: TDataSet; instance: TObject);
var
  cntx: TRttiContext;
  objField: TRttiField;
  dbFieldName: string;

  I: Integer;
  value: TValue;
begin
  cntx := TRttiContext.Create;
  for I := 0 to dataset.FieldCount - 1 do
  begin
    dbFieldName := dataset.Fields[I].DisplayName;
    for objField in cntx.GetType(instance.ClassType).GetFields do
    begin
      if dbFieldName = objField.Name then
      begin
        value := TValue.From(dataset.Fields[I].value);
        objField.SetValue(instance, value);
        Break;
      end;
    end;
  end;
  dataset.Close;
  dataset.Free;
  cntx.Free;
end;

end

Kisi tablosundaki bir satırı delphi ifade edecek olan TKisi sınıfımız. Nesne oluşturulurken,TRttiObjectMapping.map methodu ile map'leme işlemi,yani dataset alanları, nesnenin alanlarına atama işlemi yapılmıştır. Kisi tablosuna yeni bir alan eklediğinizde,eklediğiniz bu alanı TKisi sınıfıda eklediğinizde alanın değeri map'leme sayesinde otomatik olarak gelecektir.

Model.pas

unit Model;

interface

uses
 System.SysUtils,
 DataAccess,
 RttiObjectMapping;

type

  TKisi = class
  const
    QUERY='select * from Kisi where id=%s';
  private
    id: Integer;
    adi: string;
    soyadi: string;
    yasi: Byte;
    dogumTarihi: TDateTime;
  public
    function getId():Integer;
    function getAdi():string;
    function getSoyadi():string;
    function getYasi():Byte;
    function getDogumTarihi:TDateTime;
    constructor createFromId(id: Integer);
    destructor Destroy;
  end;

implementation


{ TKisi }
constructor TKisi.createFromId(id: Integer);
begin
  TRttiObjectMapping.map(createDataset(Format(QUERY, [IntToStr(id)])), Self);
end;

destructor TKisi.Destroy;
begin
  inherited;
end;

function TKisi.getAdi: string;
begin
  Result:=Self.adi;
end;

function TKisi.getDogumTarihi: TDateTime;
begin
  Result:=Self.dogumTarihi;
end;

function TKisi.getId: Integer;
begin
  Result:=Self.id;
end;

function TKisi.getSoyadi: string;
begin
  Result:=Self.soyadi;
end;

function TKisi.getYasi: Byte;
begin
  Result:=Self.yasi;
end;

end.


TKisi sınıfından bir intance(lKisi) oluşturup kullanıyoruz.

Main.pas

unit Main;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.StdCtrls;

type

  TFrmMain = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FrmMain: TFrmMain;

implementation

uses Model;

{$R *.dfm}


procedure TFrmMain.FormCreate(Sender: TObject);
var
 lKisi:TKisi;
begin
  lKisi := TKisi.createFromId(1);
  Memo1.Lines.Add(lKisi.getAdi);
  Memo1.Lines.Add(lKisi.getSoyadi);
  Memo1.Lines.Add(IntToStr(lKisi.getYasi));
  Memo1.Lines.Add(DateToStr(lKisi.getDogumTarihi));
  FreeAndNil(lKisi);
end;

end.


Kaynak kodları buradan indirip inceleyebilirsiniz.İyi Çalışmalar...

17 Mart 2013 Pazar

Native Xml Karakter Problemi Çözümü

Unit NativeXmlHelper;

interface

uses NativeXml;

type

  TXmlNodeHelper = class helper for TXmlNode
  public
    function getValue: string;
  end;

implementation

{ TXmlNodeHelper }
function TXmlNodeHelper.getValue: string;
begin
  Result := UTF8ToString(Self.ValueAsUnicodeString);
end;

end.
Kullanımı :
var
 nNode: TXmlNode;
 nNode.getValue;
Diğerlerinde de işe yarayabilir belki.
Kolay gelsin.