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

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

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

مقدمة :

ان تسيير قاعدة البيانات باستخدام برمجة OOP يعد من ابرز الطرق التي اصبحت شائعة منذو فترة .

فمبرمجين الجافا يستعملون هده الطريقة في محيط برمجه اسمه STRUTS والدي هو أكثر طلبا من معضم الزبائن حاليا مع أدوات HIBERNATE اما برمجي الدوت نت لهم أداة مشابهة أيضا والكل يصب في قالب واحد هو بما يسمي MVC2 او 3-TIER

.

لكن نحن مبرمجي الدلفي لم يسبق لنا ان شاهدنا مشاريع او دروس تتحدث عن هذه الطريقه و بهذا المفهوه حيث حينما نسمع البرمجة متعددت الطبقات نتصور مباشرةا انه مشروع client/server

*-فماهي هده الطريقة

*-ما فائدتها

*- ومتى نستعملها

*-كيف نستعملها في الدلفي و البريسم .

تعريف :

محمد شاآر محمود وهيب البياتي

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

1 طبقة العرض

وهذا هو المستوى الأعلى من التطبيق. طبقة العرض تعرض المعلومات المتعلقة بالخدمات مثل تصفح البضائع، وشراء، ومحتويات عربة التسوق. وتتصل بالطبقات الأخرى عن طريق إخراج النتائج إلى طبقة المتصفح / العميل وجميع الطبقات الأخرى في الشبكة.

2/ طبقة التطبيق (منطق الأعمال / طبقة المنطق)

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

3/ طبقة البيانات

هذه الطبقة تتكون من خوادم قاعدة البيانات. هنا يتم تخزين المعلومات واسترجاعها. هذه الطبقة تحتفظ بالبيانات محايدة ومستقلة من خوادم التطبيقات أو منطق الأعمال. إعطاء البيانات الطبقة الخاصة بها يسهم في تحسين الأداء وتطويره.

ما فائدتها

1- فصل المعالجات على المعطيات

2-التقليل من حجم الملف التنفيدي للمشروع وبدالك السرعة في التنفيد

3-من 1 نتأكد من وجود السرية والامن في المعطياة

4-يمكن وضع كل قسم في سرفر منقصل وهدا يوقينا من تراكم المعطيات في جهاز واحد

5-الصيانة تكون سهلة , فمثلا عند تغيير قاعدة البيانات من اوراكل الى اسكل سرفر يتم التغيير الا على مستوى "طبقة البيانات"

6-السماح بدمج عدة لغات برمجة اي يمكن ان يكون في فريق البرمجة مبرمج دلفي فبي و سي شارب وبهدا الطبقات الثلاثة تكون بثلاث لغات

7-الطبقة الاولى يمكن ان تكون عبارة عن

*- موقع واب

*-برنامج winform

*-برنامج على الموبايل

.......

دون تغيير الطبقات الاخرى

ومتى نستعملها

نستعمل هذه الطريقة حينما يطلب منا تحقيق مشروع درسة بطريقة UML

طريقة مريز لا نتفع هنا ابدا

حمل هنا السورس كود

3-Tier.rar

تم تعديل هذه المشاركة بواسطة زكيري عبد العالي في 6 أبريل 2010 في 12:16

3
#2

سنقوم اولا بانشاء قاعدة البيانات باسم

اقتباس
DB_test

و التي تحتوي على الجدول التالي

اقتباس
Perso

و الدي بدوره يتكون من الحقول التالية كمثال سهل لتطبيق

ID_Perso

Nom_Perso

Prenom_Perso

Age_Perso

هذا المثال بالدفي 2010:

post-1034-1218391621_thumb.jpg

post-1034-12682206539681_thumb.jpg

post-1034-12682206681011_thumb.jpg

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

#3

افتح مشروع جديد به تطبيق جديد من نوع Package1.bpl غير الاسم الى Common.bpl

ثم غير اسم المشروع Package1.dproj الى 3Tier.dproj

post-1034-12679138041999_thumb.jpg

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

#4

نظيف تطبيقين جديدين بعد ذلك الاول باسم Interfaces و الاخر باسم Dal

post-1034-12679143031561_thumb.jpg

post-1034-12679149326462_thumb.jpg

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

#5

لم يبقى الا اضافة خدمت الويب و تطبيق الواجهة .

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

في البداية نكون تطبيق الدلفي win32 و بعدها سنضيف تطبيق اخر ويب حيث لا يوجد فرق بينهما الهذف هو استعلال خدمت الويب فقط و عرض الناتج للمستعمل

تكون الهكلة العامه للمشروع كما موضح في الصورة .

نكرر العملية الموجودة في الصورة 5 مرات اي لكل مشروع .

post-1034-12679166430141_thumb.jpg

post-1034-12679595660007_thumb.jpg

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

#6

كتابة الكود

1- التطبق الاول Common

نجد فيه كل ما هو مشترك في الطبقات .

نضيف الى هذا المشروع الوحدة Uperso و التي تحتوي على الصنف او الكلاس Tperso و ايض الحقول التي نريد عرضها في كل مرة نردي عرض الفرد perso من القاعدة .

unit Uperso;

interface

type
  Tperso = class
  Private
 public
    Property ID_Perso: integer;
    Property Nom_Perso: string;
    Property Prenom_Perso: string;
    Property Age_Perso: integer;


  end;

implementation

end.

نحد تعريف الحقول ثم نضغط على الازرار الثلاثة مع بعض ctrl+Maj+C

لنتحصل في الاخير على الصنف و جميع الوظاءف التي تسمح لنا بالوصول الى الحقول .

الناتج

unit Uperso;

interface

type
  Tperso = class
  Private
    FAge_Perso: integer;
    FPrenom_Perso: string;
    FNom_Perso: string;
    FID_Perso: integer;
    procedure SetAge_Perso(const Value: integer);
    procedure SetID_Perso(const Value: integer);
    procedure SetNom_Perso(const Value: string);
    procedure SetPrenom_Perso(const Value: string);
public
    Property ID_Perso: integer read FID_Perso write SetID_Perso;
    Property Nom_Perso: string read FNom_Perso write SetNom_Perso;
    Property Prenom_Perso: string read FPrenom_Perso write SetPrenom_Perso;
    Property Age_Perso: integer read FAge_Perso write SetAge_Perso;


  end;

implementation

{ Tperso }

procedure Tperso.SetAge_Perso(const Value: integer);
begin
  FAge_Perso := Value;
end;

procedure Tperso.SetID_Perso(const Value: integer);
begin
  FID_Perso := Value;
end;

procedure Tperso.SetNom_Perso(const Value: string);
begin
  FNom_Perso := Value;
end;

procedure Tperso.SetPrenom_Perso(const Value: string);
begin
  FPrenom_Perso := Value;
end;

end.

post-1034-12679608623302_thumb.jpg

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

#7

و الان سنقوم بانشاء الكلاس UPersoCollection.pas و التي سترث من الكلاس TLIS

unit UPersoCollection;

interface

uses Classes;

type
TpersoCollection <TPerso> = class (TList)

  private
    { Déclarations privées }
  public
    constructor Create;
  end;

implementation

constructor TPersoCollection.Create;
begin
  inherited Create;
end;

end.

الهدف من هده الكلاس هو انشاء شئ OBJECT من نوع قائمة اشياء وهي النتاجة عن الكلاس الاولة طبعا اي قاءمة PERSO

post-1034-12679968009659_thumb.jpg

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

#8

التطبيق الثاني Interfaces.dproj

و الذي يحتوي على وحدة UpersoManager.pas

و الكلاس IpersoManager

لعمل GID

اتوماتكيا في الدلفي نقوم بالضغط على

ctrl + Maj + G

اذا هي عبارة عن انترفاس بها وظيفة شرطا تسمح يمنادات و الحصول على سلسلة التسجيلات

الان نقوم باضافة مكتبه المشروع الاول بالطريقة التالي

unit UpersoManager;

interface

// uses UpersoCollection
type
  IpersoManager = interface
    ['{016D14C4-5020-46EA-B3EE-1AF2997BC48F}']
//    function FetchAll(): TPersoCollection;
  end;

implementation

end.

كما تلاحضون انه لم يستطع التعرف على TPersoCollection و الموجودة في التطبيق الاول common و هذا هو المطلوب لاننا نريد ان نعمل على ناتج كمبايل المشروع االول وليس السورس الكود .

ولعمل هذا التعريف نقوم بمايلي لا حض الصورة

post-1034-1267967671934_thumb.jpg

post-1034-12679969005751_thumb.jpg

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

#9

3- التطبيق DAl و هو الذي يمثل الطبقة الثانية اي كل ما يتعلق بالعمليات على القاعدة من اضافة و تغيير و حذف ...الخ

1-نضيف المكتبتين الخاصة بالمشروع الاول و الثاني Interfaces.dll Common.dll

2- نكتب السورس في الكلاس UpersoDAL

unit UpersoDAL;

interface

uses
  ADODB, DB,SysUtils, UPerso, UPersoCollection,UpersoManager, AppConfig;

type
  TPersoDAL = class (TInterfacedObject,IpersoManager)

  private
    { Déclarations privées }
  public
    constructor Create;
    function FetchAll(): TPersoCollection;
  end;

implementation

constructor TPersoDAL.Create;
begin
  inherited Create;

end;

function GetFromQuery(iQuery: TADOQuery): TPerso;
var
  item: TPerso;
begin
  item := TPerso.Create();
  item.ID_Perso :=iQuery.FieldByName('ID_Perso').AsInteger;
  item.Nom_Perso :=iQuery.FieldByName('Nom_Perso').AsString;
  item.Prenom_Perso :=iQuery.FieldByName('Prenom_Perso').AsString;
  item.Age_Perso := iQuery.FieldByName('Age_Perso').AsInteger;
  result := item;
end;

function TPersoDAL.FetchAll(): TPersoCollection;
var
  items: TPersoCollection;
  item: TPerso;
  conn: TADOConnection;
  Query: TADOQuery;
begin
  try
    items := TPersoCollection.Create();
    conn := TADOConnection.Create(nil);
    Query := TADOQuery.Create(nil);

    conn.ConnectionString := cConnectionString;
    Query.Connection:= conn;
    Try
      conn.Open();
    except on e:exception do
    End;

    Query.SQL.Text := cSQLFetchAll;
    try
      Query.Open();
      while not (Query.Eof) do
      begin
        items.Add(GetFromQuery(Query));
        Query.Next;
      end;
    except  on e:exception do
    End;

  finally
    result := items;
    Query.Close;
    conn.Close;
    Query.free;
    conn.free;
    //items.free;
  end;
end;

end.

نضيف و حدة اخري نضع فيها جميع الثوابت ونسميها AppConfig.pas

unit AppConfig;

interface

Const
cSQLFetchAll = 'SELECT * FROM Perso ';
cConnectionString ='Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DB_test;Data Source=ZEKIRI-PC\SQLEXPRESS';
implementation

end.

الان نقوم بعملية بسيطة هدفها هو عند عمل كومبال لتطبيق الطبقة المحددة يقوم الدلفي بعمل كمبايل لجميع تطبيقات الطبقات السابقة

post-1034-1267995650029_thumb.jpg

post-1034-12680370190939_thumb.jpg

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

#10

تطبيق خدمت الواب

وهو عبارة عن همزة وصل بين طبقة العرض و طبقة DAL .

حيث نجد فيه كل الوضائف التي استعملناها في في طبقة DAL.

اذن سنكتب الكود الان نفتح الوحدة ServiceWebIntf

و نضيف السطر

    function FetchAll(): TPersoCollection; stdcall;

unit ServiceWebIntf;

interface

uses InvokeRegistry, Types, XSBuiltIns, UpersoCollection;

type
  IServiceWeb = interface(IInvokable)
    ['{CF6B87A7-2C0F-47E2-A136-A41F3E8F4549}']
    function FetchAll(): TPersoCollection; stdcall;
  end;

implementation

initialization

InvRegistry.RegisterInterface(TypeInfo(IServiceWeb));

en

نفتح الوحدة ServiceWebImpl

من هذاا التعريف

  TServiceWeb = class(TInvokableClass, IServiceWeb)

نجد ان الكلاس مرتبطة بالانترفيس معناه بجب علينا اعادة كتابة الوضيف بنفس الشكل

unit ServiceWebImpl;
interface
uses InvokeRegistry, Types, XSBuiltIns, ServiceWebIntf,
UpersoCollection,UpersoDAL;

type

  { TServiceWeb }
  TServiceWeb = class(TInvokableClass, IServiceWeb)
  private
  public
  function FetchAll(): TPersoCollection; stdcall;
  end;

implementation


{ TServiceWeb }

function TServiceWeb.FetchAll(): TPersoCollection;
var
   Manager : TPersoDAL;
begin
   TRY
      Manager:=TPersoDAL.Create();
      Result:= Manager.FetchAll();
   FINALLY
      Manager.Free;
   END;
end;

initialization
{ les classes invocables doivent être recensées  }
   InvRegistry.RegisterInvokableClass(TServiceWeb);
end.

قمنا بانشاء شئ من نوع TPersoDAL و قمنا باستدعاء الوضيفة FetchAll و الناتج نضعه في Result

post-1034-12679973530104_thumb.jpg

post-1034-12680748946287_thumb.jpg

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

#11

السلام عليكم ..

كيف الاحوال الاخ عبد العالي. درس جميل جدا .

اعجبتني فكرة التعامل عن طريق http بين الطبقات.

ماذا تحتاج كمساعدة

العمل كثير و الوقت قليل أعاننا الله

seo zen SEO Enlightment amazon danbo

#12

اهلا اخي امين بارك الله فيك

لم يبقى الى علي و طلال ليكتمل الفريق .

المشكلة هى :

1-اني اريد ربط مكونات DB اي dbgrid ...dbedit... الخ بالابجكت مثل ما يمكن عمله بالدوت نت .

وجدت فكرة لكن اريد ان ان اتأكد من انه لا توجد طرق احسن .

procedure TForm1.Button1Click(Sender: TObject);
var
  cFacadeF: PersoFacades;
  vPersoCollection:  PersoCollection;
  i:integer;
begin
  cFacadeF := PersoFacades.Create();
  vPersoCollection :=  PersoCollection.Create();
  TRY
     vPersoCollection:=cFacadeF.FetchAll();
     CharegInDataSet(vPersoCollection);
  FINALLY
   cFacadeF.Free;
   vPersoCollection.Free;
  END;
end;
//*****************************************************************************
procedure TForm1.CharegInDataSet(iPersoCollection:PersoCollection);
var
ClientDataSetimport : TClientDataSet;
I:integer;
vperso:perso;
begin
  ClientDataSetimport :=TClientDataSet.Create(nil);
  ClientDataSetimport.FieldDefs.Add('ID_Perso',ftInteger,0,false);
  ClientDataSetimport.FieldDefs.Add('Nom_Perso',ftString,30,false);
  ClientDataSetimport.FieldDefs.Add('Prenom_Perso',ftString,30,false);
  ClientDataSetimport.FieldDefs.Add('Age_Perso',ftInteger,0,false);
  ClientDataSetimport.CreateDataSet;
  vperso:=perso.Create();
//*************************************************
for I := 0 to iPersoCollection.Count - 1 do
begin
     vperso:=iPersoCollection.Items;

          ClientDataSetimport.Append;
          ClientDataSetimport.FieldByName('ID_Perso').value:=vperso.ID_Perso;
          ClientDataSetimport.FieldByName('Nom_Perso').value:=vperso.Nom_Perso;
          ClientDataSetimport.FieldByName('Prenom_Perso').value:=vperso.Prenom_Perso;
          ClientDataSetimport.FieldByName('Age_Perso').value:=vperso.Age_Perso;
          ClientDataSetimport.Post;
end;
  //*********************************************************
  ClientDataSetimport.Open;
  DataSource1.DataSet:=ClientDataSetimport;
  DBGrid1.DataSource:=DataSource1;
  DBNavigator1.DataSource:=DataSource1;
end;

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

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

#13

الطبقة الاخيرة : طبقة العرض

في هذه الطبقة نقوم بانشاء تطبيق win32 ثم بعد ان نتحصل على نتيجة جيدة نضيف تطبيق ويب بالدلفي و الدوت نت و الجافا ان شاء الله .

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

