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

نسخة كاملة : طريقة التنقل بأكثر من قيمة في حلقة For..؟
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
[COLOR="DarkOrange"]السلام عليكم
أهلا إخواني - رمضان كريم
قبل فترة رأيت حلقة for في السي++ - حيث يمكنك زيدة المتغير في كل مرة بعدد معين
مثلا إن كان التنقل بعدد واحد نكتب ++i . وإن أدرنا أكثر نغيرها مثلا لـ i+2
جربت أنا تحويلها للدلفي - وعد عدة محاولات نجحت في ذلك - لكني الآن نسيت الطريقة Sad
لذا أرجـوا لمن عنده الطريقة أن يفيدنا بها وجزاه الله كل خير
------------
للفهم أكثر الطريقة التي جربتها أنا تشبه كالتالي
كود :
for i:=0 to 10 (i+2) do
لكن تلك خاطئة - وأيضا ما أقصده ليست طريقة الزيادة داخل أوامر الحلقة - بل في رأس الحلقة.
سلامي لكم...[/COLOR]
وعليكم السلام ورحمة الله
PHP كود :
var
  
I: Integer;
begin
  
while I Condition do begin
    Whatever
...
    
Inc(I, 2);
  
end;
  
//Or
  
repeat
    Whatever
...
    
Inc(I, 2);
  
until
    I Condition
;
end; 
ما الذي تود فعله؟
السلام عليكم

على حسب ما أعرف :

الحلقة for في السي++ هي مجرد عداد Counter مثل

PHP كود :
for (int icounter = x ; counter <= 10 ; counter++ ) {statement } 

أي أنه يأخذ قيم من نوع Integer عدد صحيح ولكن المسألة مختلفة في دلفي فالحلقة for تقوم باللإنتقال
ضمن قيم من نوع ترتيبي وليس شرطاً أن تكون عدداً صحيحاً

PHP كود :
type
  TDay 
= (Sun, Mon, Tues, Wed, thurs, Fri, Sat );

var
  
Week: array [Sun..Sat]of String;
  
Day: TDay;
begin
  
{ TODO -oUser -cConsole Main : Insert code here }
  for 
Day:= Sun to Sat do
      
ReadLn(Week[Day]);
  for 
Day:= Sun to Sat do
      
WriteLn(Week[Day]);
end. 

لم نستخدم أعداداً أبداً لأن المسألة تتعلق بنمط ترتيبي وجب أن يكون متتاليا حصراً , **** التصحيح في حال وجود خطأ
السلام عليكم و رحمة الله و بركاته

هذه حلقة for تقوم بكتابة كل الأعداد الزوجية من 0 حتى 100 في لغة الباسكال و يمكن ان تستفيد منها في الدلفي فهي مثلها تماما لاختلاف readln و writeln

PHP كود :
var
   
c : integer;
   
A:  integer;
begin
     A
:=0;
     for 
c := 0 to 50 do
     
begin
        writeln 
(A);
        
A:=A+2;
     
end;

end. 

ليس ذلك ما قصدته إخواني
مثلا الطريقة التي تحدثت عنها تكتب هكذا في VB
كود :
for i=1 to 10 stup2 ........... .......
في سي++ هكذا مثلا
كود :
for (int i=1;i<10;i+2 ){.........}
----------
أما في الدلفي فأقصد الأمر أن يكون في رأس الحلقة وليس مع كتلة الأوامر
ألم تقنعك دلفي ؟ Smile:
1- كل لغة برمجة لها Code Syntax يميزها و أن تشابهت .
2- يمكننا أن نفعل نفس الشيئ كالدالة iiF , تجد الشرح & التطبيق في المجلة رقم 2 لـ D4A
3- مثال :

PHP كود :
Procedure uFor(i:Integer;Const Max:Integer;Step:Byte;MyJob:Pointer);
Begin
 
If MyJob = Nil Then Exit;
 
i:= 0;
  
repeat
   Asm
    MOV EAX
,MyJob
    CALL EAX
   End
;
    
Inc(i, Step);
    
Sleep(100);
  
until i >= max;
End; 
طريقة الإستدعاء :
PHP كود :
Procedure Job;
 
Begin
   
//do something
 
End;

//procedure TForm1.btnClick(Sender: TObject);
Var
  
i:Integer;
begin
 uFor
(i,10,2,@Job);
end; 
بالتوفيق ,,
السلام عليكم

اخى TF6M بما انك ذكرت الاسمبلى احببت ان انجز عدد معين من الحلقات كل حلقة ترسل MSG مثلا
لاكن بشرط عدم استعمال لا IF ولا THEN ...
... تقريبا وصلت للحل لاكن للاسف بعد الخروج من الحلقة يحدث مشكل يتسبب فى غلق البرنامج
لم اجد له حل سوى حل عشوائى pop ds Smile

PHP كود :
var
  
S: string;
begin
  S 
:= 'D4A';
  try
    
asm
      mov eax
, 0
      mov ebx
, 3  // 1..3 (Loop = 3)

      
@Localproc:
        
cmp ebx, eax
        jl 
@Skipcall
        call 
@_Localproc

      
@_Localproc:
        
mov eax, S
        call ShowMessage
        mov eax
,1
        dec ebx
        jmp  
@Localproc

      
@Skipcall:
        
pop ds   -----------> ???? :)
    
end;
  
except
    
Exit;
  
end;
end; 

الذى لديه طريقة ... يرفقهة Smile
الاسمبلى صعبة لكنها ممتعة .
و عليكم السلام و رحمة الله و بركاته
1- "لاكن بشرط عدم استعمال لا IF ولا THEN ... "
- يمكن أيضا إستخدام توجيهات المترجم {..... Define$}ا
2- "لم اجد له حل سوى حل عشوائى pop ds"
- ما الغرض من إسترجاع قيمة DS ؟
3- عند إستدعاء دالة & إجراء من الدي يظمن عدم تغير المسجلات ؟
بالطبع ستكون في حالة عمل , لذا وجب علينا حفظ القيم الإبتدائية و إسترجاعها
عند المقارنة :


PHP كود :
var
  
S: string;
begin
  S 
:= 'D4A';
  try
  
Asm
  PushAd
  
Xor al,al
    
@Loop:Cmp al,2//nLop
          
JE @ExitpRoc
         PushAd
            Push 0
            Push 0
            Push S
            Push 0
            Call MessageBoxA
         PopAd
        Inc al
        Jmp 
@Loop
  
@ExitpRoc:PopAd
  End
;
  
except
    
Exit;
  
end;
end; 
بالتوفيق,,
اوووو اخى TF6M
رائعة ... ممتازة . Smile

كود :
ما الغرض من إسترجاع قيمة DS ؟

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

كود :
- عند إستدعاء دالة & إجراء من الدي يظمن عدم تغير المسجلات ؟ [COLOR="Red"]PushAd PopAd[/COLOR]
... نعم هذا هو اهم شىء .

بارك الله فيك اخى TF6M ساراجع طريقتك جيدا وان لم افهم شىء ساراسلك

بالتوفيق .
MessageBoxA هي API تحتاج PChar ليس Delphi's internal string
PHP كود :
var
 
S,_S: String;
begin
{*
MessageBoxA MessageBoxA is an API function
it uses PChar and not Delphi's internal string ...!
*}
   S := '
D4A';
  _s:='
Test';
  try
  Asm
  PushAd
  Xor al,al
    @Loop:Cmp al,2//nLop
          JE @ExitpRoc
         PushAd
            //MessageBoxA (0,PAnsiChar(_s),PAnsiChar(s),0);
              push dword ptr 0
              push dword ptr _s // MessageBox Title
              push dword ptr  s  // MessageBox Text
              push dword ptr 0
            Call MessageBoxA
         PopAd
        Inc al
        Jmp @Loop
  @ExitpRoc:PopAd
  End;
  except
    Exit;
  end; 
الرد هو اظافة لكود اخي tf6m
الصفحات : 1 2