最近老师要求我们模拟页面置换的先进先出,在进行页面置换的时候,我希望先对页面名称进行比较,一样的话,就没必要进行置换.procedure TForm1.Button3Click(Sender: TObject);
  var h,m:integer; flag:boolean;
begin     flag:=true;
     for h:=1 to listbox1.ItemIndex do
     // h作为新进页面与已有页面的比较的控制循环变量
      begin
         if  sametext(edit2.Text,listbox1.Items[h])then
              begin
              flag:=false; // 物理块中存在与新进页面一样的页面
              end
         else
              begin
              flag:=true;//新进页面在物理块中没有
               end;
       end;
    if flag=false then
        begin
        showmessage('页面已存在,不需要置换');
        edit2.Clear;
        edit2.SetFocus;
        end
   else
        begin     //根据fifo算法 进行替换
        m:=i mod strtoint(edit1.Text);
        listbox1.Items[m]:=edit2.Text;
        edit2.Clear;
        edit2.SetFocus;
        i:=i+1;
        end;
end;但是无论我输入什么变量,他会进行置换,不管是不是存在相同的页面,然而我也怀疑是sametext相同的话,返回的值是false,试过也不行,也用过(<>),和另外一个函数,但是都没用,感觉好像没进行比较这一步....???  请问大家这是怎么回事,多谢!!!!

解决方案 »

  1.   

    //你的代码风格太差,难道你们老师就没说过你?
    //你照着VCL里的代码风格编写
    //这个问题关键是在循环中赋值又没有退出循环,那当然flag值就是最后一条判断出来的值
    //参考如下代码:  flag := True;
      for h := 0 to Listbox1.ItemIndex do
      // h作为新进页面与已有页面的比较的控制循环变量
      begin
        if SameText(Edit2.Text, Listbox1.Items[h])then
        begin
          flag := False; // 物理块中存在与新进页面一样的页面
          Break; // <<<<<<<<<<<<<<<<<退出循环
        end;
      end;
      

  2.   

    for h:=1 to listbox1.ItemIndex do -----------------------------------你的问题是程序没有执行h作为新进页面与已有页面的比较的控制循环变量,而Flag的初始值为True,为什么没有执行呢,你把循环按下面改一下就可以了.for h:=0 to pred(listbox1.Items.count) do
      

  3.   

    谢谢你们 照你们的改后,程序可以达到我预期的效果了 zswang :关于代码风格的问题,我以后会注意的 你的代码很精简,从中我也看出了我的问题.但是在循环控制的那个部分也要照sanmaotuo的改   呵呵,经过你们俩的指导,我学到了东西,谢谢