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

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

Строку в объект [D7, XP]


Страницы:   1 2 3 4 5 6

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, поэтому и налетаете на ошибки работы с памятью.


Страницы:   1 2 3 4 5 6

Наверх

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