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

تحويل من السي بلس بلس إلى الدلفي

بدأه alouma في 21 فبراير 2012 · 3 رد · 726 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

تم طردي من قسم السي وطرح من نقاطي 1 للأسف

وعرض علي وضع السؤال هنا في قسم الدلفي

فأرجو أن أجد عندكم الإجابة

أريد تحويل الكود التالي من السي بلس بلس لاستخدامه في الدلفي

مع العلم أم هذه الدالة تقوم بتقسيم جملة اعتمادا على الفراغات الموجودة فيها والمعروفة في السي بلس بلس بـ (Split)

//دالة التقسيم
        public string[] split(string str)
        {
            //جدول مؤقت طوله بعدد الاحرف في الجملة الامدخلة
            string[]resTemp=new string[str.Length];
            //جدول نضع في النتيجة النهائية
            string[] res;
            //متغير حقيقي نحفظ فيه الخانة الموالية 
            int index = 0;
            //متغير حقيقي لحساب طول الجدول النتيجة
            int length = 0;
            // متغير من نوع ستينغ في كل مرة يحوي كلمة من الجملة
            string temp = "";
            //عملية التقسيم
            for (int i = 0; i < str.Length; i++)//من 0 الى عدد احرف الجملة ننظر
            {
                //اذا كان الحرف عبارة عن مسافة يعني ان الكلمة انتهت فنقوم بالاحتفاظ بها
                if (str.Equals(' '))
                {
                    //نحفظ الكلمة في الخانة الموالية
                    resTemp[index] = temp;
                    //نضيف 1 الى الاندكس لتعليم الخانة التالية
                    index++;
                    //نفرغ المتغير تحضيرا للكلمة الموالية
                    temp = "";
                    //نضيف 1 لطول النتيجة لاننا اضفنا كلمة جديدة
                    length++;
                }
                //اذا كان الحرف ليس مسافة يعني انه حرف عادي نضيفه للكلمة التي نعمل على تجميعها في المتغير 
                else
                {
                    temp += str;
                }
            }
            //هذه حالة خاصة
            //الكلمة الاخيرة لا يوجد ما نجرب به بعدها اذا سوف تبقى في المتغير ولن يتم اضافتها
            //لذا نقوم باختبارها اخر الامر
            if (temp!="")
            {
                resTemp[index] = temp;
                length++;
            }

            //ننشي جدول النتيجة بالطول الذي قمنا بعده من قبل
            res = new string[length];
            //نقوم بملي الجدول النتيجة من الجدول المؤقت على حسب الطول الذي عددناه سابقا
            //والذي هو طول الجدول النتيجة
            for (int i = 0; i < length; i++)
            {
                res=resTemp;
            }
            //الان انتهى الامر ونعيد النتيجة
            return res;
        }
1
#2

+ 1 لوضع الموضوع في القسم المناسب

اقتباس
تم طردي من قسم السي

مهلا أخي !, من طردك من القسم ؟؟ :blink:

كل ما في الأمر أنك وضعت موضوع مخالف وتم إعلامك بالأمر و قمت أنا بإعطاءك -1 كتعبير مني على رفض الطريقة التي طرحت بها الموضوع !, هل أخطأت بحقك ؟؟ :)

... هل تريد إقامة حروب أهلية بين قسمي الدلفي و السي++ ؟ :D

بالهداوة يا أخي .. لا تقل قولا لا تملك دليلا له ! :happy:

أرجو لك التوفيق.

تم تعديل هذه المشاركة بواسطة khaled_prg في 22 فبراير 2012 في 02:08

1
#3

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

الأكواد التالية ليست ترجمة حرفية لإجراء الـ ++C المذكور، لكنها تقوم بنفس العمل. الأكواد تعتمد على ميزة الكائن TStringList في تقسيم الـ String حسب فواصل محددة:

1. استعمال دالة لتقسيم النص حسب الفراغات:

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

