Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > ширина строк в ListBox


Автор: offline 14.3.2005, 23:30
Подскажите, что и как делать
У меня есть ListBox в котором есть строки превышающие ширину ListBox. Как сделать, чтобы когда курсор мыши находится над любой строкой выполнялось следующее. Если строка умещается в ширину, то ничего не происходит, а если строка длиннее чем ширина ListBox, то она как бы всплывает поверх ListBox и вся читаема.

Автор: offline 14.3.2005, 23:57
данные строки могу взять так smile

Код

procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 label1.Caption := ListBox1.Items.ValueFromIndex[( y div ListBox1.ItemHeight)];
end;


Осталась проверка ее длины и вывод поверх ListBox

Автор: offline 15.3.2005, 00:12
длину текста можно определить

Canvas.TextWidth(label1.Caption);

А вот као это все вывести поверх ListBox1 smile

Автор: -=Ustas=- 15.3.2005, 00:12
Попробуй на MouseMove и OnShowHint:
Код

private
    { Private declarations }
    FHintRow : Integer; // Номер строки в списке, на которую указывает мышь
public
    { Public declarations }
    // Обработчик подсказок
    procedure OnShowHint(var HintStr: string; var CanShow: Boolean; var HintInfo: THintInfo);


procedure TMainForm.OnShowHint(var HintStr: string; var CanShow: Boolean; var HintInfo: THintInfo);
var 
    Pos: TPoint;
begin
    with HintInfo do
        if HintControl is TListBox then    // Проверка на нужный объект
            with HintControl as TListBox do
                 begin
                  Pos.X := 0;
                  Pos.Y := ListBox1.Tag;
                  HintPos := ListBox1.ClientToScreen(Pos);
                  HintStr := ListBox1.Hint;
            end;
end;

procedure TMainForm.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var 
    MousePos: TPoint;
    ItemPos: TRect;
    RowWidth, ItemNum: Integer;
    FHint: String;
begin
    MousePos.X := X;
    MousePos.Y := Y;
    ItemNum := ListBox1.ItemAtPos(MousePos, True); // Определение номера строки в списке

    if (ItemNum <> FHintRow) then  // Проверка на перемещение мыши на другую строку
        begin
            FHintRow := ItemNum;
                if ItemNum <> -1 then      // Проверка на наличие элементов в списке
               begin
                     ItemPos := ListBox1.ItemRect(ItemNum);
                     Application.CancelHint; // Снять текущую подсказку
                     ListBox1.Tag := ItemPos.Top; // Запоминаем позицию строки по вертикали
                     FHint := ListBox1.Items[ItemNum];
                     // Проверка на ширину строки  
                     RowWidth := ListBox1.Canvas.TextWidth(FHint );
                     if (RowWidth > ListBox1.ClientWidth) then 
                         FHint := FHint + '|'
                       else FHint := '';

                     ListBox1.Hint := FHint;
               end
       else 
           begin 
                        ListBox1.Hint := '';
                       Application.CancelHint;
                       ListBox1.Tag := -1; 
                    end;
        end;
end;

Вроде бы так.

Автор: offline 15.3.2005, 00:51
>Ustas_007

спасибо за помощь, осталось разобраться

smile
smile

Автор: Alex 15.3.2005, 01:48
http://vingrad.ru/DELPHI-DLP-002343

Автор: SPrograMMer 15.3.2005, 02:27
Вот тут кое-что, правда для ComboBox`а, а для ListBox`а - немного переделок.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)