Delphi & Animated Flash Charts(Fusion Charts)

// 10 Haziran 2009 // Delphi, Grafik, Programlama

fusioncharts

Infosoft Global firmasının animasyonlu(Flash destekli) pek çok ürünü var. Bu ürünlerin neler olduğunu ve ne gibi yetenekleri olduğuna buradan bakabilirsiniz. Ben elbetteki hepsini anlatmayacağım. Örneğimde Fusion Widgets kütüphanesine dahil olan silindir chart’ı anlatacağım. Lâkin burada izah edeceklerim diğer chart türleri içinde geçerli olacaktır.

Hepimiz yazdığımız uygulamaların vurucu gücünün; raporlar ve bu raporların ekrandaki sunum tarzının etkileyiciliği olduğunu biliriz. Programlarımızı pazarladığımız müşterilerimiz; genellikle programın alt yapısının ne kadar güçlü olduğu, stabilitesi gibi aslında son derece önemli olan hususlarla maalesef pek ilgilenmezler. Herşeyde olduğu gibi görsellik; programlarımız için de son derece önemlidir. Görselliğin günden güne önem kazandığını Microsoft’un Windows Presentation Foundation(WPF) yada SilverLight’a verdiği önem de kanıtlıyor sanırım.

Pek çok Delphi programcısı, hazırladığı raporların görselliğini genellikle TeeChart ile sunar. TeeChart açık kaynak kodlu ve güçlü bir görsel raporlama aracı olsa da; biz bu makalemizde Flash ile hazırlanmış bir raporlama aracı olan Fusion bileşenleri ile ilgileneceğiz.

Fusion bileşenleri; Fusion Charts, Fusion Widgets, Fusion Maps gibi ayrı ayrı pek çok grafiğin desteklenebildiği zengin bir kütüphaneden oluşuyor. En önemli özelliği; client tarafında sadece Flash Player’a ihtiyaç duyması. Genel olarak, Flash Action Script dilinde yazılmış olan chart kütüphaneleri, çalışabilmek için programlama ortamında XML, HTML ve JavaScript işbirliğinden yararlanıyor. Aşağıda makalemizde izah edeceğimiz silindir chart’ın bir örneğini görebilirsiniz. Elbette, bu örneği gözlemleyebilmeniz için makinanızda Flash Player’ın yüklü olması gerekiyor. Eğer Flash Player’ınız yüklü değil ise, buradan yükleyebilirsiniz.

Silindir Chart Örneği

 

 


Fusion araçlarını Delphi’de kullanabilmek için, HTML + XML + JavaScript işbirliğinden faydalanmak gerektiğini söylemiştik. Aslında bu gerekliliği ben değil Fusion Charts söylüyor. Ben yazdığım programların bu kadar fazla gereksinime eğilimli olmasını pek sevmiyorum. Bu nedenle bizim örneğimizde HTML + XML + JavaScript ve hatta SWF dosya gereksinimi dahi olmayacak :) Elbette siz, bu fonksiyonaliteyi masaüstü uygulamalarınızda değil de, web tabanlı uygulamalarınızda kullanacaksanız o zaman gereksinimleri yerine getirmek durumunda kalacaksınız.

Makalemizde ilerlemeden evvel, ilgili siteleri gezmenizi ve örnekleri incelemenizi rica ediyorum. Böylelikle; ürün hayalgücünüzde daha net bir şekle kavuşacaktır. Ürünü satın aldığınızda, ürünle birlikte size flash dosyalarının(swf) kaynak kodlarını içeren ActionScript kodları da gelecektir(fla dosyaları). Biz bu dosyalar üzerinde birkaç değişiklik yapacağız. Yapacağımız değişikliklerin amacı; Flash ile Delphi arasında bir köprü kurma zaruretimizden kaynaklanıyor olacak. Flash üzerinde mouse ile yapacağımız tıklamaların, Delphi tarafında yakalanması ve Delphi üzerinden Flash içindeki nesnelere direkt erişim sağlamak için biraz ActionScript’e de amiyane tabir ile bulaşacağız.

