easyDelphi Q&A
+4 تصويتات
78 مشاهدات
على سبيل المثال ، عندي خمسين آية قرآنية وكل يوم عايز اعرض آية منهم بحيث يختار من الآيات بشكل عشوائي لكن لا يكرر عرض آية مرتين إلا بعد ان يتأكد من عرض الخمسين آيه كلهم سابقاً
سُئل في تصنيف Delphi بواسطة (350 نقاط) | 78 مشاهدات
 

2 إجابة

+2 تصويتات
ابسط حل
اجمعها بقائمة list ، اختر عشوائيا منها، العنصر الذي ا خترته، احذفه، خزنها، ارجع تاني يوم اسحبها، اختر ، احذف خزن، حتى تصبح فارغة، حملها مرة ثانية.
تم الرد عليه بواسطة (11,910 نقاط)
انا لا اريد انا اختار انا عشوائيا اريد دالة تقوم بهذا بدلا مني
جزاك الله خيرا
+1 تصويت

استعمل ملفين نصين احدهما فيه العناصر, والثاني اتركه فارغ 

هذا مثال تجريبي  

تم استعمال عنصري Memo للمعاينة, كل مرة تقوم باختيار عشوائ راقب الملفين للتاكد

unit URandomText;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm3 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    Procedure ChooseRandomly(var S,SL2: TStringList;Var StrL:string);
    { Public declarations }
  end;

var
  Form3: TForm3;
  L1,L2: TextFile;
  CountLin,I:Integer;
  Str,strL:string;
  S,Sl2: TStringList;
implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
begin

ChooseRandomly(S,SL2,Strl);
rewrite(L2);
Memo2.Clear;
CountLin:= sl2.Count;
FOR i := 0 to CountLin-1 do
  begin
  StrL:=SL2.KeyNames[i];
  memo2.Lines.Add(StrL);
  writeln(L2,StrL);
  CountLin:=CountLin+1;
  end;
closefile(L2);

rewrite(L1);
Memo1.Clear;
CountLin:= S.Count;
FOR i := 0 to CountLin-1 do
  begin
  StrL:=S.KeyNames[i];
  memo1.Lines.Add(StrL);
  writeln(L1,StrL);
  CountLin:=CountLin+1;
  end;
closefile(L1);


end;


procedure TForm3.ChooseRandomly(VAR S,SL2: TStringList;Var StrL:string);
Var
  CountLin,Rx,CounSL2,I:Integer;
  Str:string;
begin
CountLin:=S.Count ;

if CountLin>0 then
  begin
    Rx:=(Random(100*CountLin)Div 100);
    SL2.Add(S.KeyNames [Rx]);
    str:=S.KeyNames [Rx];
    ShowMessage(Str);
    S.Delete(Rx);
  end;
CounSL2:=SL2.Count;
if CountLin=1 then
  begin
    S.Clear;
    FOR i := 1 to CounSL2 do
    begin
      s.Add(SL2.KeyNames[I-1])
    end;
    SL2.Clear;
  end;

end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
s.Free ;
SL2.free;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
S := TStringList.Create;
Sl2:=TStringList.Create;
assignfile(L1,'C:\RandomText\List1.txt');
assignfile(L2,'C:\RandomText\List2.txt');
reset(L1);
CountLin:=0;
while not eof(L1) do
begin
  readln(L1,Str);
  memo1.Lines.Add(Str);
  s.Add(Str);
  CountLin:=CountLin+1;
end;
reset(L2);
CountLin:=0;
while not eof(L2) do
begin
  readln(L2,StrL);
  memo2.Lines.Add(StrL);
  SL2.Add(StrL);
  CountLin:=CountLin+1;
end;
closefile(L1);
closefile(L2);
end;

end.

 

تم الرد عليه بواسطة (4,210 نقاط)
ليس افضل حل ولكنه يفي بالمطلوب.
كأنك اشتغلت له المشروع بنفسك.
لا اعرف اذا كانت سياسية الموقع تقبل بحل المشروع بالكامل
جزاك الله خيرا على هذا الجهد المبذول
الى اخ زاهر Zaher , حاولت ان اضع دالة تكون مدخلاتها متغيرات من نوع ملف نصي"TextFile", لكن لم استطع,لذالك قمت بجعل المتغيرات من نوع TStringList
وجزاك الله خيراً.
انا جربت اشغل برنامجك لكن هذه الرسالة دائما تظهر لي  
invalid file name - S%  
ثم عندما نفذته عندي ظهرت نفس الرسالة ، ارجو الحل
هل قمت بتغير مسار الملففي الكود حسب المسار عندك
قم بتغير 'C:\RandomText\List1.txt الى المسار الخاص بك
تمام ، برنامج رائع ، جزاك الله خيراً
حل مبالغ فيه جدا جدا جدا ..
عمل كثير .. كود كثير ..
شكرا لك, ولكن هذا ماوصلت اليه, حاولت انشاء دالة تكون مدخلاتها ملفات نصية ولكن لم ينجح الامر

اسئلة متعلقة

+5 تصويتات
4 إجابة
+2 تصويتات
1 إجابة
سُئل يوليو 21 في تصنيف Delphi بواسطة Amar Gozim (10,480 نقاط) | 49 مشاهدات
+2 تصويتات
1 إجابة
+3 تصويتات
2 إجابة
سُئل أغسطس 24 في تصنيف Delphi بواسطة Yamada Fakir (1,330 نقاط) | 57 مشاهدات
ادعُ اصدقائك في الفايسبوك لمشاركتك

مرحبًا بك إلى EasyDelphi Q&A، حيث يمكنك طرح الأسئلة والحصول على الإجابة عليها من المستخدمين الآخرين.

لا يسمح بطلب او السؤال عن كراك او تفعيل او كسر او فك او اي شيء يخالف اتفاقيات الترخيص  مهما كان السبب ومهما كان البرنامج ونوعه. ولا حتى نشر روابط تحتوي على مثل هذه الاشياء لا في الاسئلة ولا في الاجابات ولا التعليقات . نهائيا

280 سؤال
486 إجابة
866 تعليق
175 مستخدم