NativeXml.OnNodeLoaded çalışlmama sorunun hakkında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

NativeXml.OnNodeLoaded çalışlmama sorunun hakkında

Mesaj gönderen adelphiforumz »

S.A.

Aşağıda bir thread içerisinde yaptığım işlerin basit bir kalıbını çıkartmaya çalıştım
Bu kalıp içersinde bulunan
"procedure TDPServis.DoNodeLoaded(Sender: TObject; Node: TXmlNode);"
procedure "delphi 2007" ile program derlendiğinde hiç sorun olmadan çalışıyor
Fakat aynı kodu "Delphi XE7" ile derlediğimde ise hiç bu rutine uğramadan işlem sonlanıyor

Bunun nedeni ne olabilir acaba tanımlamlarda yada sınıf farklılıklarımı mevcut 2 delphi arasında

Konu biraz önemli ve acil durumda yardımcı olabilecek arkadaşlara şimdiden teşekkür derim
iyi çalışmalar

Kod: Tümünü seç

unit untDPServis;

interface

uses Windows, Classes, Controls, Forms, ComCtrls, ActiveX, Graphics, Dialogs, dxmdaset,
  SysUtils, SOAPHTTPClient, StdCtrls, Variants, XMLIntf, XMLDoc, XSBuiltIns,
  Messages,  NativeXml, AdoDb, Rio, SOAPHTTPTrans, Wininet, sStatusBar,
  MSXML;

Type
  TDPServis = class(TThread)
  private
    iIslem : Integer;
    HTTPRIO: THTTPRIO;
    ANativeXml: TNativeXml;
    procedure SynExec;

  public
    bThreadFinish: Boolean;
    bError: Boolean;
    constructor Create(_iIslem: Byte); overload;

    procedure prc_OnThreadTerminate(_Sender: TObject);
    procedure prc_HataOlustu();
    procedure DoNodeLoaded(Sender: TObject; Node: TXmlNode);

    procedure HTTPRIOAfterExecute(const MethodName: string; SOAPResponse: TStream);
    procedure HTTPWebNodeBeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
    procedure prc_FaturaListesi();

  protected
    procedure Execute; override;

  End;

var
  DPServis: TDPServis;

implementation

constructor TDPServis.Create(_iIslem: Byte);

begin
  inherited Create(False);

  bThreadFinish := False;

  iIslem := _iIslem;
  //.......
  //.......
  //.......
  //.......
  //.......

  OnTerminate := prc_OnThreadTerminate;
  FreeOnTerminate := True;
end;

constructor TDPServis.Create(_iIslem: Byte);
begin
  inherited Create(False);

  bThreadFinish := False;

  iIslem := _iIslem;
  //.......
  //.......
  //.......
  //.......
  //.......
  //.......
  OnTerminate := prc_OnThreadTerminate;
  FreeOnTerminate := True;

end;

procedure TDPServis.prc_OnThreadTerminate(_Sender: TObject);
begin
  bThreadFinish := True;
  Application.ProcessMessages;
end;

procedure TDPServis.prc_HataOlustu();
begin
  ShowMessage('..............');
end;

procedure TDPServis.DoNodeLoaded(Sender: TObject; Node: TXmlNode);
var
  FileStream: TextFile;
  XMLDoc: IXMLDomDocument;
  NodeMain : IXMLDomNode;
  XMLText : IXMLDOMText;
  I:Integer;

  procedure prc_NodeToNameAndText(pNode:IXMLDomNode);
  var
    X : Integer;
    Node : IXMLDomNode;
  begin
      Node := pNode;
      while Node <> nil do
      begin
          if Node.childNodes.length > 1 then
            for X := 0 to Node.childNodes.length - 1 do
                prc_NodeToNameAndText(Node.childNodes.item[X]);

          if not( (Node.nodeName = '') and (Node.nodeName = 'Null') ) then
          begin
              Writeln(FileStream, Node.nodeName + '=(' + Trim(Node.text) +')');
          end
          else
              Writeln(FileStream,'---------');

          Node := Node.nextSibling;
      end;
      Writeln(FileStream,' ');
  end;

begin
    if not FileExists(ExtractFileDir(Application.ExeName) +'\'+'Dosya.txt') then
      FileClose(FileCreate(ExtractFileDir(Application.ExeName) +'\'+'Dosya.txt',fmShareDenyNone));

    AssignFile(FileStream,ExtractFileDir(Application.ExeName) +'\'+'Dosya.txt');
    try
      FileMode := fmShareDenyNone;
      Append(FileStream);
      prc_NodeToNameAndText(Node);
    finally
       CloseFile(FileStream);
    end;
end;

procedure TDPServis.HTTPRIOAfterExecute(const MethodName: string; SOAPResponse: TStream);
Begin
  SOAPResponse.Position := 0;
  case iIslem of
    1: ANativeXml.LoadFromStream(SOAPResponse);
  end;
End;


procedure TDPServis.HTTPWebNodeBeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
  TimeOut: Integer;
begin
  TimeOut := 180000;
  InternetSetOption(Data, INTERNET_OPTION_RECEIVE_TIMEOUT, Pointer(@TimeOut), SizeOf(TimeOut));
  InternetSetOption(Data, INTERNET_OPTION_CONNECT_TIMEOUT, Pointer(@TimeOut), SizeOf(5000));
  InternetSetOption(Data, INTERNET_OPTION_SEND_TIMEOUT, Pointer(@TimeOut), SizeOf(TimeOut));
end;

procedure TDPServis.prc_FaturaListesi();
begin
  try
    //.....
    //.....
    //.....
  except
    on e: exception do
    begin
      bError := True;
      Synchronize(prc_HataOlustu);
    end;
  end;

end;

procedure TDPServis.SynExec;
begin
  CoInitializeEx(nil, COINIT_MULTITHREADED);
  try
    HTTPRIO := THTTPRIO.Create(nil);
    HTTPRIO.OnAfterExecute := HTTPRIOAfterExecute;
    HTTPRIO.HTTPWebNode.OnBeforePost := HTTPWebNodeBeforePost;

    ANativeXml := TNativeXml.Create(nil);
    ANativeXml.OnNodeLoaded := DoNodeLoaded;

    case iIslem of
      1: prc_FaturaListesi();
    end;

  finally
    CoUninitialize;
  end;
end;

procedure TDPServis.Execute;
begin
  Synchronize(SynExec);
end;

end.
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: NativeXml.OnNodeLoaded çalışlmama sorunun hakkında

Mesaj gönderen mrmarman »

Kaynak belli olmadığından deneme şansım yok ondan sadece yol gösterebilirim.

Bunu XE7'de bağımsız thread'dan koparıp application'un ana threadinde hayata geçirip denemeni, sonuç aldıktan sonra müstakil bir Thread içine almanı önerebilirim.

Hata neredeyse ancak oradan adımlayarak yakalarsın. Her iki potansiyel sorundan birisini elemen lazım. Öncelikle elenecek unsur Thread olacaktır. Çünkü doğru kurgulanmadığında başka sorunlar varmış gibi bir görüntü sunar.
Resim
Resim ....Resim
Cevapla