เกริ่นเลยคือ ผมชอบอ่าน manga โดยโหลดมาไว้ใน hdd เลยแล้วใช้โปรแกรมอ่านเอา
ซึ่งมีอยู่หลายตัวมาก แต่ติดที่ว่า ผมชอบอ่านแบบ continuous หรือที่เรียกว่า โหมดต่อเนื่อง
ไม่ใช่แบบพลิกทีละหน้า สองหน้า
ที่เจอมาก็มีโปรแกรม Domdomsoft manga reader แต่แบบว่า ปุ่มแต่ละปุ่มช่างเล็กเหลือใจ
คลิ๊กยาก แถมวางไว้โน่น ด้านบนสุด ก็เลยจะเขียนเอง
โดยปกติเมื่อก่อนใช้ Delphi แต่ชักขี้เกียจตามหละ ประกอบกับมีของฟรี (มีในโลกจริง ๆ)คือ
Lazarus ซึ่งเป็น Free Cross-Platform Compiler สโลแกนคือ Write Once, Compile AnyWhere
เขียนเสร็จแล้วหละครับ แต่ ......
(เกริ่นซะยาว ขออภัย)
ถ้าหากเจอโฟลเดอร์ไหนที่มี ไฟล์รูปภาพจำนวนมาก ๆ จะเจอปัญหาเล็ก ๆ (แต่แก้ไม่ตก)
โดยปกติไฟล์ manga จะมีขนาดประมาณ 800x1200
ความกว้างไม่มีปัญหา ผมเขียน รูทีน ปรับขนาดไว้เรียบร้อยแล้ว
แต่ถ้าหาก เจอไฟล์ไป ซัก 60 ไฟล์ จะทำให้ ความสูงรวมกันเกิน 65535
เมื่อเลื่อนภาพลงไปด้วยการใช้ mouse wheel จนผ่านจุด 65535
position จะกระเด้งกลับไปที่ 0 ใหม่

จะเห็นว่า มันไม่ได้ Overflow เพราะไม่มี error ทั้ง Design-time และ Run-time
และถ้าหากว่า ใช้เมาส์ลาก Vertical scrollbar แทนจะไม่พบปัญหานี้
ตอนแรกก็สงสัยว่า ผมเขียน Algorithm ตรงไหนผิดหรือเปล่า ก็เลยทำการทดสอบ
สร้างโปรเจ็คใหม่
ใส่ Panel ลงไป จากนั้นใส่ Button ลงใน Panel
สุดท้ายก็ใส่ ScrollBox ลงไป

จากนั้นก็เขียนโค้ด
const
max = 100;
var
i,Atop, Awidth, Aheight: integer;
pn : array[0..max] of tImage;
procedure TForm1.FormCreate(Sender: TObject);
begin
panel1.Align := alTop;
scrollbox1.Align := alClient;
scrollbox1.VertScrollBar.Increment := 200;
for i := 0 to max do begin
pn[i] := tImage.create(scrollbox1);
pn[i].Center := True;
pn[i].AutoSize := False;
pn[i].Parent := Scrollbox1;
end;
end;
procedure TForm1.ScrollBox1Paint(Sender: TObject);
begin
panel1.Caption := inttostr(scrollbox1.VertScrollBar.Position);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
button1.Enabled := False;
Atop := 0; Awidth := scrollbox1.ClientWidth; Aheight := 1100;
for i := 0 to max do begin
// pn[i].SetBounds(0,Atop,Awidth,Aheight);
pn[i].Top := Atop;
pn[i].Left := 0;
pn[i].Width := Awidth;
pn[i].Height := Aheight;
if i = 0 then pn[i].Picture.LoadFromFile('testPic.jpg')
else pn[i].Picture := pn[i-1].Picture;
inc(Atop,Aheight+10);
end;
end;
end.
ทดสอบด้วยการรัน แล้วคลิ๊กปุ่ม
ลากไปไว้ที่ประมาณ 6 หมื่นกว่า ๆ แล้วหมุน mouse wheel จนกระทั่งผ่าน 65535
ตึ่งโป๊ะ เด้ง

