delphi4arab منتديات دلفي للعرب

نسخة كاملة : كيفية إستخراج الكلمات بين فاصل من سلسلة نصية
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم

كيف يمكنني إستخراج كلمات بين فاصل من سلسلة نصية

مثلاً لدي السطر التالي :
Mohamed=20yr=2.5=Algeria
أود إستخراج الكلمات بدون الفاصل '=' ووضع كل كلمة في TEdit
Mohamed
20yr
2.5
Algeria

في الحقيقة قمت بمحاولة ناجحة لكنني أبحث عن طريقة أخرى تكون أفضل
المثال في المرفقات وهذا هو الكود
كود :
procedure TForm1.Button1Click(Sender: TObject); var S:String; i,LS:Integer; MyPos : TStringList; begin S:=Trim(Edit1.Text); try MyPos := TStringList.Create; for I := 0 to Length(S) do begin if S[i] = '=' then begin MyPos.Add(inttostr(i)); end; end; LS:=Length(S); NN1.Text:=Copy(S,0,StrToInt(MyPos[0])-1); NA1.Text:=Copy(S,StrToInt(MyPos[0])+1,StrToInt(MyPos[1])-StrToInt(MyPos[0])-1); NR1.Text:=Copy(S,StrToInt(MyPos[1])+1,StrToInt(MyPos[2])-StrToInt(MyPos[1])-1); NC1.Text:=Copy(S,StrToInt(MyPos[2])+1,LS); MyPos.Free; Except ShowMessage('Error!! '); end; end;
وعليكم السلام ورحمة الله

يمكن استخدام CommaText ابحث عنها بالمنتدى تجد امثلة
B.M.AbdelAziZ كتب :يمكن استخدام CommaText
وعليكم السلام
محاولة بإستخدام Delimited :
PHP كود :
procedure TForm1.BitBtn1Click(Sender: TObject);
var 
S:tstringlist;
l:string; i,b:integer;
begin
s
:=TStringList.Create;
for 
I := 0 to Memo1.Lines.Count-1 do
begin
s
.Add(Memo1.Lines.Strings[i]);
l:=s.Strings[i];
s.Delimiter:='=';
s.DelimitedText:=l;
for 
b := 0 to S.Count-1 do
ShowMessage(S[b]);
end;
end; 
و عليكم السلام
هذه طريقة سريعة باستخدام الأسمبلي Smile
PHP كود :
// Coded By SMP3
type TInfo = record
  Name    
:array [0..255] of AnsiChar ;
  
Age     :array [0..255] of AnsiChar ;
  
Unknow  :array [0..255] of AnsiChar ;
  
Country :array [0..255] of AnsiChar ;
end;
function 
FastGetInfo(s:AnsiString):TInfo;
var 
Info:TInfo ;
begin
FillChar
(Info,sizeof(Info),#0);
asm
pushad

mov edi
,s
xor ecx, ecx
not ecx
xor al, al
cld
repne    scasb
not ecx
dec ecx

xor edx,edx
xor ebx,ebx
xor esi,esi
@NextChar:
push ecx
mov edi
,s
mov al
,byte ptr ds: [edi+edx]
cmp al,'='
je @nequ
jmp 
@ne
@nequ:
xor 
esi,esi
sub ecx
,edx
inc ebx

@ne:
cmp ebx,0
je 
@name
jmp 
@nage
@name:
mov byte ptr [Info.Name][esi],al
@nage:
cmp ebx,1
je 
@age
jmp 
@nU
@age:
cmp al,'='
je @dnadd
mov byte ptr 
[Info.Age][esi],al
jmp 
@nU
@dnadd:
dec esi

@nU:
cmp ebx,2
je 
@Unknow
jmp 
@nCountry
@Unknow:
cmp al,'='
je @dnadd2
mov byte ptr 
[Info.Unknow][esi],al
jmp 
@nCountry
@dnadd2:
dec esi
@nCountry:

cmp ebx,3
je 
@Country
jmp 
@Fin
@Country:
cmp al,'='
je @dnadd3
mov byte ptr 
[Info.Country][esi],al
jmp 
@Fin
@dnadd3:
dec esi

@Fin:
inc edx
inc esi
pop ecx
cmp edx
,ecx
jne 
@NextChar
popad
end
;
Result:=Info;
end;

procedure TForm1.Button1Click(Sender: TObject);
var 
s :Ansistring;
begin
s
:='Mohamed=20yr=2.5=Algeria';
Edit1.Text:=FastGetInfo(s).Name;
Edit2.Text:=FastGetInfo(s).Age;
Edit3.Text:=FastGetInfo(s).Unknow;
Edit4.Text:=FastGetInfo(s).Country;
end; 
أخي ، smp3
أولا بارك الله فيك طريقتك جيدة لكن الكود طويل جدا وغير قابل للتعديل Big Grin (لا أعرف لغة Assembler )
إخوتي في الله بارك الله فيكم

بالنسبة إلي كود الأخ لؤي جيد
مع بعض التعديلات
كود :
procedure TForm1.Button1Click(Sender: TObject); var S:tstringlist; Textsrc,l:string; i,b:integer; begin Textsrc:='Mohamed=20yr=2.5=Algeria'; s:=TStringList.Create; s.Add(Trim(Textsrc)); l:=s.Strings[i]; s.Delimiter:='='; s.DelimitedText:=l; for b := 0 to 3 do Edit1.Text:=S[0]; Edit2.Text:=S[1]; Edit3.Text:=S[2]; Edit4.Text:=S[3]; end;