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

البحث عن سلسله محرفية ضمن سلسله أخرى

مغلق
بدأه sara_ali في 28 نوفمبر 2004 · 19 رد · 6,477 مشاهدة · في أرشيف منتدى الدلفي
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ارجوا اجابتي على هذا السؤال

لدينا edit1,memo1,button,المطلوب كل مانضغط buttonيقوم بتضليل الموجود في memoنفسه الموجود في edit متال edit=124

memo=dfhfhhhfhfh123fdfddfdfd123

kfkfkfkkfklld123ffdfdf123gcgg

الان يقوم بتضليل 123ثم نضغط buttonيقوم بتضليل 123 التانية وهكذا.......

وشكرا

ارجوا الاسراع

تم تعديل هذه المشاركة بواسطة ORWA في 28 نوفمبر 2004 في 21:22

#2

أي أنك تريدين البحث عن سلسله محرفية ضمن سلسله أخرى .

إستخدمي التعليمة Pos(Substr,Str) التي تعيد لك ترتيب (موقع) السلسله الجزئية في السلسه الأصلية إذا وجدت وإلا تعيد صفر .

وتوجد تعليمة محدثه عنها هي PosEx , وهي تملك بارامتر يسمح لنا بتحديد مكان البدء بالبحث , مثلا كلما وجدنا نتيجة بحث نعيد البحث من آخر نقطة كنا عندها لكي لاتعود تظهر النتيجة القيدمة بالبحث , وهي مناسبة لحالتك ..

المثال كامل :

1- Button

2- Edit

3- Memo

var n:integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
n:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
n:=PosEx(edit1.Text,Memo1.Lines.Text,n+1);
if n>= 0 then
begin
Memo1.SetFocus;
Memo1.SelStart:=n-1;
Memo1.SelLength:=length(Edit1.Text);
end;
#3

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

undeclared identifier: 'posEx

واريد ان اقول لكي ملاحظة ان الدلفي اللتي اخدم عليها هي دلفي 5

وجزاك الله خيرا

#4

السلام عليكم

عليك اضافة StrUtils في قسم uses .

واذا كنت لن تستخدم strutils لأشياء اخرى ممكن تطبع الدالة posex كلها وهي

function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
var
  I,X: Integer;
  Len, LenSubStr: Integer;
begin
  if Offset = 1 then
    Result := Pos(SubStr, S)
  else
  begin
    I := Offset;
    LenSubStr := Length(SubStr);
    Len := Length(S) - LenSubStr + 1;
    while I <= Len do
    begin
      if S = SubStr[1] then
      begin
        X := 1;
        while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do
          Inc(X);
        if (X = LenSubStr) then
        begin
          Result := I;
          exit;
        end;
      end;
      Inc(I);
    end;
    Result := 0;
  end;
end;

ORWA:

if n>= 0 then

في bug صغيرة , ربما التعود على كتابة =< بكثرة هو الذي جعلك تكتبها هنا ايضا :)

الصحيح ان نكتب

if n> 0 then

CIONO1

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

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

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

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

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

#5

عفوا انا لم افهم code الاخ tmaa اما code الاخت عروة سهل ولكن لم يتنفد لي يقول لي نفس الاول حتى بعد تغيير n>0

وشكرا لكم علي اجابتي

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

#6

أضيفي شفره الأخ tmaaa في المشروع ثم عودي وأستخدمي طريقتي ..

مثلا تصبح كالتالي :

var n:integer;


function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
var
 I,X: Integer;
 Len, LenSubStr: Integer;
begin
 if Offset = 1 then
   Result := Pos(SubStr, S)
 else
 begin
   I := Offset;
   LenSubStr := Length(SubStr);
   Len := Length(S) - LenSubStr + 1;
   while I <= Len do
   begin
     if S = SubStr[1] then
     begin
       X := 1;
       while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do
         Inc(X);
       if (X = LenSubStr) then
       begin
         Result := I;
         exit;
       end;
     end;
     Inc(I);
   end;
   Result := 0;
 end;
end;





