Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

var

 curKey: array[0..1] of char;

 ndx: integer;

begin

 if ActiveControl = ListBox1 then begin

if key = #8 {Backspace (клавиша возврата)} then begin

if FPrefix[0] <> #0 then begin

FPrefix[StrLen(FPrefix) - 1] := #0;

end

end else begin

curKey[0] := Key;

curKey[1] := #0;

StrCat(FPrefix, curKey);

ndx := SendMessage(ListBox1.Handle, LB_FINDSTRING,-1, longint(@FPrefix));

if ndx <> LB_ERR then ListBox1.ItemIndex := ndx;

end;

Label1.Caption := StrPas(FPrefix);

Key := #0;

 end;

end;

procedure TFrmLbxSrch.ListBox1Enter(Sender: TObject);

begin

 FPrefix[0] := #0;

 Label1.Caption := StrPas(FPrefix);

end;

end.

– Ralph Friedman

Табуляция

в графическом ListBox'е

Письмо читателя

Использование табуляции в ListBox'е когда компонент находится в стандартном режиме не составляет труда. Но что делать если надо использовать графическое отображение элементов списка? Ведь при этом надо самому писать обработчик отрисовки элементов с разбиением на колонки. Элементарное решение — использование API функции TabbedTextOut, однако результаты работы этой функции меня явно не удовлетворили. Пришлось-таки "выкручиваться"… Символ-разделитель можно использовать любой. Например, будем использовать символ "|", тогда обработчик OnDrawItem может выглядеть следующим образом:

procedure TBrowser.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);

var

 S, Ss: String;

 P: Integer; // Флаг символа-разделителя

begin

 begin

ListBox1.Canvas.FillRect(Rect);

//Отрисовка графики

//

S:=ListBox1.Items.Strings[Index];

P:=Pos('|', S);

If P=0 then Ss:=S

else Ss:=Copy(S, 1, P-1);

//
Если нет табуляции, то пишем всю строку, иначе отрезаем кусок до разделителя

ListBox1.Canvas.TextOut(Rect.Left + 20, Rect.Top + 2, Ss);

If P>0 then

ListBox1.Canvas.TextOut(ListBox1.TabWidth, Rect.Top + 2, Copy(S, P+1, Length(S)-P+2));

 end;

end;

Не забудьте перед запуском поставить нужное значение TabWidth.

Virtualik

Выравнивание в ListBox'е

Delphi 1

Перед тем, как вычислить позицию фразы, необходимо с помощью функции TextWidth вычислить ее ширину.

Например:

var J, TempInt, LongPrefixLen, CurrPrefixLen: Integer;

begin

 {Вычисляем TextWidth по ключевой строке}

 {Устанавливаем CurrPrefixLen в TextWidth ключевого слова строки Indexth}

 LongPrefixLen := 0;

 for J := 0 to ListBox1.Items.Count-1 do

with ListBox1.Canvas do begin

TempInt:= TextWidth(Copy(Items[J], 1, Pos(KeyString, Items[J]-1)));

if LongPrefixLen < TempInt then LongPrefixLen:= TempInt;

if J = Index then CurrPrefixLen:= TempInt;

 end;

 {PrevTextLeft – TextLeft = Где мы хотим вывести новый элемент}

 TextOut(LongPrefixLen-CurrPrefixLen, Y, Items[I]);

end;

Создание ListBox во время выполнения программы

Delphi 1

Установка выравнивания ListBox на alLeft вызывает изменение размеров ListBox при любом изменении размеров формы. Установка ширины происходит очень легко (помните о том, что ширина Width, которую вы видите в правой части строки, является свойством Width формы).

Количество элементов, хранимых ListBox, ограничено только доступной памятью.

procedure TForm1.CreateListBox;

var LB : TListBox;

begin

 LB := TListBox.Create;

 LB.Align := alLeft;

 LB.Width := Width div 2;

end;

Вот логика динамического создания ListBox и изменения его размера при изменения размеров формы. Я надеюсь, что помог вам. Также я подозреваю, что данные ListBox ограничены 32 килобайтами.

Поделиться с друзьями: