Delphi获取scrollbox的下拉事件

juno_393 2016-12-05 05:21:51
Delphi的scrollbox的下拉条下拉没有触发事件么,应该怎么获取它的下拉事件
...全文
292 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
不得闲 2016-12-06
  • 打赏
  • 举报
回复
那就需要你下载的加载内容上做处理,比如说你规定一页是20个,那么你就需要标记当前的内容个数,每次加载最多加载20个。这个应该好处理
juno_393 2016-12-06
  • 打赏
  • 举报
回复
引用 2 楼 suiyunonghen 的回复:
滚动条么?你可以拦截ComboWndProc过程,然后处理WM_VScroll的滚动消息,就行了。
我拦截了滚动消息,但是发现。确实实现了在滚动时进行加载。但是只要我一下拉,就会把剩下所有的图片全部加载出来了。一下是我的代码。请问应该怎么实现一次加载一页啊、
procedure TfmSearch.NewScrollBoxWindowProc(var Message: TMessage);
var
    Pace,i,j:   Integer;
    m:string;
begin
  if   Message.Msg   =   WM_VScroll   then
  begin
      Pace   :=   Message.wParam   ;
      if   Pace   >   120   then
      begin
        scrlbxScreen.VertScrollBar.Position   :=   scrlbxScreen.VertScrollBar.Position   +   10 ;
        if PFindList.Count>12 then
        begin
          for i:=0 to 11 do
          begin
            m:= PFindList.Strings[i];
            if (ExtractFileExt(PFindList.Strings[i])='.jpg') or (ExtractFileExt(PFindList.Strings[i])='.gif') or (ExtractFileExt(PFindList.Strings[i])='.png') then
            begin
              if  not FileExists(SaveDir+Copy(m,LastDelimiter('/',m)+1,Length(m))) then
              fmKnowledge.DownLoadFile(UTF8Encode(HeadUrl+'/'+m),SaveDir+Copy(m,LastDelimiter('/',m)+1,Length(m)));
            end;
            if (ExtractFileExt(PFindList.Strings[i])='.doc') or (ExtractFileExt(PFindList.Strings[i])='.docx') then
            begin
              SaveUrl:=SaveDir+'Word.jpg';
            end else
            if ExtractFileExt(PFindList.Strings[i])='.txt' then
            begin
              SaveUrl:=SaveDir+'Txt.jpg';
            end else
            if (ExtractFileExt(PFindList.Strings[i])='.ppt') or (ExtractFileExt(PFindList.Strings[i])='.pptx') then
            begin
              SaveUrl:=SaveDir+'Ppt.jpg';
            end  else
            if (ExtractFileExt(PFindList.Strings[i])='.mp4') or (ExtractFileExt(PFindList.Strings[i])='.avi')
            or (ExtractFileExt(PFindList.Strings[i])='.qlv') then
            begin
              SaveUrl:=SaveDir+'movie.jpg';
            end else
            if ExtractFileExt(PFindList.Strings[i])='' then
            begin
              SaveUrl:=SaveDir+'Packge.jpg';
            end else
            if (ExtractFileExt(PFindList.strings[i])='.html') then
            begin
              SaveUrl:=SaveDir+'Html.jpg';;
            end else
            if (ExtractFileExt(PFindList.Strings[i])='.jpg') or (ExtractFileExt(PFindList.Strings[i])='.png')
            or (ExtractFileExt(PFindList.Strings[i])='.gif') then
            begin
              SaveUrl:=SaveDir+Copy(PFindList.Strings[i],LastDelimiter('/',PFindList.Strings[i])+1,Length(PFindList.Strings[i]));;;
            end;
            ShowImg(SaveUrl,PFindList.Strings[i]);
          end;
          for j:=11 downto 0 do
          begin
            PFindList.Delete(j);
          end;
        end else
        begin
          for i:=0 to PFindList.Count-1 do
          begin
            m:= PFindList.Strings[i];
            if (ExtractFileExt(PFindList.Strings[i])='.jpg') or (ExtractFileExt(PFindList.Strings[i])='.gif') or (ExtractFileExt(PFindList.Strings[i])='.png') then
            begin
              if  not FileExists(SaveDir+Copy(m,LastDelimiter('/',m)+1,Length(m))) then
              fmKnowledge.DownLoadFile(UTF8Encode(HeadUrl+'/'+m),SaveDir+Copy(m,LastDelimiter('/',m)+1,Length(m)));
            end;
            if (ExtractFileExt(PFindList.Strings[i])='.doc') or (ExtractFileExt(PFindList.Strings[i])='.docx') then
            begin
              SaveUrl:=SaveDir+'Word.jpg';
            end else
            if ExtractFileExt(PFindList.Strings[i])='.txt' then
            begin
              SaveUrl:=SaveDir+'Txt.jpg';
            end else
            if (ExtractFileExt(PFindList.Strings[i])='.ppt') or (ExtractFileExt(PFindList.Strings[i])='.pptx') then
            begin
              SaveUrl:=SaveDir+'Ppt.jpg';
            end  else
            if (ExtractFileExt(PFindList.Strings[i])='.mp4') or (ExtractFileExt(PFindList.Strings[i])='.avi')
            or (ExtractFileExt(PFindList.Strings[i])='.qlv') then
            begin
              SaveUrl:=SaveDir+'movie.jpg';
            end else
            if ExtractFileExt(PFindList.Strings[i])='' then
            begin
              SaveUrl:=SaveDir+'Packge.jpg';
            end else
            if (ExtractFileExt(PFindList.strings[i])='.html') then
            begin
              SaveUrl:=SaveDir+'Html.jpg';;
            end else
            if (ExtractFileExt(PFindList.Strings[i])='.jpg') or (ExtractFileExt(PFindList.Strings[i])='.png')
            or (ExtractFileExt(PFindList.Strings[i])='.gif') then
            begin
              SaveUrl:=SaveDir+Copy(PFindList.Strings[i],LastDelimiter('/',PFindList.Strings[i])+1,Length(PFindList.Strings[i]));;;
            end;
            ShowImg(SaveUrl,PFindList.Strings[i]);
          end;
          for j:=PFindList.Count-1 downto 0 do
          begin
            PFindList.Delete(j);
          end;
        end;
      end else
      begin
         scrlbxScreen.VertScrollBar.Position   :=   scrlbxScreen.VertScrollBar.Position   -   10;
      end;

  end;
  OldScrollBoxWindowProc(Message);
