Delphi

  • Delphi ile JSon İşlemleri

    https://www.youtube.com/watch?v=WJxg3b_gb7c

    JSON NEDİR?

    Veri saklama formatıdır.

    Veri Saklama ve Transfer Formatları;

    • .csv
    • .xml
    • .json
    • .bson

    Json’ın diğerlerinden farkı;

    Json(JavaScript Object Notation-JavaScript Nesne Notasyonu) insanlar için okunabilir olan bilgi saklama ve alışveriş formatıdır.

  • Delphi ile Stream(Dosya Transferi) İşlemleri

    https://www.youtube.com/watch?v=ntQCqpak9dw

    Mobil cihazda çektiğimiz bir resmi herhangi uzaktaki bir veritabanına kayıt işlemini öğreneceğiz. Datasnap kullanarak uzaktaki MSSQL veritabanına mobil cihazdan çektiğimiz görüntüyü yazacağız.

  • Delphi Rest sunucu performans testleri (MARS , Datasnap Rest , mORMot )

    Merhaba uzun süredir bir rest tabanlı sunucular üzerinde çalışıyorum.

    Delphi tarafında kullanılabilecek sunucuları hızlıca bir test yaptım ve sonuçları buradan paylaşmak istiyorum.

    Testleri aynı rest sunucuya 100.000 isteğin gönderimi ve cevabı dönmesini kapsamkatadır.  Gelen cevap tüm sunucularda aynı {"result":["Hello World"]} şekilinde bir cevap


    Testleri MARS , Datasnap Rest , mORMot  sunucuları üzerinde yaptım aslınde Delphi Web Application server ve Horse server ile de test yaptım fakat onlar testi tamamlayamdılarç

     

    test için hem kütüpanelerin kendi clientlerini  hemde karşılaştırmada kolaylık olması için indy yi kullandım . Aslında Jmetter da deneyecektim fakat ayarlamak için vakit ayıramadım.

     

    Burada mORMot gerçekten çok etkileyici  nodeJs sunucudan bile daha hızlı çıktı.

    testler standart ayarlar üzerinde yapıldı ve performans iyileştirmeleri ile daha yüksek bir seviyeye çıkartılabilir.

     

    umaraım bu konuda çalışmak isteyenlere faydalı olur :)

    Server Name Time (ms) Client Delphi Component
    MARS 76060 MARS OWN COMP
    MARS 136609 Rest Comp
    MARS 75711 Indy Comp
    Datasnap Rest 222667 Rest Comp
    Datasnap Rest 154336 Indy Comp
    mORMot http 13504 mORMot OWN COMP
    mORMot http.sys 34321 mORMot OWN COMP
    mORMot httpwebsocet 13717 mORMot OWN COMP
    moRMot websocet json 6550 mORMot OWN COMP
    mORMot Websocet binary 6818 mORMot OWN COMP
    mORMot http 25788 Indy Comp
    mORMot Websocet binary +aes 7098 mORMot OWN COMP
  • Get the Url of a Hyperlink when the Mouse moves Over a TWebBrowser Document

    The TWebBrowser Delphi component provides access to the Web browser functionality from your Delphi applications.

     

    In most situations you use the TWebBrowser to display HTML documents to the user - thus creating your own version of the (Internet Explorer) Web browser. Note that the TWebBrowser can also display Word documents, for example.

     

    A very nice feature of a Browser is to display link information, for example, in the status bar, when the mouse hovers over a link in a document.

     

    The TWebBrowser does not expose an event like "OnMouseMove". Even if such an event would exist it would be fired for the TWebBrowser component - NOT for the document being displayed inside the TWebBrowser.

     

    In order to provide such information (and much more, as you will see in a moment) in your Delphi application using the TWebBrowser component, a technique called "events sinking" must be implemeted.

     

     

    WebBrowser Event Sink

    To navigate to a web page using the TWebBrowser component you call the Navigate method. The Document property of the TWebBrowser returns an IHTMLDocument2 value (for web documents). This interface is used to retrieve information about a document, to examine and modify the HTML elements and text within the document, and to process related events.

     

    To get the "href" attribute (link) of an "a" tag inside a document, while the mouse hovers over a document, you need to react on the "onmousemove" event of the IHTMLDocument2.

     

    Here are the steps to sink events for the currently loaded document:

     
    1. Sink the WebBrowser control's events in the DocumentComplete event raised by the TWebBrowser. This event is fired when the document is fully loaded into the Web Browser.
    2. Inside DocumentComplete, retrieve the WebBrowser's document object and sink the HtmlDocumentEvents interface.
    3. Handle the event you are interested in.
    4. Clear the sink in the in BeforeNavigate2 - that is when the new document is loaded in the Web Browser.
     

     

    HTML Document OnMouseMove

    Since we are interested in the HREF attribute of an A element - in order to show the URL of a link the mouse is over, we will sink the "onmousemove" event.

     

    The procedure to get the tag (and its attributes) "below" the mouse can be defined as:

     
     var
      htmlDoc : IHTMLDocument2;
    ...
    procedure TForm1.Document_OnMouseOver;
    var
       element : IHTMLElement;
    begin
       if htmlDoc = nil then Exit;
       element := htmlDoc.parentWindow.event.srcElement;
       elementInfo.Clear;
       if LowerCase(element.tagName) = 'a' then
       begin
         ShowMessage('Link, HREF : ' + element.getAttribute('href',0)]) ;
       end
       else if LowerCase(element.tagName) = 'img' then
       begin
         ShowMessage('IMAGE, SRC : ' + element.getAttribute('src',0)]) ;
       end
       else
       begin
         elementInfo.Lines.Add(Format('TAG : %s',[element.tagName])) ;
       end;
    end; (*Document_OnMouseOver*)
    
     

    As explained above, we attach to the onmousemove event of a document in the OnDocumentComplete event of a TWebBrowser:

     
     procedure TForm1.WebBrowser1DocumentComplete(   ASender: TObject;
      const pDisp: IDispatch;
      var URL: OleVariant) ;
    begin
       if Assigned(WebBrowser1.Document) then
       begin
         htmlDoc := WebBrowser1.Document as IHTMLDocument2;
         htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver) as IDispatch) ;
       end;
    end; (*WebBrowser1DocumentComplete*)
    
     

    And this is where the problems arise! As you might guess the "onmousemove" event is *not* a usual event - as are those we are used to work with in Delphi.

     

    The "onmousemove" expects a pointer to a variable of type VARIANT of type VT_DISPATCH that receives the IDispatch interface of an object with a default method that is invoked when the event occurs.

     

    In order to attach a Delphi procedure to "onmousemove" you need to create a wrapper that implements IDispatch and raises your event in its Invoke method.

     

    Here's the TEventObject interface:

     
     TEventObject = class(TInterfacedObject, IDispatch)
    private
       FOnEvent: TObjectProcedure;
    protected
       function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
       function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
       function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
       function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
    public
       constructor Create(const OnEvent: TObjectProcedure) ;
       property OnEvent: TObjectProcedure read FOnEvent write FOnEvent;
       end;
    
     

    Here's how to implement event sinking for a document displayed by the TWebBrowser component - and get the info of a HTML element below the mouse.

     

     

    TWebBrowser Document Event Sinking Example

    Download

     

    Drop a TWebBrowser ("WebBrowser1") on a Form ("Form1"). Add a TMemo ("elementInfo")...

     

    unit Unit1;

    interface

    uses
       Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
       Dialogs, OleCtrls, SHDocVw, MSHTML, ActiveX, StdCtrls;

    type
       TObjectProcedure = procedure of object;

       TEventObject = class(TInterfacedObject, IDispatch)
       private
         FOnEvent: TObjectProcedure;
       protected
         function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
         function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
         function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
         function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
       public
         constructor Create(const OnEvent: TObjectProcedure) ;
         property OnEvent: TObjectProcedure read FOnEvent write FOnEvent;
       end;

       TForm1 = class(TForm)
         WebBrowser1: TWebBrowser;
         elementInfo: TMemo;
         procedure WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool) ;
         procedure WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant) ;
         procedure FormCreate(Sender: TObject) ;
       private
         procedure Document_OnMouseOver;
       public
         { Public declarations }
       end;

    var
       Form1: TForm1;

       htmlDoc : IHTMLDocument2;

    implementation

    {$R *.dfm}

    procedure TForm1.Document_OnMouseOver;
    var
       element : IHTMLElement;
    begin
       if htmlDoc = nil then Exit;

       element := htmlDoc.parentWindow.event.srcElement;

       elementInfo.Clear;

       if LowerCase(element.tagName) = 'a' then
       begin
         elementInfo.Lines.Add('LINK info...') ;
         elementInfo.Lines.Add(Format('HREF : %s',[element.getAttribute('href',0)])) ;
       end
       else if LowerCase(element.tagName) = 'img' then
       begin
         elementInfo.Lines.Add('IMAGE info...') ;
         elementInfo.Lines.Add(Format('SRC : %s',[element.getAttribute('src',0)])) ;
       end
       else
       begin
         elementInfo.Lines.Add(Format('TAG : %s',[element.tagName])) ;
       end;
    end; (*Document_OnMouseOver*)


    procedure TForm1.FormCreate(Sender: TObject) ;
    begin
       WebBrowser1.Navigate('http://delphi.about.com') ;

       elementInfo.Clear;
       elementInfo.Lines.Add('Move your mouse over the document...') ;
    end; (*FormCreate*)

    procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool) ;
    begin
       htmlDoc := nil;
    end; (*WebBrowser1BeforeNavigate2*)

    procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant) ;
    begin
       if Assigned(WebBrowser1.Document) then
       begin
         htmlDoc := WebBrowser1.Document as IHTMLDocument2;

         htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver) as IDispatch) ;
       end;
    end; (*WebBrowser1DocumentComplete*)


    { TEventObject }

    constructor TEventObject.Create(const OnEvent: TObjectProcedure) ;
    begin
       inherited Create;
       FOnEvent := OnEvent;
    end;

    function TEventObject.GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
    begin
       Result := E_NOTIMPL;
    end;

    function TEventObject.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;
    begin
       Result := E_NOTIMPL;
    end;

    function TEventObject.GetTypeInfoCount(out Count: Integer): HResult;
    begin
       Result := E_NOTIMPL;
    end;

    function TEventObject.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
    begin
       if (DispID = DISPID_VALUE) then
       begin
         if Assigned(FOnEvent) then FOnEvent;
         Result := S_OK;
       end
       else Result := E_NOTIMPL;
    end;

    end.

Firma Bilgileri


Camart Araştırma Geliştirme Yazılım Otomasyon San. Tic.Ltd. Şti.

Mersis no : 3356 7133 6775 9746

info@camartarge.com

Vergi Dairse / no : Pamukkale v.d. 196 074 62 30

Tel : +90 850 333 80 20

İban (TL): TR30 0020 5000 0085 3809 5000 03

Arge :

Pamukkale Üniversitesi teknoloji geliştirme bölgesi (Teknokent)

Kınıklı mah. Hüsseyin yılmaz cad. no 67

idari bina d blok no g05 Pamukkale / Denizli

İban (USD):TR03 0020 5000 0085 3809 5001 01


Barbaros Mah. Halk Cad. No 47 / 2 34746 Ataşehir İstanbul

İban (Euro):TR73 0020 5000 0085 3809 5001 02

 
Harita verileri ©2015 Google

İletişim

Facebook Pinterest Twitter Google+ Dribbble