اذن الخلاصة هي

طبقه العرض (تطبق AppWin32.dproj او تطبق/web_jee/ web_delphi / web_net) ---> بقوم باستغلال خدمت الويب و التي بدرها تتخاطب مع ------> الطبقتين المتبقيتين

اذن ننشأ الواجهة الممثل في الشكل ثم نقوم بانشاء client service web بالطريقة التالية :

post-1034-12680772441138_thumb.jpg

post-1034-12680799121281_thumb.jpg

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

#14

انا نوعا ما متأخر عليك في التفكير اخي عبد العالي ما انني اعاني من مشكلة في النظر الى الاكواد على صفحات الويب. اذا كان بالامكان ان تراسني بالود الذي انجزته حاليا و اسم النسخة التي تعم عليها كي استطيع ان اتابع معك اللية او غدا.

كسؤال لماذا PersoCollection ترث من TList و ليس من TDataSet؟ لان الربط سيكون اسهل مع DataSource

العمل كثير و الوقت قليل أعاننا الله

seo zen SEO Enlightment amazon danbo

#15

نعم اخي امين هذا ماقمت به في المرة الاولى و اثتها من clientdataset و لكن قلت بما اني اريد ان ان استخدم الطبقتين في خدمت الوب اردت انه عند انشاء client service web يكون عام ليس خاص بالدلفي .

و اعتقد ان TLIST اعم وهذه الفكرة طبعا للنقاش .

بارك الله فيك على المتابعة .

نحن في السكيب ان اردت الدخول .

النسخة

delphi 2010

sqlserver

IIS

#16
uses IServiceWeb1;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  service: IServiceWeb1.IServiceWeb;
  list: Tlist;
begin
  service := GetIServiceWeb;
  list    := Tlist.Create;
  list    := (Tlist)(service.FetchAll);
  showmessage(list.Count);
end;

عند النقر على الزر نكتب الكود

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

اضن ان المشكلة ف يكون الكلاسات المستعملت ليس من نوع Serializable

في الدزت نت او البريسم نكتب

type
  [Serializable]
  TpersoCollection = class (TList, ISerializable)

و في الجافا نكتب

public class TpersoCollection {
}
public class TpersoCollection extends TList implements Serializable {
    ...
}

لكن في الدلفي كيف خبرت 6 سنوات ولم يسبق لي ان عملت هذا :blush:

post-1034-12680803173348_thumb.jpg

post-1034-12680809235746_thumb.jpg

3-Tier.rar

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

#17

سالة الخطأ هي

post-1034-12681468506913_thumb.jpg

#18

السلام عليكم ورحمة الله وبركاته

موضوع جميل والاجمل اصرارك على تطبيق n-tier بدلفي

لقد كنت اعتقد ان الامر مستحيل بدلفي لكنك قطعت شوطا مهما

طريقة جديدة اتمنى لك التوفيق اخي عبد العالي

وفقنا الله واياكم لما يحبه ويرضاه

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا وانفع الناس بنا واغفر لنا وارحمنا

#19

السلام عليكم ورحمة الله وبركاته.

كيف الاحوال يااحباب و الله غيبة

عزيزي :

لاتنسى ان تصلي على حبيبنا و شفيعنا يوم لا ينفع مال ولا بنون .

فاللهمّ صّل وسّلم على سيدي و شفيعي وحبيبي محمد عليك الف صلاة وازكى تسليم

*****

2_header.png

#20

الحمد لله رجع فريق عمل الدلفي

محمد / امين / علي / طلال / و الاستاذ ناجي

هيا بنا في مشاريع جديدة بالدلفي و نتميز بمنتدانا الغالي

الخبر ة موجودة و القدرة لم يبقى الى التنفيذ

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

و كمل مشروع الصيدليه ايضا

#21

السلام عليكم

درس ممتاز أخي زكيري،

لكن لي بعض الملاحظات إذا سمحت:

1. الصنف TPersoCollection حتى تستطيع إستخدامه في الويب سيرفس يجب ان يكون مشتق من نوع TRemotable، وأيضاً

