![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запутался в объектах [D7, XP]
Жужузу © (2009-12-09 12:46:00)Приветствую мастеров Delphi! Помогите разобраться в синтаксисе. Заполняю ComboBox данными
...
Type
PBosKod = ^TBosKod;
TBosKod = record
Kod : Byte;
end;
.....
Var
p : PBosKod;
i : Integer;
Poz : Integer;
begin
for i := 0 to 9 do
begin
New(p);
p.Kod := i;
ComboBox1.AddItem('Запись - ' + IntToStr(i), p);
end;
end;
Теперь пытаюсь спозиционировать Item на нужную позицию, в зависимости от данного в объекте. И вот тут проблемма возникла
Poz := 5;
...
ComboBox1.ItemIndex := ComboBox1.Items.IndexOfObject(PBosKod(ComboBox1.Items.Objects[Poz])^.Kod))
Это не верная строка. В чем ошибка?
Жужузу (2009-12-09 16:43:00) [1]Да, Медвежонок Пятачок © об этом писал в [16]. Конечно через Pointer ([11]) сделать проще всего. Просто я думал будут проблемы с памятью, точнее с ее утечкой.
icWasya (2009-12-09 16:27:00) [2]Тебе нужно что-ещ вроде этого
function GetIndexByKod(L:TStrings;int Kod):Integer;
begin
for Result := 0 to L.Count - 1 do
if PBosKod(L.Objects[Result]).Kod = Kod then Exit;
Result := -1;
end;
Combobox.ItemIndex:=GetIndexByKod(Combobox.Items);
Жужузу (2009-12-09 15:33:00) [3]
> Медвежонок Пятачок © (09.12.09 13:44) [21]
Спасибо за подсказку. Сбило с толку TreeView. У них оказывется разные параметры в методе AddObject
function AddChildObject(Node: TTreeNode; const S: string; Ptr: Pointer): TTreeNode;
...
function AddObject(const S: string; AObject: TObject): Integer; virtual;
Медвежонок Пятачок (2009-12-09 13:44:00) [4]function TStrings.IndexOfObject(AObject: TObject): Integer;
begin
for Result := 0 to GetCount - 1 do
if GetObject(Result) = AObjectthen Exit;
Result := -1;
end;
по-русски говоря поиск идет путем сравнения адреса.
метод работает с TObject и ничего не знает ни о каких полях какой-то там записи, которую где-то там привели к TObject
Жужузу (2009-12-09 13:44:00) [5]Так разве я не объект в комбо передаю?
ComboBox1.AddItem('Запись - ' + IntToStr(i), p);
Медвежонок Пятачок (2009-12-09 13:31:00) [6]чтобы искать по объекту, нужен сам объект.
у тебя его нет.
точнее нет сохраненной ссылки на него.
даже если сделать еще одно new(p) и заполнить поля нового p такими же атрибутами, то поиск все равно ничего не найдет в списке объектов.
Так как в списке нет того, объекта по которому ты ищешь.
Жужузу (2009-12-09 13:28:00) [7]Значит вернуться к старому варианту, через указатели? Хорошо, это в этом случае запись имеет одно поле. А если бы была ситуация с несколькими полями и одно из полей содержало бы номер итема к которому объект относится. Там то как?
Медвежонок Пятачок (2009-12-09 13:20:00) [8]А как же тогда с утечкой памяти. Данные то зависнут после уничтожения комбо.
Никакой утечки не будет. Так как не было никакого доп. распределения памяти.
Медвежонок Пятачок (2009-12-09 13:19:00) [9]Теперь пытаюсь спозиционировать Item на нужную позицию, в зависимости от данного в объекте.
перебор всех объектов + сравнение их полей с искомым значением.
индексофобжект не нужен, так как искомый результат - это текущее значение переменной цикла перебора элементов.
Жужузу (2009-12-09 13:17:00) [10]
> Медвежонок Пятачок © (09.12.09 13:14) [12]
>
> раньше было правильно. и диспоза раньше не требовалось.
А как же тогда с утечкой памяти. Данные то зависнут после уничтожения комбо.
Медвежонок Пятачок (2009-12-09 13:15:00) [11]Так я же сказал, что строка не верная..... А правильно как не допетрю
Так тебе и сказали, что искать ошибку в том коде из твоего вопроса не надо. Потому что сам код бессмысленный.
Жужузу (2009-12-09 13:14:00) [12]
> Теперь подумай какая связь между IndexOfObject и одним из
> полей этого объекта
Так я же сказал, что строка не верная..... А правильно как не допетрю
Медвежонок Пятачок (2009-12-09 13:14:00) [13]раньше было правильно. и диспоза раньше не требовалось.
Жужузу (2009-12-09 13:12:00) [14]Данный код немного переделан. Когда заполнение объектов выполнялось через Pointer с последующим приведением, то все работало прекрасно. Однако была одна загвоздка, объекты не уничтожались в памяти. Вот решил модернезировать для более грамотного обращения с памятью.
for i := 0 to Pred(ComboBox1.Items.Count) do
Dispose(PBosKod(ComboBox1.Items.Objects[I]));
раньше вот так было
for i := 0 to 10 do
ComboBox1.AddItem('Значение - ' + IntToStr(i), Pointer(i));
...
ComboBox1.ItemIndex := ComboBox1.Items.IndexOfObject(Pointer(Tab1.FromObj.Value));
...
Медвежонок Пятачок (2009-12-09 13:11:00) [15]В данной задаче my_num - не произвольное число. Его нужно взять из самого-же Combobox,
Теперь подумай какая связь между IndexOf Objectи одним из полейэтого объекта
Только если астральная
Медвежонок Пятачок (2009-12-09 13:08:00) [16]В данной задаче my_num - не произвольное число.
И чего?
Это ничего не меняет.
Ты сначала по этому числу берешь из списка нечто используя его как индекс списка.
И ищешь тот же самый индекс в списке который равен искомому числу.
Тем более что ты еще и путаешь сам объект и значение одного из его полей.
сумбур полнейший в общем.
Жужузу (2009-12-09 13:04:00) [17]
> Медвежонок Пятачок © (09.12.09 12:56) [5]
>
> ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(Format('Запись
> - %d',[my_num]));
В данной задаче my_num - не произвольное число. Его нужно взять из самого-же Combobox, из его объекта (См. формирование списко [0])
Медвежонок Пятачок (2009-12-09 13:03:00) [18]Другой не нужен.
Твой код не нужен.
Поэтому искать в нем ошибку не имеет смысла.
Потому что такой код в программу не попадет.
ПС: чтобы искать по объекту, нужен сам инстанс объекта.
У тебя его нет.
И искать по копии искомого объекта с точно такими же полями - тоже бессмысленно. Не найдет.
Жужузу (2009-12-09 13:01:00) [19]Другой не нужен. Объясню конкретнее. Этот Combo входит в состав редактируемых данных на форме, которые потом записываются в таблицу. К примеру мы ввели некоторые данные(Tdit и т.д.), в Combobox выбрали строку "Запись - 3". Теперь данные сохраняем в таблицу, в которой присутствует поле для значения объекта строки Combobox-а. Теперь я хочу редактировать данные и мне нужно спозиционировать ComboBox на строку "Запись - 3". Это я могу сделать, зная значение поля таблицы(после сохранения значение объекта строки Combobox). Сразу предупреждаю DB - компоненты не задействованы. Нужно без них. Вот такая задача.
Медвежонок Пятачок (2009-12-09 12:56:00) [20]ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(Format('Запись - %d',[my_num]));