Форум: "Начинающим";
Текущий архив: 2010.01.31;
Скачать: [xml.tar.bz2];
ВнизЗапутался в объектах Найти похожие ветки
← →
Жужузу (2009-12-09 12:46) [0]Приветствую мастеров 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 12:50) [1]а зачем все это, если заранее известно, что это пятый элемент?
← →
Жужузу (2009-12-09 12:51) [2]Это для примера показано, что нужно на пятый установить.
← →
Медвежонок Пятачок © (2009-12-09 12:52) [3]тогда другой пример давай.
← →
Ганя (2009-12-09 12:56) [4]в стринг листе сидит в обжектсах P
а ищешь ты по P.Kod
в данном случае IndexOfObject скорее всего не применим
← →
Медвежонок Пятачок © (2009-12-09 12:56) [5]ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(Format("Запись - %d",[my_num]));
← →
Жужузу (2009-12-09 13:01) [6]Другой не нужен. Объясню конкретнее. Этот Combo входит в состав редактируемых данных на форме, которые потом записываются в таблицу. К примеру мы ввели некоторые данные(Tdit и т.д.), в Combobox выбрали строку "Запись - 3". Теперь данные сохраняем в таблицу, в которой присутствует поле для значения объекта строки Combobox-а. Теперь я хочу редактировать данные и мне нужно спозиционировать ComboBox на строку "Запись - 3". Это я могу сделать, зная значение поля таблицы(после сохранения значение объекта строки Combobox). Сразу предупреждаю DB - компоненты не задействованы. Нужно без них. Вот такая задача.
← →
Медвежонок Пятачок © (2009-12-09 13:03) [7]Другой не нужен.
Твой код не нужен.
Поэтому искать в нем ошибку не имеет смысла.
Потому что такой код в программу не попадет.
ПС: чтобы искать по объекту, нужен сам инстанс объекта.
У тебя его нет.
И искать по копии искомого объекта с точно такими же полями - тоже бессмысленно. Не найдет.
← →
Жужузу (2009-12-09 13:04) [8]
> Медвежонок Пятачок © (09.12.09 12:56) [5]
>
> ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(Format("Запись
> - %d",[my_num]));
В данной задаче my_num - не произвольное число. Его нужно взять из самого-же Combobox, из его объекта (См. формирование списко [0])
← →
Медвежонок Пятачок © (2009-12-09 13:08) [9]В данной задаче my_num - не произвольное число.
И чего?
Это ничего не меняет.
Ты сначала по этому числу берешь из списка нечто используя его как индекс списка.
И ищешь тот же самый индекс в списке который равен искомому числу.
Тем более что ты еще и путаешь сам объект и значение одного из его полей.
сумбур полнейший в общем.
← →
Медвежонок Пятачок © (2009-12-09 13:11) [10]В данной задаче my_num - не произвольное число. Его нужно взять из самого-же Combobox,
Теперь подумай какая связь между IndexOfObject и одним из полей этого объекта
Только если астральная
← →
Жужузу (2009-12-09 13:12) [11]Данный код немного переделан. Когда заполнение объектов выполнялось через 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:14) [12]раньше было правильно. и диспоза раньше не требовалось.
← →
Жужузу (2009-12-09 13:14) [13]
> Теперь подумай какая связь между IndexOfObject и одним из
> полей этого объекта
Так я же сказал, что строка не верная..... А правильно как не допетрю
← →
Медвежонок Пятачок © (2009-12-09 13:15) [14]Так я же сказал, что строка не верная..... А правильно как не допетрю
Так тебе и сказали, что искать ошибку в том коде из твоего вопроса не надо. Потому что сам код бессмысленный.
← →
Жужузу (2009-12-09 13:17) [15]
> Медвежонок Пятачок © (09.12.09 13:14) [12]
>
> раньше было правильно. и диспоза раньше не требовалось.
А как же тогда с утечкой памяти. Данные то зависнут после уничтожения комбо.
← →
Медвежонок Пятачок © (2009-12-09 13:19) [16]Теперь пытаюсь спозиционировать Item на нужную позицию, в зависимости от данного в объекте.
перебор всех объектов + сравнение их полей с искомым значением.
индексофобжект не нужен, так как искомый результат - это текущее значение переменной цикла перебора элементов.
← →
Медвежонок Пятачок © (2009-12-09 13:20) [17]А как же тогда с утечкой памяти. Данные то зависнут после уничтожения комбо.
Никакой утечки не будет. Так как не было никакого доп. распределения памяти.
← →
Жужузу (2009-12-09 13:28) [18]Значит вернуться к старому варианту, через указатели? Хорошо, это в этом случае запись имеет одно поле. А если бы была ситуация с несколькими полями и одно из полей содержало бы номер итема к которому объект относится. Там то как?
← →
Медвежонок Пятачок © (2009-12-09 13:31) [19]чтобы искать по объекту, нужен сам объект.
у тебя его нет.
точнее нет сохраненной ссылки на него.
даже если сделать еще одно new(p) и заполнить поля нового p такими же атрибутами, то поиск все равно ничего не найдет в списке объектов.
Так как в списке нет того, объекта по которому ты ищешь.
← →
Жужузу (2009-12-09 13:44) [20]Так разве я не объект в комбо передаю?
ComboBox1.AddItem("Запись - " + IntToStr(i), p);
← →
Медвежонок Пятачок © (2009-12-09 13:44) [21]function TStrings.IndexOfObject(AObject: TObject): Integer;
begin
for Result := 0 to GetCount - 1 do
if GetObject(Result) = AObject then Exit;
Result := -1;
end;
по-русски говоря поиск идет путем сравнения адреса.
метод работает с TObject и ничего не знает ни о каких полях какой-то там записи, которую где-то там привели к TObject
← →
Жужузу (2009-12-09 15:33) [22]
> Медвежонок Пятачок © (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;
← →
icWasya © (2009-12-09 16:27) [23]Тебе нужно что-ещ вроде этого
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 16:43) [24]Да, Медвежонок Пятачок © об этом писал в [16]. Конечно через Pointer ([11]) сделать проще всего. Просто я думал будут проблемы с памятью, точнее с ее утечкой.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.01.31;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.005 c