مشاهدة النسخة كاملة : طريقة التنقل بأكثر من قيمة في حلقة For..؟
khiro.alg
19-08-2010, 02:46 PM
السلام عليكم
أهلا إخواني - رمضان كريم
قبل فترة رأيت حلقة for في السي++ - حيث يمكنك زيدة المتغير في كل مرة بعدد معين
مثلا إن كان التنقل بعدد واحد نكتب ++i . وإن أدرنا أكثر نغيرها مثلا لـ i+2
جربت أنا تحويلها للدلفي - وعد عدة محاولات نجحت في ذلك - لكني الآن نسيت الطريقة :(
لذا أرجـوا لمن عنده الطريقة أن يفيدنا بها وجزاه الله كل خير
------------
للفهم أكثر الطريقة التي جربتها أنا تشبه كالتالي
for i:=0 to 10 (i+2) do
لكن تلك خاطئة - وأيضا ما أقصده ليست طريقة الزيادة داخل أوامر الحلقة - بل في رأس الحلقة.
سلامي لكم...
kachwahed
19-08-2010, 05:16 PM
وعليكم السلام ورحمة الله
var
I: Integer;
begin
while I Condition do begin
Whatever...
Inc(I, 2);
end;
//Or
repeat
Whatever...
Inc(I, 2);
until
I Condition;
end;
ما الذي تود فعله؟
husseint
19-08-2010, 08:12 PM
السلام عليكم
على حسب ما أعرف :
الحلقة for في السي++ هي مجرد عداد Counter مثل
for (int icounter = x ; counter <= 10 ; counter++ ) {statement }
أي أنه يأخذ قيم من نوع Integer عدد صحيح ولكن المسألة مختلفة في دلفي فالحلقة for تقوم باللإنتقال
ضمن قيم من نوع ترتيبي وليس شرطاً أن تكون عدداً صحيحاً
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.
لم نستخدم أعداداً أبداً لأن المسألة تتعلق بنمط ترتيبي وجب أن يكون متتاليا حصراً , **** التصحيح في حال وجود خطأ
مبرمج مبتدأ
19-08-2010, 09:44 PM
السلام عليكم و رحمة الله و بركاته
هذه حلقة for تقوم بكتابة كل الأعداد الزوجية من 0 حتى 100 في لغة الباسكال و يمكن ان تستفيد منها في الدلفي فهي مثلها تماما لاختلاف readln و writeln
var
c : integer;
A: integer;
begin
A:=0;
for c := 0 to 50 do
begin
writeln (A);
A:=A+2;
end;
end.
khiro.alg
19-08-2010, 11:06 PM
ليس ذلك ما قصدته إخواني
مثلا الطريقة التي تحدثت عنها تكتب هكذا في VB
for i=1 to 10 stup2
...........
.......
في سي++ هكذا مثلا
for (int i=1;i<10;i+2 ){.........}
----------
أما في الدلفي فأقصد الأمر أن يكون في رأس الحلقة وليس مع كتلة الأوامر
ألم تقنعك دلفي ؟ :):
1- كل لغة برمجة لها Code Syntax يميزها و أن تشابهت .
2- يمكننا أن نفعل نفس الشيئ كالدالة iiF , تجد الشرح & التطبيق في المجلة رقم 2 لـ D4A
3- مثال :
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;طريقة الإستدعاء :
Procedure Job;
Begin
//do something
End;
//procedure TForm1.btnClick(Sender: TObject);
Var
i:Integer;
begin
uFor(i,10,2,@Job);
end;بالتوفيق ,,
hanipino
20-08-2010, 10:31 AM
السلام عليكم
اخى TF6M بما انك ذكرت الاسمبلى احببت ان انجز عدد معين من الحلقات كل حلقة ترسل MSG مثلا
لاكن بشرط عدم استعمال لا IF ولا THEN ...
... تقريبا وصلت للحل لاكن للاسف بعد الخروج من الحلقة يحدث مشكل يتسبب فى غلق البرنامج
لم اجد له حل سوى حل عشوائى pop ds :)
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;
الذى لديه طريقة ... يرفقهة :)
الاسمبلى صعبة لكنها ممتعة .
و عليكم السلام و رحمة الله و بركاته
1- "لاكن بشرط عدم استعمال لا IF ولا THEN ... "
- يمكن أيضا إستخدام توجيهات المترجم {..... Define$}ا
2- "لم اجد له حل سوى حل عشوائى pop ds"
- ما الغرض من إسترجاع قيمة DS ؟
3- عند إستدعاء دالة & إجراء من الدي يظمن عدم تغير المسجلات ؟
بالطبع ستكون في حالة عمل , لذا وجب علينا حفظ القيم الإبتدائية و إسترجاعها
عند المقارنة :
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;
بالتوفيق,,
hanipino
20-08-2010, 09:25 PM
اوووو اخى TF6M
رائعة ... ممتازة . :)
ما الغرض من إسترجاع قيمة DS ؟
هو فقط من كان يمنع البرنامج من غلق نفسه بعد حدوث المشكل
- عند إستدعاء دالة & إجراء من الدي يظمن عدم تغير المسجلات ؟
PushAd
PopAd
... نعم هذا هو اهم شىء .
بارك الله فيك اخى TF6M ساراجع طريقتك جيدا وان لم افهم شىء ساراسلك
بالتوفيق .
mohfa
20-08-2010, 10:23 PM
MessageBoxA هي API تحتاج PChar ليس Delphi's internal string
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
hanipino
21-08-2010, 02:49 PM
شكرا اخى TF6M على التوضيح.
شكل و ترتيب برمترات الدالة MessageBoxA
push dword ptr 0 // MB_OK
push dword ptr _s // MessageBox Title
push dword ptr s // MessageBox Text
push dword ptr 0 // hOwner = NULL (Handle)
Call MessageBoxA
vBulletin® , Copyright ©2008-2012