type
    TStringArray = array of string;

و الدالة تكون كالتالي:

function Split(AStr: string): TStringArray;
var
    AList: TStringList;
    Idx: Integer;
begin
    try
        AList := TStringList.Create;
        AList.Delimiter := ' ';
        AList.DelimitedText := AStr;
        SetLength(Result, AList.Count);
        for Idx := 0 to AList.Count - 1 do
            Result[Idx] := AList[Idx];
    finally
        AList.Free;
    end;
end;

و عند استدعاء الدالة يجب تعريف متغير من النوع المعرف كمصفوفة:

procedure TForm1.Button1Click(Sender: TObject);
var
    MyStrArr: TStringArray;
begin
    MyStrArr := Split(Edit1.Text);
    if Length(MyStrArr) > 0 then
        ShowMessage(MyStrArr[0]);
end;

2. استعمال إجراء لتقسيم النص مع تمرير مؤشر (Pointer) يشير إلى المصفوفة. لكننا أيضاً نحتاج إلى تعريف نوع و مؤشر لذلك النوع:

type
    TStringArray = array of string;
    PStringArray = ^TStringArray;
// ...
// ...
// ...
procedure Split(AStr: string; AArray: PStringArray);
var
    AList: TStringList;
    Idx: Integer;
begin
    // If we declare the AArray param as : array of string, then it will be
    // rejected by the SetLength function! (incompatible types)
    try
        AList := TStringList.Create;
        AList.Delimiter := ' ';
        AList.DelimitedText := AStr;
        SetLength(AArray^, AList.Count);
        for Idx := 0 to AList.Count - 1 do
            AArray^[Idx] := AList[Idx];
    finally
        AList.Free;
    end;
end;

هنا يمكننا تعريف مصفوفة بشكل عادي، و عند استدعاء الإجراء نقوم بتمرير عنوانها كمؤشر:

procedure TForm1.Button2Click(Sender: TObject);
var
    MyStrArr: Array of string;
begin
    SplitProc(Edit1.Text, @MyStrArr);
    if Length(MyStrArr) > 0 then
        ShowMessage(MyStrArr[0]);
end;

3. الطريقة الثالثة هي استعمال الكائن StringList بشكل مباشر و التعامل معه كأنه مصفوفة:

function Split(AStr: string): TStringList;
begin
    Result := TStringList.Create;
    Result.Delimiter := ' ';
    Result.DelimitedText := AStr;
end;

و الاستدعاء يكون بهذا الشكل:

procedure TForm1.Button3Click(Sender: TObject);
var
    MyStrList: TStringList;
begin
    MyStrList := SplitToList(Edit1.Text);
    if MyStrList.Count > 0 then
        ShowMessage(MyStrList[1]);
end;

نرجو الاستفادة و السلام.

1

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#4
khaled_prg كتب:

+ 1 لوضع الموضوع في القسم المناسب

مهلا أخي !, من طردك من القسم ؟؟ :blink:

كل ما في الأمر أنك وضعت موضوع مخالف وتم إعلامك بالأمر و قمت أنا بإعطاءك -1 كتعبير مني على رفض الطريقة التي طرحت بها الموضوع !, هل أخطأت بحقك ؟؟ :)

... هل تريد إقامة حروب أهلية بين قسمي الدلفي و السي++ ؟ :D

بالهداوة يا أخي .. لا تقل قولا لا تملك دليلا له ! :happy:

أرجو لك التوفيق.

أنا آسف جدا

وأرجو أن تقبلوا اعتذاري

وشكرا جزيلا جزيلا على الحرص والاهتمام بالأعضاء والمشاركين

الأخ najy_zl

بارك الله فيك أخي الكريم فهذا درس بحر

أتى على كل شيء غير مفهوم عندي ووضحه

مشكوور

تم تعديل هذه المشاركة بواسطة alouma في 22 فبراير 2012 في 19:30

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