Форум: "Начинающим";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
ВнизПолтергейст в TStrings Найти похожие ветки
← →
Гриха © (2005-08-29 09:18) [0]Помогите!
Имеется TListBox и TStrings. В TStrings хранятся адреса(например "C:\autoexec.bat") файлов, а в листбоксе отображаются они же, но обработанные так, чтобы там были только имена файлов(например "autoexec.bat"). При нажатии на строку в листбоксе программа обращается к соответсвующему элементe в TStrings. Эти два элемента никак не связаны, но, почему-то, если изменить содержимое TStrings"а меняется и содержимое листбокса.
А если посмотреть на их содержимое через watches, то оказывается, что они вообще пустые!
У кого нибудь что-нибудь подобное было?
← →
КаПиБаРа © (2005-08-29 09:29) [1]Гриха © (29.08.05 9:18)
но, почему-то, если изменить содержимое TStrings"а меняется и содержимое листбокса
Внимательнее смотри код программы. Просто так ничего не меняется
← →
Leonid Troyanovsky © (2005-08-29 09:31) [2]
> Гриха © (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:35) [3]Проверял 3 раза. Search>Find Дальше искал во всех модулях "listbox1", проверял все таймеры, все процедуры, связанные с этими элементами. Все в порядке, но если добавить код, который передавал бы какие-то значения TStrings"у, то они тут же отобразятся в листбоксе.
> Просто так ничего не меняется
А почему, тогда при просмотре их через watches я вижу пустые скобки (ведь, визуально листбокс имеет в себе значения)?
← →
Гриха © (2005-08-29 09:37) [4]
> Во-вторых, не надо никуда обращаться, для этого
> существует стили lbOwnerDraw*.
А это что такое?
← →
Leonid Troyanovsky © (2005-08-29 09:57) [5]
> Гриха © (29.08.05 09:37) [4]
> > существует стили lbOwnerDraw*.
>
> А это что такое?
VCL Reference TCustomListBox.Style
--
Regards, LVT.
← →
Alexander Panov © (2005-08-29 10:07) [6]Все же у тебя может быть не TStrings? Может быть приведешь немного кода в качестве примера?
← →
Рамиль © (2005-08-29 10:43) [7]А, случайно, нет что нибудь типа такого:
var
Strings: TStrings;
...
Strings := ListBox1.Items;
...
TStrings - абстрактный класс, ты не мог его использовать просто так. Ибо
Derive a class from TStrings to store and manipulate a list of strings. TStrings contains abstract or, in C++ terminology, pure virtual methods and should not be directly instantiated.
← →
Плохиш © (2005-08-29 10:57) [8]
> Гриха © (29.08.05 09:35) [3]
Про ошибку в 17й строке тебе уже сказали.
> А почему, тогда при просмотре их через watches я вижу пустые
> скобки (ведь, визуально листбокс имеет в себе значения)?
Пустые скобки означают, что переменная указывает на область памяти, которая распределена и может интерпретироваться как какой-либо объект. А доступ к значениям листбокса производится через свойство Items.
← →
Antonn © (2005-08-29 11:28) [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-09-02 07:02) [10]?
> Antonn © (29.08.05 11:28) [9]
Такой вариант не подойдет. Теряется возможность выделения строк. Может что-нибудь другое
← →
Antonn © (2005-09-02 07:28) [11]Гриха © (02.09.05 7:02) [10]
какого выделения?
← →
begin...end © (2005-09-02 07:42) [12]> Гриха © (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...
← →
Гриха © (2005-09-02 07:49) [13]
> Однако сама затея, ИМХО, не очень хорошая: при каждой перерисовке
> вызывается ExtractFileName...
А альтернатива?
← →
begin...end © (2005-09-02 07:58) [14]> Гриха © (02.09.05 07:49) [13]
Добавить короткие названия файлов в ListBox один раз, обычным способом. Вероятно, это Вы и пытались сделать с самого начала, но в чём была ошибка, так и осталось непонятным -- код не был приведён.
← →
Думкин © (2005-09-02 08:33) [15]> Гриха © (02.09.05 07:49) [13]
Ля.
- я вот стрялял утка однако, а он дальше летел.
- а покажи ружье.
- какой ружье, зачем ружье. Палка, патрны вставлять однако.
- а палка - ружье?
- зачем ружье, что говоришь однако.
Вот примерно как весь диалог(?) тут и развивается.
Напишите яснее и дайте таки код. А с TStrings напрямую - это как, как с палкой?
← →
Гриха © (2005-09-02 08:51) [16]Я бы с удовольствием дал вам код, но не могу - я на работе, а код дома.
Короче, вопрос закрыт. Всем спасибо за попытки помочь.
← →
Anatoly Podgoretsky © (2005-09-02 09:49) [17]Что 5 дней домой не ходишь? Родители еще не обратились в розыск?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.019 c