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

تقسم الرساله

مغلق
بدأه Lola في 27 مايو 2002 · 11 رد · 810 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اريد ان اسال عندي message من جهاز لجهاز ولتكن

maha,ahmed,yasser

اريد ان اضعهم في tree view ولم اتمكن من ذالك لم استطع التقسيم

واعتقد انني اخطات في الكود واصبح لا يعمل

اتوقع ان استخدم pos functionويظهر انني استخدمتها بطريقه خطا

ارجو المساعده وشكرا

#2

لقد قمت بعمل هذا الإجراء لعل يكون به الفائدة ولا تنسى عمل التعديلات اللازمة إذا كان عدد أجزاء الرسالة أكثر من 3 أو أن الفواصل ليست " , " - ولتحصل على النتائج سيكون عن طريق تعاملك مع المصفوفة Newmsg

Procedure cutmessage(OrgMsg:String);

var mcount,mmcount: integer;

Newmsg: array [1..3] of string;

Msgtmp:string;

begin

mcount:=0;

mmcount:=0;

Repeat

Msgtmp:='';

Repeat

mcount:=mcount+1;

if OrgMsg[mcount] <> ',' then Msgtmp:=Msgtmp+OrgMsg[mcount];

until (OrgMsg[mcount] = ',') or (mcount=length(OrgMsg));

mmcount:=mmcount+1;

Newmsg[mmcount]:=Msgtmp;

Until mmcount=3;

end;

لتقوم بتجربته

procedure TForm1.Button9Click(Sender: TObject);

begin

cutmessage('Dear: ,Lola ,How are you?');

end;

مع تحياتى

#3

السلام عليكم

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

وسوف يقوم بإضافة النص الناتج الى TreeView

procedure SeparateString(Str,SubStr :string);
var
  I: Integer;
begin
  while Pos(SubStr,Str) >0 do
  begin
    I := Pos(SubStr,Str);
    Form1.TreeView1.Items.Add(nil,Trim(Copy(Str,1,I-1)));
    Str := Copy(Str,I+1,Length(Str)-I +1);
  end;
  Form1.TreeView1.Items.Add(nil,Trim(Str));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SeparateString('Ahmad, Ali, Sami,hani,ali', ',');
end;

إن لم يكن هذا المطلوب أرجو التوضيح

والسلام

لا تحزن:

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

لا تحزن:

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

#4

السلام عليكم

اذا سمح لي الاخ محمد نسمان بتعديل بسيط على الكود :)

Str := Copy(Str,I+Length(SubStr),Length(Str)-I +1);

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

كما انني افضل ان تحفظ العبارات الناتجه من التقسيم الى TString , لمعالجة جميع الحالات ....

هناك ملاحظة اخرى استعمال trim يحذف اول حرف من الـ string ان كان هذا الحرف عباره عن مسافه (space) .

هذه function كتبتها على عجل ربما يمكن الاستفاده منها , اظن انه يمكن تقليص الكود و كتابته بصورة افضل , اترك ذلك لمن له اهتمام .

function Praseit(Mystr,ParseStr: string):TStrings;
var
  pos1,pos2:integer;
  pstr: string;
  StringList: TStrings;
begin
  StringList := TStringList.Create;
  result:=TStringList.Create;
  try
    with StringList do
    begin
      pos1:=0;
      repeat
      begin
        pos2:=strlen(pchar(Mystr));
        Mystr:=copy(Mystr,pos1,pos2);
        if(Mystr='')then
         break;
        pos1:=0;
        pos2:=pos(ParseStr,Mystr);
        if(pos2<>0) then
          pstr:=copy(Mystr,pos1,pos2-1)
        else
          pstr:=MyStr;
        pos1:=pos2+strlen(pchar(parsestr));
        StringList.Add(pstr);
      end until (pos1=0);
    end;
     result.Assign(StringList);
  finally
    StringList.free;
  end;
end;

CIONO1

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#5

شكرا اخواني

ضبط يعطيكم العافيه:)

#6

أخي Tamaa

شكرا لك على التعديل :)

بالنسبة لإستخدام Trim فكلامك صحيح وانا لذلك استخدمتها حتى لا يتم استخدام المسافة قبل الاسم

بالنسبة للدالة التى كتبتها لم اجربها بعد، لكن لي ملاحظات بسيطة

لا يوجد داعي لهذا السطر

 result:=TStringList.Create;

وايضا يفضل دائما ان تتعامل مع strings وليس مع PChar لان الاخير موجود مع دلفي لوضع التوافقية مع دلفي 1 و مع windows api لانه شبيه ب string الخاصة بلغة سي

ايضا ميزة string في دلفي انها تعتبر Lifetime -managmet اي انها تحجز نفسها في الذاكرة وعند الخروج من المجال التى عرفت به تقوم بتحرير نفسها من الذاكرة وارجاع الموارد اي كما يسمى garbage-collected

والسلام

لا تحزن:

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

لا تحزن:

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

#7

السلام عليكم

مشكور اخ محمد على الرد

بالنسبه لاستخدام pchar فانا كما قلت كتبت الكود على عجل ويمكن تغيير الكود في المكان حيث استخدمت كالاتي :

pos2:=strlen(pchar(Mystr));
//يستبدل بـ :
pos2:=length(Mystr);
//--------
pos1:=pos2+strlen(pchar(parsestr));
//يستبدل بـ :
pos1:=pos2+length(parsestr);

