PDA

View Full Version : سوال در مورد دستور randomize



Valadi
یک شنبه 14 مرداد 1386, 19:29 عصر
من در پروژه 4 تا فرم دارم و فرم اول فرم اصلی و بقیه فرمها فرعی است دستور randomize را استفاده کردم به این شکل
randomize;
case (random(3)+1) of
1:Form2.Show;
2:Form3.Show;
3:Form4.Show;
end;

حالا می خوام وقتی فرم 2 نشان داد دیگر فرم 2 نشان ندهد (3 مولفه ) و حالا فقط از بین فرم 3 و 4 را یک فرم را بصورت رندمی انتخاب کند (2 مولفه ) و دفعه بعد فقط یک مولفه می ماند که باید نشان دهد آیا این مسئله امکان دارد ؟

SYNDROME
یک شنبه 14 مرداد 1386, 19:51 عصر
با سلام

من در پروژه 4 تا فرم دارم و فرم اول فرم اصلی و بقیه فرمها فرعی است دستور randomize را استفاده کردم به این شکل
randomize;
case (random(3)+1) of
1:Form2.Show;
2:Form3.Show;
3:Form4.Show;
end;

حالا می خوام وقتی فرم 2 نشان داد دیگر فرم 2 نشان ندهد (3 مولفه ) و حالا فقط از بین فرم 3 و 4 را یک فرم را بصورت رندمی انتخاب کند (2 مولفه ) و دفعه بعد فقط یک مولفه می ماند که باید نشان دهد آیا این مسئله امکان دارد ؟
فکر کنم این لینک کارتو راه بندازه.
http://barnamenevis.org/forum/showthread.php?t=10243&highlight=randomize
موفق باشی

hossein taghi zadeh
یک شنبه 14 مرداد 1386, 19:55 عصر
با سلام

بجای تابع Random از این تابع استفاده کنید.



Function Rand(X: Byte; Var Arr: Array Of Boolean): Byte;
Var
I: Byte;
B: Boolean;
Res: Byte;
Begin
Result := 0;

Repeat
B := True;
For I := Low(Arr) To High(Arr) Do B := B And Arr[I];
Randomize;
Res := Random(X) + Offset;

If Not Arr[Res] Then
Begin
Arr[Res] := True;
Result := Res;
Exit;
End;

Until B;
End;


در ضمن این ثوابت و متغیرها رو هم تعریف کنید و مقدار هر درایه آرایه IntArr را بصورت پیش فرض False قرار دهید.



Const
Offset = 2;
FrmCount = 3;

Var
IntArr: Array[Offset..Offset+FrmCount-1] Of Boolean;

و تابع را این طور فراخوانی کنید.


Rand(3, IntArr);

Valadi
یک شنبه 14 مرداد 1386, 20:35 عصر
کسی از دوستان سورسی در این زمینه ندارد بد جوری گیر افتادم
کمک کنید

Batman
یک شنبه 14 مرداد 1386, 21:57 عصر
با سلام
جناب valadi عزیز میتونی یه متغییر کمکی به اسم مثلا index بذاری و هر بار که یه فرم فراخوانی شد مثلا به مقدار index یه دونه اضافه بشه (البته index به تعداد فرم ها باشه)
اگه خواستی یه مثال برات میذارم
موفق باشید

SYNDROME
یک شنبه 14 مرداد 1386, 22:09 عصر
با سلام
می توانی از کد زیر ه استفاده کنی.


case (random(3)+1) of
1:
Begin
IF Form2.Tag = 0 Then
Form2.Show;
Form2.Tag := 1;
End;
2:
Begin
IF Form3.Tag = 0 Then
Form3.Show;
Form3.Tag := 1;
End;
3:
Begin
IF Form4.Tag = 0 Then
Form4.Show;
Form4.Tag := 1;
End;
end;

در مثال بالا زمانی که من یک فرم را نمایش می دهم Tag آن فرم را 1 می کنم و اگر دوباره آن عدد انتخاب شود به توجه Tagاجازه نمای نمی دهد.
حالا شما کافیست همین Caseرا در یک Whileقرار دهید تا بارها اجرا شود و هر بار که تکراری بود دویاره Caseاجرا می شود.
موفق باشید