![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Полтергейст в TStrings [D7, Win95/98, WinME, WinXP]
Гриха © (2005-08-29 09:18:00)Помогите!
Имеется TListBox и TStrings. В TStrings хранятся адреса(например 'C:\autoexec.bat') файлов, а в листбоксе отображаются они же, но обработанные так, чтобы там были только имена файлов(например 'autoexec.bat'). При нажатии на строку в листбоксе программа обращается к соответсвующему элементe в TStrings. Эти два элемента никак не связаны, но, почему-то, если изменить содержимое TStrings'а меняется и содержимое листбокса.
А если посмотреть на их содержимое через watches, то оказывается, что они вообще пустые!
У кого нибудь что-нибудь подобное было?
Anatoly Podgoretsky (2005-09-02 09:49:00) [1]Что 5 дней домой не ходишь? Родители еще не обратились в розыск?
Гриха (2005-09-02 08:51:00) [2]Я бы с удовольствием дал вам код, но не могу - я на работе, а код дома.
Короче, вопрос закрыт. Всем спасибо за попытки помочь.
Думкин (2005-09-02 08:33:00) [3]> Гриха © (02.09.05 07:49) [13]
Ля.
- я вот стрялял утка однако, а он дальше летел.
- а покажи ружье.
- какой ружье, зачем ружье. Палка, патрны вставлять однако.
- а палка - ружье?
- зачем ружье, что говоришь однако.
Вот примерно как весь диалог(?) тут и развивается.
Напишите яснее и дайте таки код. А с TStrings напрямую - это как, как с палкой?
begin...end (2005-09-02 07:58:00) [4]> Гриха © (02.09.05 07:49) [13]
Добавить короткие названия файлов в ListBox один раз, обычным способом. Вероятно, это Вы и пытались сделать с самого начала, но в чём была ошибка, так и осталось непонятным -- код не был приведён.
Гриха (2005-09-02 07:49:00) [5]
> Однако сама затея, ИМХО, не очень хорошая: при каждой перерисовке
> вызывается ExtractFileName...
А альтернатива?
begin...end (2005-09-02 07:42:00) [6]> Гриха © (02.09.05 07:02) [10]
Тогда примерно так:
procedure TMyForm.MyListBoxDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
const
BackColors: array [Boolean] of TColor = (clWindow, clHighlight);
FontColors: array [Boolean] of TColor = (clWindowText, clHighlightText);
begin
with Control as TListBox, Canvas do
begin
Brush.Color := BackColors[odSelected in State];
Font.Color := FontColors[odSelected in State];
FillRect(Rect);
TextOut(Rect.Left, Rect.Top, ExtractFileName(Items[Index]))
end
end
Однако сама затея, ИМХО, не очень хорошая: при каждой перерисовке вызывается ExtractFileName...
Antonn (2005-09-02 07:28:00) [7]Гриха © (02.09.05 7:02) [10]
какого выделения?
Гриха (2005-09-02 07:02:00) [8]?
> Antonn © (29.08.05 11:28) [9]
Такой вариант не подойдет. Теряется возможность выделения строк. Может что-нибудь другое
Antonn (2005-08-29 11:28:00) [9]Гриха © (29.08.05 9:18)
я так понимаю, ListBox нужен лишь для отображения названий файлов?
так почему бы не хранить список путь/файл в самом Listbox'е, а на самом Листбоксе рисовать только названия файлов? Примерно так:
procedure TFormConf.ListBoxDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var s:string;
begin
With ( Control As tListBox ).Canvas Do Begin
Font.Color :=clWindowText;
Brush.Color:= clWindow;
FillRect(Rect);
TextOut(Rect.Left, Rect.Top, extractfilename((Control As tListBox).items.strings[index]) );
End;
end;
Плохиш (2005-08-29 10:57:00) [10]
> Гриха © (29.08.05 09:35) [3]
Про ошибку в 17й строке тебе уже сказали.
> А почему, тогда при просмотре их через watches я вижу пустые
> скобки (ведь, визуально листбокс имеет в себе значения)?
Пустые скобки означают, что переменная указывает на область памяти, которая распределена и может интерпретироваться как какой-либо объект. А доступ к значениям листбокса производится через свойство Items.
Рамиль (2005-08-29 10:43:00) [11]А, случайно, нет что нибудь типа такого:
var
Strings: TStrings;
...
Strings := ListBox1.Items;
...
TStrings - абстрактный класс, ты не мог его использовать просто так. Ибо
Derive a class from TStrings to store and manipulate a list of strings. TStrings contains abstractor, in C++ terminology, pure virtual methods and should not be directly instantiated.
Alexander Panov (2005-08-29 10:07:00) [12]Все же у тебя может быть не TStrings? Может быть приведешь немного кода в качестве примера?
Leonid Troyanovsky (2005-08-29 09:57:00) [13]
> Гриха © (29.08.05 09:37) [4]
> > существует стили lbOwnerDraw*.
>
> А это что такое?
VCL Reference TCustomListBox.Style
--
Regards, LVT.
Гриха (2005-08-29 09:37:00) [14]
> Во-вторых, не надо никуда обращаться, для этого
> существует стили lbOwnerDraw*.
А это что такое?
Гриха (2005-08-29 09:35:00) [15]Проверял 3 раза. Search>Find Дальше искал во всех модулях 'listbox1', проверял все таймеры, все процедуры, связанные с этими элементами. Все в порядке, но если добавить код, который передавал бы какие-то значения TStrings'у, то они тут же отобразятся в листбоксе.
> Просто так ничего не меняется
А почему, тогда при просмотре их через watches я вижу пустые скобки (ведь, визуально листбокс имеет в себе значения)?
Leonid Troyanovsky (2005-08-29 09:31:00) [16]
> Гриха © (29.08.05 09:18)
> Имеется TListBox и TStrings. В TStrings хранятся адреса(например
> 'C:\autoexec.bat') файлов, а в листбоксе отображаются они
> же, но обработанные так, чтобы там были только имена файлов(например
> 'autoexec.bat'). При нажатии на строку в листбоксе программа
> обращается к соответсвующему элементe в TStrings. Эти два
> элемента никак не связаны, но, почему-то, если изменить
> содержимое TStrings'а меняется и содержимое листбокса.
Во-первых, у тебя ошибка, в 17 строке.
Скорее всего, TStrings не создан, а использовано Items.
Во-вторых, не надо никуда обращаться, для этого
существует стили lbOwnerDraw*.
--
Regards, LVT.
КаПиБаРа (2005-08-29 09:29:00) [17]Гриха © (29.08.05 9:18)
но, почему-то, если изменить содержимое TStrings'а меняется и содержимое листбокса
Внимательнее смотри код программы. Просто так ничего не меняется