ลองไปโพสถาม ที่ฟอรั่มของ ลาซารัสเอง มีคนนึงมาตอบว่า มันเป็น ลิมิต
อ่า.... ถ้าเป็น ลิมิตก็ต้อง runtime error สิ
ตอนนี้จนปัญญา
ใครก็ได้มาช่วยหน่อยครับ
ปัญหาเกี่ยวกับ TScrollBox ใน Lazarus ครับ
ซึ่งมีอยู่หลายตัวมาก แต่ติดที่ว่า ผมชอบอ่านแบบ continuous หรือที่เรียกว่า โหมดต่อเนื่อง
ไม่ใช่แบบพลิกทีละหน้า สองหน้า
ที่เจอมาก็มีโปรแกรม Domdomsoft manga reader แต่แบบว่า ปุ่มแต่ละปุ่มช่างเล็กเหลือใจ
คลิ๊กยาก แถมวางไว้โน่น ด้านบนสุด ก็เลยจะเขียนเอง
โดยปกติเมื่อก่อนใช้ Delphi แต่ชักขี้เกียจตามหละ ประกอบกับมีของฟรี (มีในโลกจริง ๆ)คือ
Lazarus ซึ่งเป็น Free Cross-Platform Compiler สโลแกนคือ Write Once, Compile AnyWhere
เขียนเสร็จแล้วหละครับ แต่ ......
(เกริ่นซะยาว ขออภัย)
ถ้าหากเจอโฟลเดอร์ไหนที่มี ไฟล์รูปภาพจำนวนมาก ๆ จะเจอปัญหาเล็ก ๆ (แต่แก้ไม่ตก)
โดยปกติไฟล์ manga จะมีขนาดประมาณ 800x1200
ความกว้างไม่มีปัญหา ผมเขียน รูทีน ปรับขนาดไว้เรียบร้อยแล้ว
แต่ถ้าหาก เจอไฟล์ไป ซัก 60 ไฟล์ จะทำให้ ความสูงรวมกันเกิน 65535
เมื่อเลื่อนภาพลงไปด้วยการใช้ mouse wheel จนผ่านจุด 65535
position จะกระเด้งกลับไปที่ 0 ใหม่
จะเห็นว่า มันไม่ได้ Overflow เพราะไม่มี error ทั้ง Design-time และ Run-time
และถ้าหากว่า ใช้เมาส์ลาก Vertical scrollbar แทนจะไม่พบปัญหานี้
ตอนแรกก็สงสัยว่า ผมเขียน Algorithm ตรงไหนผิดหรือเปล่า ก็เลยทำการทดสอบ
สร้างโปรเจ็คใหม่
ใส่ Panel ลงไป จากนั้นใส่ Button ลงใน Panel
สุดท้ายก็ใส่ ScrollBox ลงไป
จากนั้นก็เขียนโค้ด
const
max = 100;
var
i,Atop, Awidth, Aheight: integer;
pn : array[0..max] of tImage;
procedure TForm1.FormCreate(Sender: TObject);
begin
panel1.Align := alTop;
scrollbox1.Align := alClient;
scrollbox1.VertScrollBar.Increment := 200;
for i := 0 to max do begin
pn[i] := tImage.create(scrollbox1);
pn[i].Center := True;
pn[i].AutoSize := False;
pn[i].Parent := Scrollbox1;
end;
end;
procedure TForm1.ScrollBox1Paint(Sender: TObject);
begin
panel1.Caption := inttostr(scrollbox1.VertScrollBar.Position);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
button1.Enabled := False;
Atop := 0; Awidth := scrollbox1.ClientWidth; Aheight := 1100;
for i := 0 to max do begin
// pn[i].SetBounds(0,Atop,Awidth,Aheight);
pn[i].Top := Atop;
pn[i].Left := 0;
pn[i].Width := Awidth;
pn[i].Height := Aheight;
if i = 0 then pn[i].Picture.LoadFromFile('testPic.jpg')
else pn[i].Picture := pn[i-1].Picture;
inc(Atop,Aheight+10);
end;
end;
end.
ทดสอบด้วยการรัน แล้วคลิ๊กปุ่ม
ลากไปไว้ที่ประมาณ 6 หมื่นกว่า ๆ แล้วหมุน mouse wheel จนกระทั่งผ่าน 65535
ตึ่งโป๊ะ เด้ง
ลองไปโพสถาม ที่ฟอรั่มของ ลาซารัสเอง มีคนนึงมาตอบว่า มันเป็น ลิมิต
อ่า.... ถ้าเป็น ลิมิตก็ต้อง runtime error สิ
ตอนนี้จนปัญญา
ใครก็ได้มาช่วยหน่อยครับ