Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1259047847
миржан
2009-11-24 10:30
2010.01.31
железа


2-1260339079
oleg1963lora
2009-12-09 09:11
2010.01.31
Посоветуйте. Копирование файлов.


2-1260213754
indiegod
2009-12-07 22:22
2010.01.31
Delphi + Excel


15-1259598607
TIF
2009-11-30 19:30
2010.01.31
Серия вебинаров Embarcadero по Delphi 2010


15-1259515027
POOP
2009-11-29 20:17
2010.01.31
Проблема с печатью pdf.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский