Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Полтергейст в 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'а меняется и содержимое листбокса

Внимательнее смотри код программы. Просто так ничего не меняется


Наверх

Титульная страница Поиск, карта сайта Написать письмо