Форум: "Основная";
Текущий архив: 2003.10.02;
Скачать: [xml.tar.bz2];
ВнизЕсть ли в ListBox е полоса прокрутки Найти похожие ветки
← →
3APA3A (2003-09-19 00:13) [0]Не вертикальная, а горизонтальная, то есть если строка целиком не умещается....
← →
Andy BitOff (2003-09-19 00:24) [1]Есть.
← →
Andy BitOff (2003-09-19 00:36) [2]http://delphimaster.net/view/11-1042971278/
← →
3APA3A (2003-09-19 01:55) [3]Полоса появляется, но все равно, более длинные строки не до конца... Можно конечно поставить какое-нибудь заведомо большое число, но
1) Его просто нет ( могут быть строки любой длины)
2) Некрасиво это...
Код такой
j:=0;
for i:=0 to Self.ListBox1.Count-1 do
if ListBox1.Canvas.TextWidth(Self.ListBox1.Items[i]+"x")>j
then j:=ListBox1.Canvas.TextWidth(Self.ListBox1.Items[i]+"x");
SendMessage(ListBox1.Handle,LB_SETHORIZONTALEXTENT,j,0);
Попробуйте сделать сами, на разных строках, достаточно большой длины...
← →
Andy BitOff (2003-09-19 02:13) [4]Смотря какой шрифт использовать. Если Courier, то там все символы одной ширины, но в основном это не так. Попробуй использовать в своём коде букву "w" она самая длиная.
← →
Andy BitOff (2003-09-19 02:23) [5]Вот рабочий пример:
begin
LongestLength := 0; //типа integer
LongestString := ""; //типа string
for i := 0 to Listbox1.Items.Count - 1 do
begin
if Length(Listbox1.Items[i]) > LongestLength then
begin
LongestString := Listbox1.Items[i];
LongestLength := Length(Listbox1.Items[i]);
end;
end;
PixelLength := Listbox1.Canvas.TextWidth(LongestString);
PixelLength := PixelLength + Listbox1.Canvas.TextWidth("W");
SendMessage(ListBox1.Handle, LB_SETHORIZONTALEXTENT, PixelLength, 0);
end;
← →
3APA3A (2003-09-19 03:45) [6]Шрифт стоит Arial
Прежде чем копировать пример, следовало бы убедится в его работоспособноости... Попробуй добавлять список файлов в ListBox
( у меня просто стоит ScanDirectory - у всех файлов разные имена и символы в имени, достаточно хорошая иллюстрация).
я выкрутился просто тем, что
PixelLength=Round(...Canvas.TextWidth(String)*1.2);
← →
Andy BitOff (2003-09-19 04:03) [7]Пример 100% рабочий!!!!!!!!!!!!!
На проверь:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
LongestLength: Integer;
LongestString: String;
PixelLength: Integer;
i: Integer;
begin
Listbox1.Items.Add("Line 1");
Listbox1.Items.Add("Line 2 A very long string that is past the size of the listbox");
Listbox1.Items.Add("Line 3");
Listbox1.Items.Add("Line 4");
Listbox1.Items.Add("Line 5");
Listbox1.Items.Add("Line 6");
if Listbox1.Items.Count > 1 then
begin
LongestLength := 0;
LongestString := "";
for i := 0 to Listbox1.Items.Count - 1 do
begin
if Length(Listbox1.Items[i]) > LongestLength then
begin
LongestString := Listbox1.Items[i];
LongestLength := Length(Listbox1.Items[i]);
end;
end;
PixelLength := Listbox1.Canvas.TextWidth(LongestString);
PixelLength := PixelLength + Listbox1.Canvas.TextWidth("W");
SendMessage(ListBox1.Handle, LB_SETHORIZONTALEXTENT,
PixelLength, 0);
end;
end;
end.
← →
3APA3A (2003-09-19 04:14) [8]Да, верно... рабочий...
Странно... но когда у меня динамически добавляются строки
самые длинные получаются тем больше обрезаны, чем больше их длина... Даже и не знаю...
← →
Andy BitOff (2003-09-19 04:27) [9]А ты как, сначала список забиваешь, потом полосу ставишь?
← →
3APA3A (2003-09-19 14:02) [10]Да... сначала забиваю, потом весь его пробегаю, вычисляю max длину и ставлю... Может всё дело в этом?..
← →
Amoeba (2003-09-19 15:08) [11]В книжке Тексейры и Пачеко есть исходники нужного тебе компонента. Электронная версия книги есть где-то в сети.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.10.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c