我们公司准备在元旦晚会上举行一次抽奖活动,公司现在要我做个系统来实现它,功能是:每点击一下“抽奖”按钮,就会显示出一个员工的ID号,也就是中奖人的卡号,为了公平起见,下次再点击“抽奖”按钮时,上次产生的ID号在下次不再产生,也就是说下次点击产生的ID号只能是从没有产生过的ID号中产生,请问怎么在DELPHI里编程实现,我把所有员工的ID号(00001-09999)极相关的情况全
都输入数据表RS里了。如果能把写好的程序发给我那就更好了,我的QQ是363054249,MAIL:[email protected],盼望中。程序出来马上放分!!

解决方案 »

  1.   

    首先建立一个记录指针类型:
      PRec = ^TRec;
      TRec = record
        ID: String;
        Name: String;
        //还可扩展其他信息
      end;建立一个全局变量:
    var
      recList: TList;在需要装入员工ID的事件里:
    var
      Rec: PRec;
    begin
      If not Assigned(recList) then
        recList := TList.Create;
      ……
      while not Query.Eof do  //遍历记录集把相关信息装入指针链表recList中;
      begin
        New(Rec);
        Rec^.ID := Query.FieldByName('ID').AsString;
        Rec^.Name := Query.FieldByName('Name').AsString;
        Query.Next;
      end;开始抽奖;
    var
      i: Integer;
      LuckID: String;
    begin
      Randomize;
      i := Ramdom(recList.Count);
      //下面得到了幸运ID
      LuckID := PRec(recList.Items[i])^.ID;
      LuckName := PRec(recList.Items[i])^.Name;
      //然后删除该指针,避免下次重复抽取
      dispose(PRec(recList.Items[i]));
      recList.Delete[i];
      //抽奖成功,可以继续下次抽奖!
    end;最后不要忘记释放这个指针链表!
      while recList.Items[0] <> nil then
      begin
        dispose(PRec(recList.Items[i]));
        recList.Delete[0];
      end;
      

  2.   

    错了!最后释放指针的部分应该是:
      while recList.Items[0] <> nil then
      begin
        dispose(PRec(recList.Items[0]));
        recList.Delete[0];
      end;
      

  3.   

    1.初始化:先把员工ID列表载入链表中(数组链表)
    2.显示滚动过程:随机显示员工中任意iD
    3.正式抽取:产生一个随机的链表位置(即数组下标),如果这个链表位置的员工没有被抽取过(非0),则取出作为幸运儿,否则产生下一个;取出后标记为被抽取过(置0)。程序已经发到邮箱
      

  4.   

    >>>>>>如果能把写好的程序发给我那就更好了
    我也希望有人免费帮我干点活,工作量不大!!!!
      

  5.   

    是啊,我知道这个不是很难,但我是刚学DELPHI,所以就有点困难了
      

  6.   

    如果能把写好的程序发给我那就更好了,我的QQ是363054249,MAIL:[email protected],盼望中。程序出来马上放分!!------------------------------------------
    无语了……
    现在的年轻人……
      

  7.   

    163.com的邮箱收不到信吗?我已经发过了哦
      

  8.   

    哈 乍想一下很简单  只不过要从1~10000 中间产生  N个不重复的数  我不建议使用重了再点的方法,既然是抽奖  在逻辑和实现过程中就根本不应该出现这种情况,随然运行起来效果一样。  可以按照  抽扑克的方法 54张抽1张  将抽到的和第54张换,再从前53张中抽1张  抽到的和第53张换。怎么抽也不会重的但我有想了些问题,既然你们公司搞这么正规  你有没有考虑过 抽了一半  系统退出 或掉电的意外情况的处理,那么 你必须有个INI文件 或表 记录已经抽到的人  下次系统进入后 先把已经抽到的排除出去,我建议你应该考虑一下这种情况
      

  9.   

    to songyanbin(孤叶):
      还是你细心啊!!!
      

  10.   

    用一个stringlist,抽出一个就delete,用一个临时变量保存,然后继续,退出的时候生成一个TXT作为获奖名单...很简单,十分钟的程序,为什么不自己做?
      

  11.   

    to songyanbin(孤叶):
    說得有道理,想得周到,但我有個這樣的顧慮:那我這個程序具不是只能用一次,或許我們公司明年,后年
    還要用這個程序那怎么辦呢。