end;
juno_393 2016-12-06
  • 打赏
  • 举报
回复
引用 1 楼 lyhoo163 的回复:
可以通过设置此属性,变动下滑块的位置 ScrollBox1.VertScrollBar.Position:=0; // 位置首位 让鼠标滚动,游标跟动:

procedure TShowStaffFrm.ScrollBox1MouseWheel(Sender: TObject;
  Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
  var Handled: Boolean);
begin
  if WheelDelta <0 then
    scrollbox1.Perform(WM_VSCROLL,SB_LINEDOWN,0)
  else
    scrollbox1.Perform(WM_VSCROLL,SB_LINEUP,0);
end;
这个只是绑定了鼠标滚轮的操作啊。我现在想要的是在scrollbox中显示网页上的图片,因为图片过多。所以我想初始时加载一部分,然后scrollbox枚下拉一下就加载一页。
不得闲 2016-12-06
  • 打赏
  • 举报
回复
滚动条么?你可以拦截ComboWndProc过程,然后处理WM_VScroll的滚动消息,就行了。
lyhoo163 2016-12-06
  • 打赏
  • 举报
回复
可以通过设置此属性,变动下滑块的位置 ScrollBox1.VertScrollBar.Position:=0; // 位置首位 让鼠标滚动,游标跟动:

procedure TShowStaffFrm.ScrollBox1MouseWheel(Sender: TObject;
  Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
  var Handled: Boolean);
begin
  if WheelDelta <0 then
    scrollbox1.Perform(WM_VSCROLL,SB_LINEDOWN,0)
  else
    scrollbox1.Perform(WM_VSCROLL,SB_LINEUP,0);
end;
juno_393 2016-12-06
  • 打赏
  • 举报
回复
OK,搞定了。谢谢各位大神,按照DelphiGuy大神说的做出来了。谢谢
  • 打赏
  • 举报
回复
这个没有什么难度啊,就一个整形变量(比如叫i),初始值是0,向上滚动每次减12,向下滚动每次加12,当然最小是0,最大是TStringList.Count - 1,然后从TStringList.Strings[i]开始读12个文件名(也可能少于12个,要判断一下),装载到12个TImage中就可以了。
juno_393 2016-12-06
  • 打赏
  • 举报
回复
引用 11 楼 juno_393 的回复:
[quote=引用 10 楼 DelphiGuy 的回复:] [quote=引用 9 楼 juno_393 的回复:] [quote=引用 8 楼 DelphiGuy 的回复:] 不用那么复杂,比如你每页显示12个图片,那在scrollbox中预先放12个空白的TImage(可以配置每页显示多少个),重复使用,滚动条滚动的时候吧下载到的图片assign到这12个TImage上去就可以了。
这个我想过,不行啊。因为我是读的网页图片。图片路径存在STRINGLIST中。比如,stringlist中有30张图片。我第一次读12张,然后会把这12条路径删除掉,然后下拉时读接下来的12条。显示了继续删除。按你的做法,没办法实现向上滚动啊、[/quote] 按你现在的做法,越向下滚动,scrollbox里的图片越多,最后还是所有图片都在里面了,就没有必要分页了么。 不必每次把stringlist里的12条路径删除掉,而是设置一个index指示当前显示的第一个图片是那一条就可以了。 [/quote] 对啊,就是要加载所有图片。分页是因为如果一开始就加载所有图片那么会很慢,图片过多就会导致崩溃。所以想下拉时进行加载[/quote] 能否指点一下,怎么设置指针么?
juno_393 2016-12-06
  • 打赏
  • 举报
回复
引用 10 楼 DelphiGuy 的回复:
[quote=引用 9 楼 juno_393 的回复:] [quote=引用 8 楼 DelphiGuy 的回复:] 不用那么复杂,比如你每页显示12个图片,那在scrollbox中预先放12个空白的TImage(可以配置每页显示多少个),重复使用,滚动条滚动的时候吧下载到的图片assign到这12个TImage上去就可以了。
这个我想过,不行啊。因为我是读的网页图片。图片路径存在STRINGLIST中。比如,stringlist中有30张图片。我第一次读12张,然后会把这12条路径删除掉,然后下拉时读接下来的12条。显示了继续删除。按你的做法,没办法实现向上滚动啊、[/quote] 按你现在的做法,越向下滚动,scrollbox里的图片越多,最后还是所有图片都在里面了,就没有必要分页了么。 不必每次把stringlist里的12条路径删除掉,而是设置一个index指示当前显示的第一个图片是那一条就可以了。 [/quote] 对啊,就是要加载所有图片。分页是因为如果一开始就加载所有图片那么会很慢,图片过多就会导致崩溃。所以想下拉时进行加载
  • 打赏
  • 举报
回复
引用 9 楼 juno_393 的回复:
[quote=引用 8 楼 DelphiGuy 的回复:] 不用那么复杂,比如你每页显示12个图片,那在scrollbox中预先放12个空白的TImage(可以配置每页显示多少个),重复使用,滚动条滚动的时候吧下载到的图片assign到这12个TImage上去就可以了。
这个我想过,不行啊。因为我是读的网页图片。图片路径存在STRINGLIST中。比如,stringlist中有30张图片。我第一次读12张,然后会把这12条路径删除掉,然后下拉时读接下来的12条。显示了继续删除。按你的做法,没办法实现向上滚动啊、[/quote] 按你现在的做法,越向下滚动,scrollbox里的图片越多,最后还是所有图片都在里面了,就没有必要分页了么。 不必每次把stringlist里的12条路径删除掉,而是设置一个index指示当前显示的第一个图片是那一条就可以了。
juno_393 2016-12-06
  • 打赏
  • 举报
回复
引用 8 楼 DelphiGuy 的回复:
不用那么复杂,比如你每页显示12个图片,那在scrollbox中预先放12个空白的TImage(可以配置每页显示多少个),重复使用,滚动条滚动的时候吧下载到的图片assign到这12个TImage上去就可以了。
这个我想过,不行啊。因为我是读的网页图片。图片路径存在STRINGLIST中。比如,stringlist中有30张图片。我第一次读12张,然后会把这12条路径删除掉,然后下拉时读接下来的12条。显示了继续删除。按你的做法,没办法实现向上滚动啊、
  • 打赏
  • 举报
回复
不用那么复杂,比如你每页显示12个图片,那在scrollbox中预先放12个空白的TImage(可以配置每页显示多少个),重复使用,滚动条滚动的时候吧下载到的图片assign到这12个TImage上去就可以了。
juno_393 2016-12-06
  • 打赏
  • 举报
回复
引用 6 楼 suiyunonghen 的回复:
那就需要你下载的加载内容上做处理,比如说你规定一页是20个,那么你就需要标记当前的内容个数,每次加载最多加载20个。这个应该好处理
我做的是判断他是否有滑动滚轮,滚动一次就下载20张,但是滚动滚轮是滚动了很多下的,所以会下载很多图片。 请问可以判断到右侧的下拉条是否到最底端么。比如,判读如果到最底端,那么我滚动鼠标下载20张,然后在将下拉条滚动到最底端后,在滚动就继续下载。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