Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
4-1123239731
Tab
2005-08-05 15:02
2005.10.09
Системные имена кнопок


3-1125425983
Step[B.M.]
2005-08-30 22:19
2005.10.09
Работа с PostgreSQL через ODBC


14-1126875653
infom
2005-09-16 17:00
2005.10.09
Защитить программу с исходниками от распространения...


14-1127306421
oldman
2005-09-21 16:40
2005.10.09
У кого стоит 1С? Проблемку поймал...


5-1102447881
Arnold
2004-12-07 22:31
2005.10.09
Каак создать TButton с возможностью загрузки рисунков?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский