الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

التطبيقات متعددة الطبقات N-tier طريقة Data Access --> Business --> PresentationI

بدأه زكيري عبد العالي في 29 يوليو 2008 · 33 رد · 9,636 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#26

السلام عليكم

اخيرا وجدت الحل و الحمد لله

الفكرة هي انشاء خاصية او حقل داخل كلاس من نوع arry لعناصر كلاس الاولى وبذلك يمكن عمل ارث لTRemotable للكلاس الثانية .

مثال توضيحي

اسمية الكلاس الاولى TMyclass

TMyclass = class (TRemotable)
  private
    FMyproperty: string;
  published
    property Myproperty: string read FMyproperty write FMyproperty;
  end;

انشأت قاءمة ابجكة من نوع الكلاس الاولى و المتمثلة في جدول

  TArray = array of TMyclass;

انشأت الكلاس الثانبة و التئ من المفروض هى التي تكون القاءمة

TMyListOfMyclass = class(TRemotable)
  private
    Fitms: TArray;
  published
    property itms : TArray read Fitms write Fitms;
  end;

service.rar

تم تعديل هذه المشاركة بواسطة زكيري عبد العالي في 25 مارس 2010 في 18:05

#27
زكيري عبد العالي كتب:

السلام عليكم

اخيرا وجدت الحل و الحمد لله

مشكور استاذنا دكيري . اذا علينا القيام بمشروع بهذه الطريقة . مارأيك

تم تعديل هذه المشاركة بواسطة طلال بلال في 26 مارس 2010 في 00:52

1
#28

اهلا اخي طلال

نعم هذا هو االاهم لان بالمشاريع نستكشف اشاء جديده

لان الان نريد من الاخو تجربة الكود و اعادت كتابة المثال بالشكل المطلوب .

و ابدا انت اخي طلال في تصيحي المثال المرفق في الموضوع الاول و حعله مثل المثال الاخير .

و سنر ى تفاعل الاخوة اولا .

شكرا

#29

انا سأ بدأ بالتجربة حالا

1
#30

السلام عليكم

لقد نجحة الفكرة 100% و الحمد لله بقي ان اجرب استعمال لغة اخرى على مستوى طبقة العرض و ساجرب مع البريسم و السي شارب ان شاء الله .

هذه صورة توضيحة على ما توصلت اليه و مع السورس كود .

----------

اهلا اخي امين جاري قراءت كودة و طريقتك و شكرا على المتابعة في هذا الموضوع .

ننتضر تدخل الكبار :wacko: الاستاذ عروة و الاستاذ محمد نسمان .

بالتوفيق و ان شاء الله سنعمل داءما معا لنقل مبرجين الدلفي من الخمول فب البرمجة الكلاسكية الى برمجة افضل و الان ساحضر درس تابع حول استعمال الادوات الجديدة ل datasnap في استعمال له في مشاريع 3-tier

شكرا .

3-Tier.rar

post-1034-12699486222026_thumb.jpg

تم تعديل هذه المشاركة بواسطة زكيري عبد العالي في 30 مارس 2010 في 18:40

#31

هناك مشكلة عندما اردت استراد الوظيفت FetchAll في الدوت نت

<definitions name="Iserviceservice" targetNamespace="http://tempuri.org/">

  <types>

    <xs:schema targetNamespace="urn:UPersoCollection">

      <xs:complexType name="TpersoCollection">

        <xs:sequence>
          <xs:element name="itms" type="ns1:TArray"/>
        </xs:sequence>
      </xs:complexType>

      <xs:complexType name="TArray">

        <xs:complexContent>

          <xs:restriction base="soapenc:Array">
            <xs:sequence/>
            <xs:attribute ref="soapenc:arrayType" n1:arrayType="ns2:Tperso[]"/>
          </xs:restriction>
        </xs:complexContent>
      </xs:complexType>
    </xs:schema>

    <xs:schema targetNamespace="urn:Uperso">

      <xs:complexType name="Tperso">

        <xs:sequence>
          <xs:element name="ID_Perso" type="xs:int"/>
          <xs:element name="Nom_Perso" type="xs:string"/>
          <xs:element name="Prenom_Perso" type="xs:string"/>
          <xs:element name="Age_Perso" type="xs:int"/>
        </xs:sequence>
      </xs:complexType>
    </xs:schema>
  </types>
  <message name="FetchAll0Request"/>

  <message name="FetchAll0Response">
    <part name="return" type="ns1:TpersoCollection"/>
  </message>

  <message name="getperso1Request">
    <part name="iperso" type="ns2:Tperso"/>
  </message>

  <message name="getperso1Response">
    <part name="return" type="ns2:Tperso"/>
  </message>

  <portType name="Iservice">

    <operation name="FetchAll">
      <input message="tns:FetchAll0Request"/>
      <output message="tns:FetchAll0Response"/>
    </operation>

    <operation name="getperso">
      <input message="tns:getperso1Request"/>
      <output message="tns:getperso1Response"/>
    </operation>
  </portType>

  <binding name="Iservicebinding" type="tns:Iservice">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

    <operation name="FetchAll">
      <soap:operation soapAction="urn:serviceIntf-Iservice#FetchAll" style="rpc"/>

      <input>
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:serviceIntf-Iservice"/>
      </input>

      <output>
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:serviceIntf-Iservice"/>
      </output>
    </operation>

    <operation name="getperso">
      <soap:operation soapAction="urn:serviceIntf-Iservice#getperso" style="rpc"/>

      <input>
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:serviceIntf-Iservice"/>
      </input>

      <output>
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:serviceIntf-Iservice"/>
      </output>
    </operation>
  </binding>

  <service name="Iserviceservice">

    <port name="IservicePort" binding="tns:Iservicebinding">
      <soap:address location="http://webdev1:8083/Mywebservice.dll/soap/Iservice"/>
    </port>
  </service>
</definitions>

هذا الملف الناتج عن الويب سرفيس

و عندما كتبت ب c# الكود التالي

 private void button1_Click(object sender, EventArgs e)
        {
            Iserviceservice oservice = new Iserviceservice();
            Tperso[] ms = oservice.FetchAll().itms;
            int i = ms.Count();
            MessageBox.Show(Convert.ToString(i));
        }

طبعا بعد اضافة client wsdl

حدث خطأ

وكانه لم يفهم XML

post-1034-12700288397062.jpg

تم تعديل هذه المشاركة بواسطة زكيري عبد العالي في 31 مارس 2010 في 23:23

#32

السلام عليكم

أسف لتأخري في المشاركة في الموضوع، لكن لظروف كثيرة لم أستطع المتابعة معكم.

ونظرا لعدم مشاركتي في الموضوع بشكل متواصل فسوف أقوم بطرح مثال مبسط للويب سيرفس بدلاً من تعديل المثال الحالي، وفي حال وجدت بعض الوقت في الفترة القادمة سوف أحدث المثال،

بالنسبة للويب سيرفس كما ذكرت سابقا حتى تستخدم أي صنف يجب ان تكون مشتقة من TRemotable، اما بالنسبة إذا أردت ان تقومو بإرجاع مجموعة من الصنف فلا يمكن إستخدام ال TList كما تم إستخدامها سابقاً، وأفضل طريقة هي إستخدام مصفوفة من نوع الصنف المراد إستخدامه، لنفترض أن لدي صنف خاص ببيانات موظف وأريد إرجاع موظف حسب رقمه أو قائمة بجميع الموظفين فيمكن ذلك كالتالي:

1. في ملف التعريف

type
  TEmployee = class(TRemotable)
  private
    FEmpSalary: Double;
    FEmpAddr: string;
    FEmpName: string;
    FEmpID: Integer;
  published
    published
      property EmpID    : Integer read FEmpID write FEmpID;
      property EmpName  : string read FEmpName write FEmpName;
      property EmpAddr  : string read FEmpAddr write FEmpAddr;
      property EmpSalary: Double read FEmpSalary write FEmpSalary;
  end;

  TEmployees = array of TEmployee;

  { Invokable interfaces must derive from IInvokable }
  IEmpService = interface(IInvokable)
  ['{C410A928-4696-4F0F-A154-169AD82C224E}']

    function GetEmployee(EmpID:Integer):TEmployee;stdcall;
    function GetAllEmployees:TEmployees;stdcall;
  end;