procedure TForm1.FormCreate(Sender: TObject);
begin
n:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
n:=PosEx(edit1.Text,Memo1.Lines.Text,n+1);
if n>= 0 then
begin
Memo1.SetFocus;
Memo1.SelStart:=n-1;
Memo1.SelLength:=length(Edit1.Text);
end;
#7

السبب أنني أستخدم Delphi 7 والتي تملك PosEX مباشرة

#8

شكرا جزيلاً لكم على المساعدة

لقد تنفذ لي وشكراً

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

#9

هل يمكن حل هذا السؤال بطريقة أسهل اي بدون استخدام function posex

#10

أرجوا الاجابة *-)

وشكرا لان الكود الاول صعب الفهم

#11

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

أقوى عروض الإستضافة على الإطلاق

عروض تبدئ من 1.99 $ في الشهر

أدخل على صقر هوست و سترى بنفسك

#12

نعم يمكن ..

المشكله انه إذا لم نستخدم PosEx فإنه سيعيد البحث من البدء كل مرة , وبالتالي سيتوقف عند أول نتيجة دائما , ولن يكمل إلى بقيه النتنائج

ممكن ببساطة أن تقومي

- بنسخ السلسه النصيه التي تريدين البحث عنها

- ثم البحث في النسخه الجديدة , بإستخدام POS

- كلما وجدت نتيجة بحث , تحذفيها من السلسله لكي لاتظهر مرة أخرى , وهذا لن يضر النص الأصلي لإننا نتعامل مع نسخة منه .

تعليمه الحذف هي Delete() .

أتمنى أن تجربي بها , وفي حال لم تنجح معك لن نتردد في وضع كود كامل

#13

انا حاولت في حله بس لما يضلل يضللهم مع بعض اي في ضغطة واحدة للbutton :( وهو ليس المطلوب .......

وشكرا

#14

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

أقوى عروض الإستضافة على الإطلاق

عروض تبدئ من 1.99 $ في الشهر

أدخل على صقر هوست و سترى بنفسك

#15

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

var
FoundAt: LongInt;
StartPos, ToEnd: Integer;

begin
if edit1.Text='' then ShowMessage('لم تقم بكتابة أي شيئ للبحث عنه') else begin
     with  dbRichEdit1  do
            begin
      { بدء البحث بعد النقطة الحالية إن وجد بحث }
      { و إن لم تجد إبدأ البحث من أول النص}
       if  SelLength <> 0  then begin
       StartPos := SelStart + SelLength;
       end else begin
       StartPos := 0;

       end;
     {ToEnd  ترمز للبعد الكائن بين StartPos  و آخر النص}
     ToEnd := Length(Text) - StartPos;
     FoundAt := FindText(edit1.text, StartPos, ToEnd,  [stMatchCase]);
       if  FoundAt <> -1  then
       begin
        SetFocus;
        SelStart := FoundAt;
        SelLength := Length(edit1.text);
       end else
       ShowMessage('البحث إنتهى . العنصر المبحوث عنه لا يمكن إيجاده');
     end;
end;
end;

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

       ShowMessage('البحث إنتهى . العنصر المبحوث عنه لا يمكن إيجاده');

تمام كده

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

تم تعديل هذه المشاركة بواسطة sakr188 في 8 ديسمبر 2004 في 01:06

أقوى عروض الإستضافة على الإطلاق

عروض تبدئ من 1.99 $ في الشهر

أدخل على صقر هوست و سترى بنفسك

#16

حاضر وانا حجرب الكود هذا بس انا عاوزا اقول انا استخدم delph 5

#17

انا أيضا أستعمل دلفي5

أقوى عروض الإستضافة على الإطلاق

عروض تبدئ من 1.99 $ في الشهر

أدخل على صقر هوست و سترى بنفسك

#18

شو شباب انسيتوني؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

انا بس كنت مشغولة

وشكرا

#19

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

أقوى عروض الإستضافة على الإطلاق

عروض تبدئ من 1.99 $ في الشهر

أدخل على صقر هوست و سترى بنفسك

#20

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

المفكرة.exe

هي طب للقلوب *** ذكرها يمحو الذنوب *** نورها سر الغيوب *** لاإله إلاالله

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

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