![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Строку в объект [D7, XP]
kyn66 © (2009-11-12 16:11:00)Подскажите, каким способом можно строку вставить в объект , ну например ComboBox ? Нужно к примеру просканировать текущий каталог диска, найденные файлы записать в Combobox, а полный путь к файлу сохранить в объекте. Помню со строками есть проблемы при сохранении в объект. Есть вот такой вариант
....
var
PS: PString;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
new(PS);
PS^ := 'Hello world 1';
ComboBox1.Items.AddObject('Item1', TObject(PS));
PS^ := 'Hello world 2';
ComboBox1.Items.AddObject('Item2', TObject(PS));
PS^ := 'Hello world 3';
ComboBox1.Items.AddObject('Item3', TObject(PS));
...
procedure TForm1.FormDestroy(Sender: TObject);
begin
Dispose(PS);
end;
При доступе к объекту
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
ShowMessage(PString(Combobox1.Items.Objects[0])^); //Hello world 1
end;
возникает ошибка (AV)
Юрий Зотов (2009-11-13 08:38:00) [81]> kyn66 © (12.11.09 23:28) [23]
Теперь прикиньте: Вы все же упорно хотите для хранения второй строки использовать свойство Objects и ради этого готовы "обернуть" эту вторую строку в специальный объект, за которым Вам еще придется "следить" - то есть вовремя создавать и уничтожать. Это дополнительный расход памяти, дополнительный код и дополнительный риск ошибок в этом коде.
А зачем? Разве не проще и не безопаснее (в смысле ошибок) делать именно так, как Вы вначале и делали - хранить вторые строки в отдельном списке и сопоставлять их по индексу?
Кроме того: если Вы собираетесь хранить списки файлов и каталогов, то, возможно, Вам подойдут готовые компоненты TDirectoryListBox и TFileListBox. Тогда, возможно, ничего программировать и не нужно будет.
{RASkov} (2009-11-13 07:58:00) [82]> [20] kyn66 © (12.11.09 23:02)
> Да не о визуальном представлении идет речь, а о хранении
> данных(Имя файла - Items; Полный путь - Объект).
Ну так и выбери другой контейнер для хранения двух строк.
Зачем мазахизмом заниматься?
type
TDualStr = record
NameFile, PathFile: String;
end;
TDualStrs: array of TDualStr;
Если нужно отоброжать то любой контрол с виртуальным режимом...
Германн (2009-11-13 01:42:00) [83]
> А применение к нему AddObject как Сергей говорит каран запрещает?
> :)
Во-первых Сергей говорит кОран. А во-вторых что ты так зациклился на AddObject, что другие варианты не признаёшь?
Ну и плюс
> Юрий Зотов © (12.11.09 17:17) [7]
>
> > kyn66 © (12.11.09 17:10) [5]
>
> Без обид - Вы недостаточно знакомы с реализацией длинных
> строк в Delphi, поэтому и налетаете на ошибки работы с памятью.
kyn66 (2009-11-12 23:28:00) [84]
> Leonid Troyanovsky © (12.11.09 23:11) [21]
А применение к нему AddObjectкак Сергей говорит каран запрещает? :)
kyn66 (2009-11-12 23:13:00) [85]
> zlo (12.11.09 18:09) [15]
Здается мне здесь еще нужно предусмотреть освобождение памяти после использования объектов.
Leonid Troyanovsky (2009-11-12 23:11:00) [86]
> kyn66 © (12.11.09 23:02) [20]
> Да не о визуальном представлении идет речь,
Когда говорят о комбобоксе, то о визуальном
представлении и речь.
Все остальное лишь кажется.
--
Regards, LVT.
kyn66 (2009-11-12 23:02:00) [87]
> zlo (12.11.09 18:09) [15]
Я думаю это то что нужно.
> Leonid Troyanovsky © (12.11.09 18:36) [17]
Да не о визуальном представлении идет речь, а о хранении данных(Имя файла - Items; Полный путь - Объект).
Leonid Troyanovsky (2009-11-12 22:49:00) [88]
> Amoeba © (12.11.09 22:30) [18]
> лучше промолчу
Господа офицеры!
Как договорились - ни слова о ..
--
Regards, LVT.
Amoeba (2009-11-12 22:30:00) [89]
> kyn66 © (12.11.09 16:11)
>
> Подскажите, каким способом можно строку вставить в объект
>
лучше промолчу, иначе гарантированное пожизненное RO получу.
Leonid Troyanovsky (2009-11-12 18:36:00) [90]
> kyn66 © (12.11.09 17:10) [5]
> Это нужно к тому, чтобы каждый Items ComboBox-а содержал
> в себе двойную информацию(две строки).
Такое делают, используя стили cbOwnerDraw*.
Item составляют из двух строк, разделенных неким разделителем,
например '|' or tab, а рисуют лишь одну из половин.
Но, в случае с файлами нет нужды хранить все в одном.
Проще хранить в одном комбобоксе имя устройства, во
втором - имена папок на нем, а в третьем ее содержимое.
Ну, и CB_DIR тебе в руки.
--
Regards, LVT.
Дмитрий Белькевич (2009-11-12 18:21:00) [91]Глобально:
1. Забыть (в большинстве случаев) New/Dispose.
2. Забыть (в большинстве случаев, кроме работы с сишными строками) при работе со строками/символами про указатели и нуль-терминированные строки.
3. Переписать с учетом забытого.
zlo (2009-11-12 18:09:00) [92]
> А если их много? Как в данном случае container.s будет принимать
> значения и передавать их ComboBox ? Как обращаться к нему
> для получения конкретного значения по ItemIndex ?
type
TStr = class
private
FStr: string;
procedure SetStr(const Value: string);
public
constructor Create(AStr: string);
property Str: string read FStr write SetStr;
end;
{ TStr }
constructor TStr.Create(AStr: string);
begin
Str := AStr;
end;
procedure TStr.SetStr(const Value: string);
begin
if FStr <> Value then FStr := Value;
end;
{ TForm1 }
procedure TForm1.Button2Click(Sender: TObject);
begin
ComboBox1.Items.AddObject('Item 1', TStr.Create('ObjectItem 1'));
ComboBox1.Items.AddObject('Item 2', TStr.Create('ObjectItem 2'));
ComboBox1.Items.AddObject('Item 3', TStr.Create('ObjectItem 3'));
ShowMessage(TStr(ComboBox1.Items.Objects[0]).Str);
ShowMessage(TStr(ComboBox1.Items.Objects[1]).Str);
ShowMessage(TStr(ComboBox1.Items.Objects[2]).Str);
end;
Игорь Шевченко (2009-11-12 18:03:00) [93]
> Хочу знать больше.
Любите книгу - источник знаний
kyn66 (2009-11-12 17:57:00) [94]
> Игорь Шевченко © (12.11.09 17:54) [10]
> у тебя столько вопросов, может, тебе проще программиста
> найти ?
Трудно отвечать? Вопросы возникают по мере необходимости реализации ситуации. Хочу знать больше. Это плохо? или я не в ту ветку постучался?
kyn66 (2009-11-12 17:55:00) [95]
Юрий Зотов © (12.11.09 17:17) [7]
> Без обид - Вы недостаточно знакомы с реализацией длинных
> строк в Delphi, поэтому и налетаете на ошибки работы с памятью.
>
Даже и близко нету. Поэтому и советуюсь с мастерами.
Dennis I. Komarov (2009-11-12 17:55:00) [96]
> kyn66 © (12.11.09 17:53) [9]
array?
Игорь Шевченко (2009-11-12 17:54:00) [97]у тебя столько вопросов, может, тебе проще программиста найти ?
kyn66 (2009-11-12 17:53:00) [98]
> RWolf © (12.11.09 17:28) [8]
Очень даже интересный вариант. Помнится кто то уже предлагал такой. Это код при условии если вводим один Item. А если их много? Как в данном случае container.sбудет принимать значения и передавать их ComboBox ? Как обращаться к нему для получения конкретного значения по ItemIndex ?
RWolf (2009-11-12 17:28:00) [99]Чтоб не ходить по граблям:
type
TMyContainer=class
s:string;
...
end;
...
container := TMyContainer.Create;
container.s := 'this is a string';
ComboBox1.Items.AddObject('Item3', container);
...
ShowMessage(TMyContainer(Combobox1.Items.Objects[0]).s);
надо только не забыть перед очисткой комбобокса поудалять привязанные к нему объекты .
Юрий Зотов (2009-11-12 17:17:00) [100]> kyn66 © (12.11.09 17:10) [5]
В смысле безопасности кода - возможно, лучший.
Без обид - Вы недостаточно знакомы с реализацией длинных строк в Delphi, поэтому и налетаете на ошибки работы с памятью.