ومن ثم في ملف ال Implementation:

  { TEmpService }
  TEmpService = class(TInvokableClass, IEmpService)
  public
    function GetEmployee(EmpID:Integer):TEmployee;stdcall;
    function GetAllEmployees:TEmployees;stdcall;
  end;

implementation

{ TEmpService }

function TEmpService.GetAllEmployees: TEmployees;
var
  Emp : TEmployee;
begin
  // I want to return only two employees
  SetLength(Result,2);
  Emp := TEmployee.Create;
  Emp.EmpID := 1;
  Emp.EmpName := 'Mohammed';
  Emp.EmpAddr := 'Palestine';
  Emp.EmpSalary := 99.9;
  Result[0] := Emp;
  Emp := TEmployee.Create;
  Emp.EmpID := 2;
  Emp.EmpName := 'Ali';
  Emp.EmpAddr := 'KSA';
  Emp.EmpSalary := 199.9;
  Result[1] := Emp;
end;

function TEmpService.GetEmployee(EmpID: Integer): TEmployee;
begin
  Result := TEmployee.Create;
  Result.EmpID := EmpID;
  Result.EmpName := 'Mohammed';
  Result.EmpAddr := 'Palestine';
  Result.EmpSalary := 99.9;
end

;

وضمن برنامج العميل يمكن إستدعائهم كالتالي:

procedure TForm5.btn1Click(Sender: TObject);
var
  Emp: TEmployee;
  WS: IEmpService;
begin
  Emp := TEmployee.Create;
  WS := GetIEmpService();
  Emp := Ws.GetEmployee(1);
  lst1.Items.Add('Adding One Employee');
  lst1.Items.Add(IntToStr(Emp.EmpID));
  lst1.Items.Add(Emp.EmpName);
  lst1.Items.Add(Emp.EmpAddr);
  lst1.Items.Add(FloatToStr(Emp.EmpSalary));

end;

procedure TForm5.btn2Click(Sender: TObject);
var
  Emp: TEmployee;
  Employees: TEmployees;
  WS: IEmpService;
  I: Integer;
begin
  lst1.Items.Add('Adding More Employees');
  WS := GetIEmpService();
  Employees := ws.GetAllEmployees;
    for I := low(Employees) to High(Employees)  do
 // for I := 1 to 2 do
  begin
    Emp := TEmployee.Create;
    Emp := Employees;
    lst1.Items.Add(IntToStr(Emp.EmpID));
    lst1.Items.Add(Emp.EmpName);
    lst1.Items.Add(Emp.EmpAddr);
    lst1.Items.Add(FloatToStr(Emp.EmpSalary));
  end;

بالطبع الكود إستخدمت فيه قيم ثابتة وذلك لتسهيل المثال

وكما ذكرت سابقاً أفضل إستخدام تقنية DataSnap وخاصة مع دلفي 2010 لإنها سوف توفر إطار عمل للبرامج متعددة الطبقات أفضل من الويب سيرفس، كذلك لو إستخدام RemObjects SDK فيمكن بناء برامج متعددة الطبقات أفضل من الدوت نت وحتى من ال WCF،

لا تحزن:

إن كنت فقيرا فغيرك محبوس في دين، وإن كنت لا تملك وسيلة نقل فسواك مبتور القدمين، وان كنت تشكوا من آلام فغيرك يرقدون على الاسرة البيضاء و من سنوات، وان فقدت ولدا فغيرك فقد عددا من الأولاد و في حادث واحد.

لا تحزن:

فأنت تشرب الماء الزلال، و تستنشق الهواء الطلق، و تمشي على قدميك معافى، و تنام ليلك آمنا.

#33

بارك الله فيك اخي محمد انا مشغول بعض الشء و ساجربة ما طرحته لكي اري الفرق .شكرا

علما اني لم اتستطع استخدام اكود الذي كتبته اي الويب سرفيس في الدوت نت . شكرا

#34

السلام عليكم 

اخي طلال هاهي الرابط لكن الموضوع قديم و ربما هناك تحسينات اوطريقة جديد في الدلفي لعمل مشروع N-t

انا اعمل حاليا على c# و HTML5 js  توقفت عن الدلفي منذو وقت 

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…