procedure TfrmViewPic.viewPic();
var 
  i,iTop:Integer;
  img:array of TImage;
begin  if length(img)> 0 then //判断是否已经创建,如果有就删除
  begin
  for i:=0 to Length(img)-1 do
    begin      FreeAndNil(img[i]);
    end;
  end;       SetLength(img,ADOQuery_HY.RecordCount);
  for i :=0 to ADOQuery_HY.RecordCount-1 do
  begin
    iTop:=i;
    img[i]:=TImage.Create(scrollbox1);
    img[i].Parent:=scrollbox1;
    img[i].Stretch:=true;
    img[i].Width:=200;
    img[i].Height:=200;
    img[i].Top:=scrollbox1.Top+20+Trunc((iTop div 3)*220); //每行8个,每个间隔70
    img[i].Left:=scrollbox1.left+20+Trunc((i mod 3)*220);
    if FileExists(pchar(extractfilepath(application.ExeName)+picPath+'\'+trim(adoquery_HY.FieldByName('pic').asstring))) then
         img[i].Picture.LoadFromFile(pchar(extractfilepath(application.ExeName)+picPath+'\'+trim(adoquery_HY.FieldByName('pic').asstring)));
    img[i].OnClick:=Image1Click;
    adoquery_HY.Next;
  end;
end;为什么真正显示的时候并不是从scrollbox1.top和scrollbox1.left处开始显示而是从滚动条位置处开始显示呢?而且创建之前似乎并不能清除以前创建的image控件?

解决方案 »

  1.   

    位置问题已经解决,加一句
    scrollbox1.VertScrollBar.Position:=0;   
    就可以了,让滚动条跑到最前面再画控件
    现在就是清除以前控件问题              for   i:=  scrollbox1.ComponentCount-1  downto 0 do
                  begin
                      scrollbox1.components[i].free;
                  end;           
                  scrollbox1.Refresh;  
    不知能不能算清除呢.
      

  2.   

    要这样清除: 
     for i := ScrollBox1.ControlCount - 1 downto 0 do
        if ScrollBox1.Controls[i] is TImage then
          ScrollBox1.Controls[i].Free;
      

  3.   


     for i := ScrollBox1.ControlCount - 1 downto 0 do 
        if ScrollBox1.Controls[i] is TImage then 
          RemoveControl(ScrollBox1.Controls[i].)
      

  4.   


     for i := ScrollBox1.ControlCount - 1 downto 0 do 
        if ScrollBox1.Controls[i] is TImage then 
          RemoveControl(ScrollBox1.Controls[i])