Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.31;
Скачать: CL | DM;

Вниз

Запутался в объектах   Найти похожие ветки 

 
Жужузу   (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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.01 c
3-1233936148
Moron
2009-02-06 19:02
2010.01.31
Нужна порощь


15-1259516382
Yura
2009-11-29 20:39
2010.01.31
Расширение фигуры


2-1260278642
Danco
2009-12-08 16:24
2010.01.31
Поместить картинку из TWebBrowser в TImage


15-1259184616
Юрий
2009-11-26 00:30
2010.01.31
С днем рождения ! 26 ноября 2009 четверг


2-1260358771
Phoenix
2009-12-09 14:39
2010.01.31
Проблема с TTreeView в Delphi 2009