Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.09;
Скачать: CL | DM;

Вниз

Полтергейст в 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.113 c
4-1123613446
Vitaly123
2005-08-09 22:50
2005.10.09
RS-485


3-1124719894
M@rlin
2005-08-22 18:11
2005.10.09
Не выполняется процедура SQL из Delphi


4-1123597670
NeoMaster
2005-08-09 18:27
2005.10.09
Получение списка всех подкаталогов на всех логических дисках


14-1127031985
lookin
2005-09-18 12:26
2005.10.09
Бренд и ошибка


1-1126776872
Чувачок
2005-09-15 13:34
2005.10.09
Народ подскажите плз, как картинку BMP формата вставить