نفس الطريقة التي استعملت في اول رد وهو استعمال length .

بالنسبه للسطر

 result:=TStringList.Create;

عدم وجوده يعطي exception , حيث انه لا بد من تكوين المتغير قبل استخدامه ... , اتمنى منك المزيد من التوضيح حول هذه النقطه , شاكرا لك مقدما ..

CIONO1

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#8

أخي العزيز Tamaa

Result عبارة عن متغير يحل محل اسم الدالة وبإمكانك إستخدام اسم الدالة بدلا منه، وهو لا يحتاج الى اي تعريف او عملية إنشاء لان ذلك يتم تلقائيا

أنا أستخدمه مع TStringList وما الانواع الاخرى ويعمل بدون مشاكل، لكن لاحظت انك في الاجراء الذي كتبته القيمة الراجعة منه هي TStrings

function Praseit(Mystr,ParseStr: string):TStrings;

بينما تقوم بتجهيز متغير Resutl على اساس انه من نوع TstringList

result:=TStringList.Create;

ورغم ان النوع الثاني مشتق من الاول لكن دائما يفضل ان يكون الاستخدام لنوع واحد

مع تحياتي

لا تحزن:

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

لا تحزن:

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

#9

السلام عليكم

اخي العزيز

اتمنى ان تكتب الكود بعد اضافة التعديلات التي ذكرتها , فعند محاولتي لعمل ما ذكرت كانت النتيجه هي ظهور exception ولم يعمل الكود .

CIONO1

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#10

السلام عليكم

أخي العزيز Tamaa

جربت الكود الذي كتبه، الدالة التى كتبتها، وهي تدخل في حلقة لا نهائية لان شرط until pos1=0 لن يتحقق ابدا، لانه يسبقه هذا السطر

pos1:=pos2+strlen(pchar(parsestr));

وهذا يقوم بجعل قيمة Pos1 = 1 على الاقل ولن تتحول الى صفر ابدا وهكذا يدخل في تكرار وفي هذا التكرار يتم اضافة اخر جزء في النص بشكل لا نهائي مما يؤدي الى تعليق البرنامج ولحل هذه المشكلة عليك بنقل السطر السابق الى دخل جملة الشرط if(pos20) then

قمت ببعض التعديلات على دالتك، لم اعدل كثيرا فقط رفعت بعض الاسطر الزائدة ولم استخدم Pchar وجعلت الاستخدام فقط مع string وهذا يؤدي الى زيادة سرعة تنفيذ الدالة في حال استغنائك عن Pchar وهذا شكل دالتك بعد التعديل:

function Praseit(Mystr,ParseStr: string):TStringList;
var
  pos1,pos2:integer;
  pstr: string;
  StringList: TStringList;
begin
  StringList := TStringList.Create;
  result:=TStringList.Create;
  try
      pos1:=0;
      repeat
        pos2:=Length(Mystr);
        Mystr:=copy(Mystr,pos1,pos2);
        if(Mystr='')then
          break;
        pos1:=0;
        pos2:=pos(ParseStr,Mystr);
        if(pos20) then
        begin
          pstr:=copy(Mystr,pos1,pos2-1);
          pos1:=pos2+Length(parsestr);
        end
        else
          pstr:=MyStr;
        StringList.Add(pstr);
      until (pos1=0);
     result.Assign(StringList);
  finally
    StringList.free;
  end;
end;

بالنسبة لكلامك عن result:=TStringList.Create; فهو صحيح، وانا كنت غلطان :o ، لانه يحتاج لتهيئة عند استخدامه مع انواع مثل TStringList ولا يحتاج لذلك مع المتغيرات البسيطة

ولقد قمت بتعديل الدالة التى كتبها انا بحيث تقوم بإرجاع TstringListايضا، ولا تزال ابسط واقل في الكود

function SeparateString(Str,SubStr :string) : TStringList;
var
  I: Integer;
  SL : TStringList;
begin
  try
  Result := TStringList.Create;
    SL := TStringList.Create;
  while Pos(SubStr,Str) >0 do
  begin
    I := Pos(SubStr,Str);
    SL.Add((Copy(Str,1,I-1)));
    Str := Copy(Str,I+Length(SubStr),Length(Str)-I +1);
  end;
  SL.Add((Str));
  Result.Assign(SL);
  finally
    SL.Free;
  end;
end;

معلش وجعتلك راسك معي :D

مع تحياتي

والسلام

لا تحزن:

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

لا تحزن:

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

#11

السلام عليكم

مشكور اخ محمد

هكذا يكون الكود افضل بكثيــــــــــــــــر ;) .

المعذره لم يكن لدي الوقت لتعديل الكود - مشغول مع Native API Function - وهانت قد قمت بذلك , شكرا جزيلا .

(f)

CIONO1

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#12

Native API Function مرة وحدة

داخل على تقيل يا عم ;) ، الموضوع كتير ممتع، بس بدو وقت طويل للقراءة

في مكتبة اعتقد اسمها Kol بتخليك تبني الفورم وكتير شغلات فقط من خلال Api من داخل دلفي وحجم البرنامج بيطلع صغير كتير، موش متذكر الموقع، لكن اذا بتحب بدورلك عليه

سلام

لا تحزن:

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

لا تحزن:

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

هذا الموضوع مغلق.

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