Generic Listte En Büyük Nesneyi Bulmak !

0 yorum

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.

RTTI Object Mapping

0 yorum

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.

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

Ankara Kalesi

0 yorum

Eeeee hep kod yazacak değiliz ya. :)
Hafta sonu ankara kalesinde ufak bir gezinti yaptık.
Gezintiden izlenimler,izliyoruz efem :)

Ankara Kalesi Vol 2.1



Ankara Kalesi Vol 2.2

Native Xml Karakter Problemi Çözümü

0 yorum

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.

UnManaged Exports

0 yorum

Bazen .net assembly'lerini delphi de kullanmak ihtiyacı hasıl olur veya kullanmak zorunda kalırız.

Delphiden  LoadLibrary apisi ile yüklediğimiz .net assembly'leri içindeki methodları çağırabilmemiz(adresleyebilmek) için assembly içindeki methodların export edilmiş olması gerekir.

assembly içindeki methodları export etmek için;

İyi çalışmalar...

RTTI ile sadece o sınıfa ait methodları listelemek

0 yorum

RTTI ile bir sınıfa ait methodları listeliyebilmemin mümkünatı aşikardır.Lakin şöyle bir durum var.
Eğer methodlarını listelemek istediğiniz sınıf , birden çok sınıftan kalıtıla gelinerek yazılmış bir sınıfsa;

Alt sınıfın miras alınabilen tüm methodları,üst sınıfında methoduymuş gibi oluyor.
GetMethods ile o sınıfa ait methodları, listelemek istediğinizde taban sınıftaki methodlarda listeleniyor.
Haliyle bu methodlar ne ayak diyorsunuz.

Eğer kendi eklediğiniz methodları listelemek istiyorsanız....

var
  cntx: TRttiContext;
  typ: TRttiType;
  method: TRttiMethod;
begin
  cntx := TRttiContext.Create;
  typ := cntx.GetType(TServerMethods1);
  lBoxMethods.Items.Clear;
  for method in typ.GetMethods do
  begin
    if method.Parent.Name = typ.Name then
      lBoxMethods.Items.Add(method.Name);
  end;
end;

Nerden icab ettiğine gelince...
procedure TForm1.lBoxMethodsDblClick(Sender: TObject);
var
  methodName, url: string;
begin
  methodName := TListBox(Sender).Items[TListBox(Sender).ItemIndex];

  StartServer;
  url := Format('http://localhost:%s/datasnap/rest/TServerMethods1/' +
    methodName, [EditPort.Text]);
  ShellExecute(0, nil, PChar(url), nil, nil, SW_SHOWNOACTIVATE);
end;

İyi çalışmalar...

Hatırda Kalmaz,Satırda Kalır(Yazılım Dokümantasyonu)

0 yorum

Yazılım dokümantasyonu hazırlayabileceğiniz bazı araçlar.

Delphi IDE için;

http://www.devjetsoftware.com

Bence devjetsoftware'ın ki çok başarılı.


Eclipse IDE için;


http://jautodoc.sourceforge.net




Sizlerin de bilip kullandığınız,kullanışlı yazılım dokümantasyonu hazırlama araçları varsa belirtmenizi isterim.

Web Servisten Class Döndürmek

0 yorum

.net xml web servislerinden class döndürmek için,döndüreceğimiz o class'ı Serializable attribute ile işaretlemeliyiz.

 Product.cs

    [Serializable]
    public class Product
    {
        public int RID { get; set; }
        public String BARCODENO { get; set; }
        public String PRODUCTNAME { get; set; }
        public decimal UNITPRICE { get; set; }
        public int AMOUNT { get; set; }
    }
     [WebMethod(Description = "Barkod Numarasından Ürün Bilgisi Sorgulama")]
     public Product FindProductByBarcode(String BarCodeNo)
     {
        /*Burada herhangi bir verikaynağından çekildiğini varsayalım...*/
        Product product = new Product();
        product.RID = 1;
        product.BARCODENO ="6285865292005";
        product.PRODUCTNAME = "Ürün 1";
        product.UNITPRICE = 50;
        product.AMOUNT = 50;
        return product;
     }

Sorgudan dönen xml sonuç :


  
    
    
      1
        86919937
        L&M
        5.0000
        50
       
    
  


Kolay gelsin.

Android .Net XML Web Service Client Uygulama (CRUD) Demo

4 yorum

.Net xml web servislerine andorid ortamından erişim ile ilgili geliştirdiğim bir prototip.
tbperson(rid,firstname,lastname) alanlarına sahip bir sql server veritabanı tablosu üzerinde,web service kullanarak ekleme,silme,güncelleme,listemele yapan bir uygulama.

Web Service Methodlarımız :


Burada GetPersonList methodu geriye aşağıdaki xml veriyi döndürüyor.

  
  	
  		
  			
		  		
		  			
		  				
		  						
		  							
		  								
		  									
		  									
		  									
		  								
		  							
		  						
		  					
		  				
		  			
		  		
		  		
		  			
		  				1ismailkocacan
2kemalbayat
3ferhatpekdemir

Demo :



Gelişmeleri aktarmaya devam edeceğiz.