İhtiyacımız olan şeyler;

  • Flash Player
  • Silindir dosyasının kaynak kodu(fla)
  • Makinanızda Flash Player’ın yüklü olduğunu varsayarak; birinci adımda Delphi içinde Flash animasyonlarını oynatabilmek için Flash Player COM nesnesini uygulamamıza ekleyeceğiz. Bunun için; Project/Import Type Library yolundan ShockWaveFlash ActiveX nesnesini projemize aşağıdaki şekilde import edeceğiz.(Install seçeneğini seçerek)

    shockwaveflash

    Bu işlemden sonra artık makinamız üzerindeki herhangi bir flash animasyonunu Delphi içinden rahatlıkla oynatabiliriz. Ancak biz, herhangi bir statik flash animasyonunun uygulamamızda oynatılmasını istemiyoruz. Biz; Flash ile yapılmış chart nesneleri ile etkileşim kurmak istiyoruz. Biz istiyoruz ki; bu flash grafiklerine istediğimiz kadar seri ekleyelim, renkleri ile oynayalım, değerlerini runtime sırasında istediğimiz gibi değiştirebilelim. Eğer, HTML + XML + JavaScript birlikteliğinden faydalanacağım derseniz; o zaman ActionScript ile yapacağımız küçük modifikasyonlara ihtiyacınız olmayacağı gibi TShockWaveFlash ActiveX’ine de ihtiyaç duymayacaksınız. Ancak bu sefer de TWebBrowser nesnesini kullanmak durumunda kalacaksınız.

    İlgili ürünleri satın aldığınızda, yada trial versiyonlarını indirdiğinizde makinanızda bu ürünlerle ilgili detaylı malümatları bulabileceksiniz. Genel olarak; Flash chart kütüphanesi; HTML içinde yazılmış olan JavaScript kodları vasıtası ile chart nesnesini oluşturuyor ve makinanızdaki bir XML dosyayı da veri kaynağı olarak kullanıp görseli hazırlıyor. Sizin tercihiniz bu yönde olacak ise; ActionScript ile ilgili kısmı atlayarak direkt kodlamaya geçebilirsiniz.

    Öncelikle, neden Action Script ile var olan flash nesnesi üzerinde değişiklik yapma ihtiyacı hissettiğimi anlatmaya çalışayım. Benim tercihimde, HTML, XML, JavaScript seçenekleri olmadığı için, elimde kalan tek seçenek Delphi üzerinde TShockWaveFlash nesnesi aracılığı ile flash chart’ı göstermekten ibaretti. Ancak bu durumda, ilgili chart nesnesinin üzerinde çalışma anında değişiklik yapma ihtiyacı bende soru işaretleri oluşturmuştu. HTML ve JavaScript ile ilgili; JavaScript kütüphaneleri sayesinde chart nesnesini oluşturabiliyor ve tüm public property’lerini kullanabiliyordum. Ancak bunu Delphi’den nasıl yapacaktım ? Örneğin; yukarıda gördüğünüz flash animasyonundaki silindirin 50 olan değerini çalışma anında nasıl arttıracak yada azaltacaktım ? Bu, sorunun birinci boyutu idi. İkinci sorun ise; bu chart nesnesinde önemli olmayan ama diğer chart nesnelerinde(column chart, line chart, area chart, pie chart vb.) son derece önemli olan mouse ile tıklama event’inin yakalanması idi. Bu özellikte; özet bilgilerin sunulduğu bir grafikten detay bir grafik raporunun çıkartılması için önemli olacaktı.

    Oysa benim elimde sadece TShockWaveFlash nesnesi vardı ve imkanlarım son derece kısıtlı idi. Bu sebepler ile ActionScript ile tanışmaya karar verdim ve son derece küçük ama bir o kadar da güçlü olan bir action script kodu ile sorunlarımın üstesinden gelebildim. Artık; Delphi’den flash içinde oluşturulmuş nesnelere ulaşabiliyor, public property’lerini istediğim değerler ile kullanabiliyordum. Ayrıca; Flash içinde yapılan mouse tıklamalarını da Delphi’de yakalayabiliyor ve hazırlamam gereken detay raporları bu sayede hazırlayabiliyordum.

    Eğer hazırsanız; Action Script’te ne gibi bir değişiklik yaptığımı göstereyim:

    actionscript_1

    Resimde gördüğünüz gibi; Yuzde isminde bir sayısal değişken tanımladık ve _root ana action script nesnesinin watch metodu ile bu değişkenin(Yuzde) her değişiminde OnYuzde isimli metodun çağrılması gerektiğini ifade ettik. OnYuzde metodunda ise; chart nesnesinin setData metodu ile yeni geçilen değerin chart’ta gösterilmesini sağladık. İşleyişte; Delphi TShockWaveFlash nesnesinin SetVariable metodu sayesinde Yuzde isimli değişkene ulaşabilecek ve değerini değiştirebilecektir. Bu değişkenin değerinin değişmesi; Chart’ın yeni vereceğimiz değer ile yeniden çizilmesi anlamına gelecektir.

    ActionScript kodumuzu yazdıktan sonra; Macromedia Flash Professional yazılımında açtığımız fla dosyamızı, Test Movie menüsü vasıtası derliyor ve swf dosyası oluşturuyoruz. Artık oluşan bu swf dosyasını Delphi altından kullanmaya hazırız. Buyrun biraz da Delphi kodu görelim:

      TCustomFusionChart = class(TComponent)
      private
        fFlash : TShockwaveFlash;
        fFileName : String;
      public
        constructor Create(const AFlash : TShockwaveFlash; const AFileName : String); virtual;
    
        function ToXML(AEncode : Boolean = true) : String; virtual;
        procedure Render; virtual;
     
        property Flash : TShockwaveFlash read fFlash;
      end;
    
      TFusionChartCylinder = class(TCustomFusionChart)
      private
        fSurfaceColor,
        fBackgroundColorFrom,
        fBackgroundColorTo,
        fFontColor : TColor;
    
        fMin,
        fMax,
        fFontSize,
        fValue  : Integer;
    
        function GetColorValues(Index : Integer) : TColor;
        procedure SetColorValues(Index : Integer; const AValue : TColor);
    
        function GetIntegerValues(Index : Integer) : Integer;
        procedure SetIntegerValues(Index : Integer; const AValue : Integer);
      public
        constructor Create(const AFlash : TShockwaveFlash; const AFileName : String); override;
        function ToXML(AEncode : Boolean = true) : String; override;
    
        property SurfaceColor         : TColor  index 0 read GetColorValues write SetColorValues;
        property BackgroundColorFrom  : TColor  index 1 read GetColorValues write SetColorValues;
        property BackgroundColorTo    : TColor  index 2 read GetColorValues write SetColorValues;
        property FontColor            : TColor  index 3 read GetColorValues write SetColorValues;
    
        property Min                  : Integer index 0 read GetIntegerValues write SetIntegerValues;
        property Max                  : Integer index 1 read GetIntegerValues write SetIntegerValues;
        property FontSize             : Integer index 2 read GetIntegerValues write SetIntegerValues;
        property Value                : Integer index 3 read GetIntegerValues write SetIntegerValues;
      end;
    
    implementation
    
    function URLEncode(const Value: String): String;
    var
      iCounter : Integer;
    begin
      Result := '';
    
      for iCounter := 1 to Length(Value) do
      begin
        if Value[iCounter] in ['A'..'Z', 'a'..'z', '0'..'9', 'ı', 'ğ', 'ü', 'ş', 'ö', 'ç', 'İ', 'Ğ', 'Ü', 'Ş', 'Ö', 'Ç', '-', '=', '&', ':', '/', '?', ';', '_', '.']
        then Result := Result + Value[iCounter]
        else Result := Result + '%' + IntToHex(Ord(Value[iCounter]), 2);
      end;
    end;
    
    
    function ColorToStr(const Color : TColor) : String;
    var
      R,
      G,
      B   : Byte;
      ref : TColorRef;
    begin
      ref := ColorToRGB(Color);
    
      R := GetRValue(ref);
      G := GetGValue(ref);
      B := GetBValue(ref);
    
      Result := IntToHex(R, 2) + IntToHex(G, 2) + IntToHex(B, 2);
    end;
    
    { TCustomFusionChart }
    
    constructor TCustomFusionChart.Create(const AFlash: TShockwaveFlash; const AFileName : String);
    begin
      inherited Create(nil);
    
      fFlash := AFlash;
      fFileName := AFileName;
    
      fFlash.StopPlay;
      fFlash.Movie := fFileName;
    end;
    
    function TCustomFusionChart.ToXML(AEncode : Boolean): String;
    begin
    end;
    
    procedure TCustomFusionChart.Render;
    begin
      fFlash.FlashVars := 'dataXML=' + ToXML;
      fFlash.Play;
    end;
    
    { TFusionChartCylinder }
    
    constructor TFusionChartCylinder.Create(const AFlash: TShockwaveFlash; const AFileName : String);
    begin
      inherited Create(AFlash, AFileName);
    
      fSurfaceColor        := $887766;
      fBackgroundColorFrom := $FFFFFF;
      fBackgroundColorTo   := $FFFFFF;
      fFontColor           := clBlack;
    
      fMin                 := 0;
      fMax                 := 100;
      fFontSize            := 12;
      fValue               := 0;
    end;
    
    function TFusionChartCylinder.GetColorValues(Index: Integer): TColor;
    begin
      case Index of
        0 : Result := fSurfaceColor;
        1 : Result := fBackgroundColorFrom;
        2 : Result := fBackgroundColorTo;
        3 : Result := fFontColor;
      end;
    end;
    
    procedure TFusionChartCylinder.SetColorValues(Index: Integer;
      const AValue: TColor);
    begin
      case Index of
        0 : fSurfaceColor         := AValue;
        1 : fBackgroundColorFrom  := AValue;
        2 : fBackgroundColorTo    := AValue;
        3 : fFontColor            := AValue;
      end;
    end;
    
    function TFusionChartCylinder.GetIntegerValues(Index: Integer): Integer;
    begin
      case Index of
        0 : Result := fMin;
        1 : Result := fMax;
        2 : Result := fFontSize;
        3 : Result := fValue;
      end;
    end;
    
    procedure TFusionChartCylinder.SetIntegerValues(Index: Integer;
      const AValue: Integer);
    begin
      case Index of
        0 : if (AValue < Max) then fMin := AValue;
        1 : if (AValue > Min) then fMax := AValue;
        2 : fFontSize := AValue;
        3 : begin
              fValue := AValue;
    
              if Flash <> nil then
                Flash.SetVariable('Yuzde', IntToStr(fValue));
            end;
      end;
    end;
    
    function TFusionChartCylinder.ToXML(AEncode : Boolean): String;
    const
      XML =
          '<chart bgColor="%BGCOLORFROM%,%BGCOLORTO%" bgAlpha="100,100" ' +
          'lowerLimit="%MIN%" upperLimit="%MAX%" cylFillColor="%SURFACECOLOR%" ' +
          'ticksOnRight="0" baseFont="Tahoma" baseFontColor="%FONTCOLOR%" baseFontSize="%FONTSIZE%" cylRadius="45">' +
          '<value>%VALUE%</value>' +
          '</chart>';
    begin
      Result := XML;
    
      Result := StringReplace(Result, '%BGCOLORFROM%' , ColorToStr(BackgroundColorFrom)     , [rfReplaceAll]);
      Result := StringReplace(Result, '%BGCOLORTO%'   , ColorToStr(BackgroundColorTo)       , [rfReplaceAll]);
      Result := StringReplace(Result, '%SURFACECOLOR%', ColorToStr(SurfaceColor)            , [rfReplaceAll]);
      Result := StringReplace(Result, '%FONTCOLOR%'   , ColorToStr(FontColor)               , [rfReplaceAll]);
      Result := StringReplace(Result, '%MIN%'         , IntToStr(Min)                       , [rfReplaceAll]);
      Result := StringReplace(Result, '%MAX%'         , IntToStr(Max)                       , [rfReplaceAll]);
      Result := StringReplace(Result, '%FONTSIZE%'    , IntToStr(FontSize)                  , [rfReplaceAll]);
      Result := StringReplace(Result, '%VALUE%'       , IntToStr(Value)                     , [rfReplaceAll]);
    
      if AEncode
      then Result := URLEncode(Result);
    end;
    

    Yukarıdaki kod bloğunu açıklamaya geçmeden evvel; kullanımı hakkında da kısa bir örnek vermek istiyorum müsaadeniz ile;

    var
      FusionChart : TCustomFusionChart;
    ..
    ..
    ..
    procedure TForm1.FormCreate(Sender : TObject);
    begin
      FusionChart := TFusionChartCylinder.Create(ShockwaveFlash1, 'c:\Cylinder.swf');
      with TFusionChartCylinder(FusionChart) do
      begin
        BackgroundColorFrom := clSkyBlue;
        BackgroundColorTo := clGray;
        SurfaceColor := clRed;
        Value := 50;
        Render;
      end;
    end;
    
    // SpinEdit1 TSpinEdit türünde sayısal bilgi girilebilen bir component'tir.
    procedure TForm1.btnChangeValueClick(Sender : TObject);
    begin
      if FusionChart <> nil then
        TFusionChartCylinder(FusionChart).Value := SpinEdit1.Value;
    end;
    

    Bu örneğimiz hangi değeri girerseniz o değer ile chart’ı ekranda gösterecektir. Kodumuzda bir kaç can alıcı nokta bulunmaktadır. Bunlardan en önemlisi; çalıştırılması istenen flash dosyasının(swf uzantılı dosya), TShockWaveFlash nesnesinin Movie property’sine atanmasıdır. İkinci önemli kısım; TCustomFusionChart sınıfımızın Render metodundaki FlashVars özelliğidir. TShockWaveFlash nesnesine ait olan bu özellik, flash kaynak kodunda erişime haiz global değişkenlerin değerlerini güncellemek için istifade ettiğimiz mühim bir özelliktir. Flash chart nesnesi; tasarlanış amacına uygun bir şekilde chart’ı ekranda gösterebilmek için bizden XML formatında bilgi beklemektedir. XML formatındaki bu bilgiyi virtual olarak tanımlanmış ve TCustomFusionChart sınıfını miras alan tüm sınıflarda ToXML metodunu ezerek içine yazdığımız kodlar ile sağlıyoruz. ToXML metodunun içinde tanımlı olan XML formatı, her chart’a göre değişiklik arz eden bir yapı. Fusion Charts bileşenlerini indirdiğinizde, bu formatların detayları hakkında malümata sahip olabilirsiniz.

    TFusionChartCylinder nesnesinin Value property’sinin değerinin değiştirilmesi; Flash.SetVariable(‘Yuzde’, IntToStr(fValue)); kodunu çağıracak, böylece ActionScript içinde tanımladığımız Yuzde ismindeki değişkenin değeri değişmiş olacak ve bu değişim chart’ın görselliğinin güncellenmesi ile nihayete erecektir.

    Görüldüğü üzere, örneğimizde HTML + XML + JavaScript bağımlılığını hiç kullanmadık. ActionSctipt içine yazdığımız küçük kod sayesinde bu dosyalara ihtiyaç duymadan programımız içinden dinamik olarak chart değerlerini değiştirebildik. Ancak hâla bir bağımlılığımız söz konusu. Bu da swf dosyasına bağımlılık. Programlarımızı kullanacak olan kullanıcılarımızın, ihtiyaç duyduğumuz dosyaları silmesi ve dolayısı ile programlarımızın hatalı çalışmasının önüne geçilmesi adına bağımlılıkları minimize etmekte büyük yarar olduğu kanaatindeyim. Peki ya ihtiyacımız olan swf dosyası bir şekilde silinirse ?

    O zaman raporlama aracımız hizmet veremeyecektir. Peki bundan kurtulmanın yolu nedir diye sorulursa eğer, sizde benim gibi, SWF dosyasını bir resource olarak Delphi içine derleyebilir ve bu dosyanın aradığınız klasörde olmaması durumunda resource’dan okuyup dışarı çıkartabilirsiniz. Yada yine benim yaptığım gibi, resource’da sakladığınız swf dosyasını dışarı çıkartmaz; bir stream olarak TShockWaveFlash nesnesi içine yükleyebilirsiniz ;) Bu kısımlarını siz değerli okuyucularımın araştırmalarına bırakmak istiyorum. Ancak nasıl yapılacağı hususunda bir malümat bulamaz iseniz, sizlere yardımcı olmaktan da mutluluk duyarım.

    Son bir eklenti yapmak istiyorum. O da column chart, pie chart, area chart gibi chart nesnelerindeki mouse tıklamalarının Delphi tarafından nasıl yakalacağı hususunda olacak. Bunun için de yine ActionScript’ten istifade edeceğiz. ActionScript’te fscommand isminde bir metod var. Bu metod, flash ile dış dünyayı haberdar etmek için tasarlanmış bir metod. Flash içinde fsCommand(“Selam”, “Delphi”); şeklinde bir çağrım yapılması; Delphi tarafında TShockWaveFlash nesnesinin OnFsCommand event’inin tetiklenmesi ile sonuçlanacaktır. Örneğin:

    procedure TForm1.ShockwaveFlash1FSCommand(ASender: TObject; const command,
      args: WideString);
    begin
      Memo1.Lines.Add('Command:' + command + '-> args:' + args);
      // command = Selam
      // args = Delphi
    end;
    

    Not: Bir ipucu olarak belirtmek isterim ki; Fusion kütüphanesi chart nesneleri üzerindeki mouse tıklamalarını Delphi’den yakalayabilmek için Utils.as dosyası içindeki invokeLink isimli metoda aşağıdaki gibi bir kod yazmalı ve fla dosyalarını yeniden derleyerek swf dosyası haline getirmelisiniz:

    if (strLink.charAt(0).toUpperCase() == "D" && strLink.charAt(1).toUpperCase() == "E" && strLink.charAt(2).toUpperCase() == "L" && strLink.charAt(3).toUpperCase() == "P" && strLink.charAt(4).toUpperCase() == "H" && strLink.charAt(5).toUpperCase() == "I" )
    {
      fscommand(strLink, "");
    }
    

    Pie Chart, Column Chart vb chart nesneleri için XML dosya oluştururken link isimli bir parametreye değer olarak benim yaptığım gibi DELPHI geçerseniz ve yukarıdaki kodu da ilgili yere yazıp fla dosyasını derlerseniz, Flash içindeki mouse tıklamalarını da Delphi altından rahatlıkla yakalayabilirsiniz ;)

    Saygılar, sevgiler..

    “Delphi & Animated Flash Charts(Fusion Charts)” için 20 Yorum

    1. Özkan Danacı diyor ki:

      vayy. işte beklenen makale.
      Eline sağlık abi. Allah razı olsun.. Hazır benim proje de deneme aşamasında. bundan sonraki işimlerimin arasına bu chartlarla çalışmak da olsun bari.
      Ben bunu kullanırım ama. ;)

    2. sadettinpolat diyor ki:

      bi yazi ile ilgili olarak bir iyi bir de kotu yonde yorumum olacak. once iyisinden baslayayim :)

      yine her zaman ki gibi egitici ve ogretici bir yazi olmus. degisik teknolojilerle delphiyi haberlestirmek (flash , javascript vs. ) hep ilgi odagimda olmus konulardir ve delphinin gucunu yeri ve zamani geldiginde bu tip teknolojilerle zirve yaptirmak her programcinin bilmesi gereken onemli bir konudur. javascript – delphi , delphi – javascript , flash – delphi , delphi – flash etkilesimlerini birkac yazidir nasil yapabilecegimiz tugrul hocamiz saolsun en detayina kadar bizlere anlatti. tekrardan tesekkur ediyoruz.

      gelelim kotu yonde yoruma. aslinda kotu demek de pek istemedim katilmadigim desem daha dogru olur sanirim :)

      eger delphi ile yazilmis bir uygulamada grafiklere ihtiyacimiz varsa onceligimiz kesinlikle bu makalede anlatilan urun olmamali. delphi icin gelistirilmis teechat gibi , tms nin Advanced Chart i gibi urunler olmali. daha az problem yasayacaginiz , daha az zamanda daha cok isler basarabileceginiz urunleri tercih etmekte fayda var. mecbur kalmadikca bu sekilde bir yol izlemenin faydali olacagini dusunuyorum.

      son not olarak teechart acik kaynak kodlu ve bedava bir urun degil malesef. delphi ile birlikte teechartin standart surumu dagitiliyor siteyen urunun sitesinden pro versiyonunu da satin alabilir.

    3. Tuğrul HELVACI diyor ki:

      Özkan: Allah cümlemizden razı olsun özkancım. Kullanasın diye anlattım ;)

      Sadettin: Rica ederim üstad, dilim döndüğünce anlatmaya çalışıyorum ama arada anlatımlar sırasında senin de tespit ettiğin gibi hatalarımız da oluveriyor. TeeChart’ın open source olduğunu söylerken ben, bendeki TeeChart’ı kastetmiştim :) Ama öyle anlaşılmıyor tabii :) Source’u olmayan component kullanabilmem için benim o component’in havada 4 salvo atması gerekiyor :)

      TeeChart ve TMS tercihlerine gelince, senin de dediğin gibi bir tercih meselesi. Ben arkadaşlara şu daha iyidir bunu tercih edin demedim, ama dediysem de yine bir hata ürünüdür, affola ;)

    4. Olcay DAĞLI diyor ki:

      Grafik komponentlerindeki estetik sorunu delphide en büyük sıkıntılarımdan biri olmuştur hep. Sayende güzel bir grafik toolunuda öğrenmiş olduk hocam. Eline emeğine sağlık…

    5. Tuğrul HELVACI diyor ki:

      Rica ederim Olcay, iyi günlerde kullanmayı nasip etsin Allah.

    6. Fatih BADUR diyor ki:

      Tuğrul Tebrikler farklı bakış açılarıyla Delphinin gücünü ve programcılığın sadece basit componentleri kullanmadanda yapılabileceğini bir kez daha kanıtladın.

      Tebrikler.

    7. Tuğrul HELVACI diyor ki:

      Seni burada görmek memnuniyet verici Fatih abi, hoşgeldin.

    8. Anonymous diyor ki:

      Merhabalar,
      Özenli yazının için teşekkürler, ancak Infosoft un sitesine baktığınızda:
      http://www.fusioncharts.com/Licensing.asp
      * Source code is available to non-competing developers. Permission is NOT given to recompile the source code and redistribute it as a competing product that has the same use as the original FusionCharts source code

      * None of the above licenses can be used to embed FusionCharts as a part of your free/commercial product. You’ll need to purchase an OEM license for that purpose. Please contact us at sales@fusioncharts.com to get more information on this.

      Bu iki maddeyi açıkça ihlal ediyor/ihlal edilmesinin yolunu anlatıyorsunuz,

      Bu yazılımın geliştiricisi olsanız ve yazılımınızın kaynak kodları izin vermediğiniz halde değiştirilse, üstüne üstlük web de kullanıllmak üzere lisansladığınız doslyalar perakende uygulamalar ile dağıtılsa ne yapardınız?

      Tabii bu yazıyı uygulayacakların bu ürünü 499 USD ödeyerek satın aldıklarını varsayıyoruz :)

      • Tuğrul HELVACI diyor ki:

        Merhaba yorumunuza teşekkürler. Açıkçası ben lisanslamasında belirttiği koşullarla ilgilenmiyorum. Açık kaynak kodu ile dağıtılan bir ürünün kaynak kodlarında değişiklik yapılmaması maddesinin ne kadar gerçeği yansıtacağını da pek anlayamadım. Lâkin, bizim burada amacımız insanları illegal yollara teşvik etmek değil. İnternette pek çok kaynakta, atom bombasının nasıl yapılacağını anlatan makaleler var, bu makalelerin yazarları bilimselliğe vurgu mu yaparlar yoksa insanları terörizme mi sevkederler ?

        Bu düşünceler birer bakış açısıdır. Bu sitenin ve dolayısı ile benim amacım, insanlara birşeyleri izah etmekten, bilgilerimi paylaşmaktan ibarettir.

        Dipnot: Açık kaynak kodlu satın aldığım her türlü ürünün kaynak kodlarını lisans şartnamesinde aksi belirtilmiş olsa dahi değiştiririm. Bunun aksi; bir yazılımcı olarak bana hiç manidar gelmiyor. Açık kaynak kodu ile satılan ürünler kaynak kodsuz hallerine göre daha yüksek bedelle satıldıklarına göre, satın alan kullanıcılar yani bizler kaynak kodu da satın alıyoruz demektir. Bu durumda tasarrufu bana ait olan bir şey hakkında başkalarının hak iddia etmesi durumu hasıl oluyor.

        Burada lisans şartnamesinde yazıyor o halde almamalıydınız gibi bir düşünce hasıl olabilir, daha derin meselelere girip konuyu uzatmanın bir alemi olmadığı inancındayım. Burada birilerine yararlı olmak için uğraşıyorum. Başka bir hedefim yahut amacım söz konusu dahi değildir.

    9. sadettinpolat diyor ki:

      ben burda bahsedilen urunun kaynak kodu degistirilmis halini goremiyorum ve de indiremiyorum. burda bir yol tarifi yapilmis. yasal olmayan bir binary dosyanin dagitimi yapilmamis. urunlerin ozel lisanslari olabilir. uzerinde her turlu degisikligi yapabildiginiz. belki bu tur lisansa sahip olmak isteyen kullanicilar vardir ve bu sekilde kullanabilirler.
      ayrica bu tur yazilar yasal olmasa binlerce sitede gerek c++ , gerek java gerek c#gibi onlarca dilin olusturmus oldugu binary dosyalarin nasil decompile edilebilecegini anlatan makalaer mevcut. hatta decompile eden programlar gayet yasal bir sekilde satisa sunuluyor. onemli olan bilgiyi hangi amac icin kullandiginiz.

      saygilar…

    10. ahb diyor ki:

      Tuğrul bey,
      Bir güzellik yapıp bir de FusionMaps için bir örnek hazırlayıp paylaşabilirseniz seviniriz.
      Teşekkürler,
      Kolay gelsin…

      • Tuğrul HELVACI diyor ki:

        Hazırlarım hazırlamasına da Fusion Charts’dan pek bir farkı yok ki onun da. Bu makaledeki malümatlar ile Fusion Maps konusunu da aşacağınıza inanıyorum. Ancak yaşadığınız bir sıkıntı varsa, bende deneyerek yardımcı olmaya çalışabilirim.

    11. ahb diyor ki:

      üstad fla dosyasının içinde yapılacak olan değişikliği yazabirsen hallederiz herhalde kusara bakma biraz amatörüzde ondan dolayı …

      • Tuğrul HELVACI diyor ki:

        Estağfirullah, tam olarak ne yapmak istediğinizi belirtebilirseniz eğer bende deneyebilirim. Mouse click olaylarını delphi tarafından yakalamak mı istediğiniz ?

    12. ahb diyor ki:

      evet aynen öyle fusionmaps ve fusioncharts ile bir seçim sonuçlarını gösterme ve analiz etmeye yönelik bir uygulama yapmayı planlıyorum veriler MSSQL’de bulunuyor zaten kolay gelsin
      teşekkürler

      • Tuğrul HELVACI diyor ki:

        Map.as dosyası içindeki invokeLink isimli metoda makalemizin sonlarında belirttiğim eklentiyi yaptıktan sonra ilgili fla dosyasını derleyip swf’ye çevirirseniz istediğiniz sonuca ulaşabilirsiniz.

    13. bayrak diyor ki:

      çok yararlı olmuş

    14. metehan diyor ki:

      çok teşekkürler

    15. ikaan diyor ki:

      proje kaynak kodlarını verebilirmisiniz. Flash dosyasız olarak teşekkürler

    16. Fahri ÇAKAR diyor ki:

      Çok sağolun, emeğinize sağlık, faydalı bir yazıydı yine.

    ahb için yorum yazın