2. حسب ملف ال WSDL المولد فالنوع المعرف ك Complex type هو TPersoCollection، ولا يوجد به اي حقول معرفة به حسب الأصناف القياسية للويب سيرفس.

3. لا يمكن استخدام الصنف TList لانه خاص بدلفي فقط، واعتقد لا يمكن عمل له Serlization، لكني سوف أتأكد من هذا لاحقاً.

4. عادة طبقة ال DAL تقوم بإخفاء معلومات التعامل مع قاعدة البيانات عن BOL، لذا يفضل ان لا تقوم بتمرير ADOQuery كمعامل، بل عل DAL ان تقوم بإنشائها بنفسها بشكل تلقائي وإرجاع البيانات، ايضا عند تغيريك لتقنية المستخدمة في الربط مع قاعدة البيانات من ADO الى dbExpress مثلا، سوف تضطر إلى تغيير الكود الموجود في DAL و BOL وهذا يضيع من فائدة إستخدام طبقة ال DAL في البرنامج.

5. احبذ استخدام تقنية DataSnap على الويب سيرفس لان بها مميزات اكبر لبناء برامج متعددة الطباقات وخاصة مع نسخة 2009 و2010، بالاضافة إلى أنه يمكنك استخدامها مع دلفي بريزم ايضا :).

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

سوف احاول المساعدة إن شاء الله خلال الإسبوع القادم لإن هذا الإسبوع مشغول بشكل كبير جداً.

لا تحزن:

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

لا تحزن:

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

#22

و اخير.

استاذى الكريم محمد نسمان مرحبا بك و مسرور انا بوجودك و مشاركتة جزاك الله خيرا.

اقتباس
لكن لي بعض الملاحظات إذا سمحت:

بالطبع فمنك نتعلم .

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

اعتقد انه لا نستطيع التوريث من كلاسين لهذا ايمكنك اعطاءي الانترفاس الخاصة TRemotable اي

اي كيف اكتب

  TpersoCollection = class (TList<Tperso>,iRemotable )

في حبن نجد بديل ل TLIST

اقتباس
حسب ملف ال WSDL المولد فالنوع المعرف ك Complex type هو TPersoCollection، ولا يوجد به اي حقول معرفة به حسب الأصناف القياسية للويب سيرفس.

نعم الخطأ في انه لم يستطع saop ارسال TPersoCollection كما يجب و المشكلة في Serlizationعلى ما اعتقد

اقتباس
. لا يمكن استخدام الصنف TList لانه خاص بدلفي فقط، واعتقد لا يمكن عمل له Serlization، لكني سوف أتأكد من هذا لاحقاً.

فما هو البديل من فضلك

المشكلة هي في Serlization

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

اقتباس
عادة طبقة ال DAL تقوم بإخفاء معلومات التعامل مع قاعدة البيانات عن BOL، لذا يفضل ان لا تقوم بتمرير ADOQuery كمعامل، بل عل DAL ان تقوم بإنشائها بنفسها بشكل تلقائي وإرجاع البيانات، ايضا عند تغيريك لتقنية المستخدمة في الربط مع قاعدة البيانات من ADO الى dbExpress مثلا، سوف تضطر إلى تغيير الكود الموجود في DAL و BOL وهذا يضيع من فائدة إستخدام طبقة ال DAL في البرنامج.

صح :wacko: لكن كيف .

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

جربت ذلك لكن لم يعجبني فكرة انشاء سرفر ونداوز لكن سارى ما يمكن عمله لاحقا . لكن انا الان مصر على الويب سرفيس .

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

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

اقتباس
سوف احاول المساعدة إن شاء الله خلال الإسبوع القادم

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

شكرا

#23

السلام عليكم

كيف حال الجميع

شكرا على دروسك الرائعة استاذنا ذكيري , بانتظارك وبانتظار استاذنا محمد نسمان

بالتوفيق إن شاء الله

#24

ألف شكر لك استاذ ذكيري واتمنى ان نقوم بإنشاء هذه التطبيقات في المستقبل لانها ممكن جديدة علينا لنسبق اللغات الثانية ولكم جزيل الشكر

#25

طال الانتضار اخي محمد .

ارجوا من الله ان تكون بخير و كل اخواننا في فلسطين

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