Awe tova e gotino

12 отговора 290 прегледа
#1

Awe tova e gotino

Добре, защо като Insert-на нов айтъм в комбо кутия и Objects на Items се нуллират? Примерно

with SqlDataSet1 do begin

....
Combo1.Items.Objects[Combo1.Items.Add(FieldByName('Field1').AsString)] := Pointer(FieldByName('Field2').AsInteger);
end;

-

и после Combo1.Items.Insert(0, 'Моля изберете');
Вече Integer(Combo1.Items.Objects[<index>]) = 0; // до преди Insert-ването е било наред. Някой сеща ли се за алтернативен "естетически" начин да пазя Integer-и в комбото асоциирани със стринговете?

-------------
Special killer double trouble triple extra nicotine monster!


PS: Извинявайте, че ви занимавам с глупости

Редактирано от z_free на

Отговор
в отговор на z_free #2

Айде малко назад...

да се върнеш - в старите години на ТурбоПаскал-а ;-)))

Значи простия отговор е, че Pointer връща указател към нещо - в твоя случай обаче това е временна променлива (а защо е такава друг път ще обеснявам)
За да пазиш някъде обектите - ще трябва да си заделиш място в паметта в структура примерно запис или просто integer. След това да му подадеш указателя. Другото което е неприятно, е че при Items.Clear - тези указатели се изчистват, но НЕ СЕ ИЗЧИСТВА ПАМЕТТА ОТ HEAP -а заделена за променливите(записите или integer-ите) които си алоцирал -и ще трябва да го правиш ръзно.
Аз лично ползвам този метод често но винаги тествам за memory leaks - и много е възможно при грешка тази памет да не се освободи!
Бих ти препоръчал да осмилиш дали няма друг начин за решаване на проблема.

---
Е т'ва е живот!
Отговор
в отговор на z_free #3

Re: Awe tova e gotino

ComboBox1.Items.AddObject('alabala', TObject(1));

AquilaX

____________
умният знае кога да говори, мъдрият знае кога да мълчи
Отговор
в отговор на PhantomAS #4

Re: Айде малко назад...

Разбира се, че има друг начин.... просто ми се искаше да не минавам през заделянето на допълнителна памет (или за да бъда по-точен освобождаването и в последствие:) И исках направо да ползвам 4-те байта на указателя за интеджер :)

А ако не добавям 'Моля изберете' - до каква степен мога да разчитам на тези Object-и?

-------------
Special killer double trouble triple extra nicotine monster!
Отговор
в отговор на z_free #5

Ами не ги ползвай...

Pointer(FieldByName('Field2').AsInteger);
При всички случаи това няма да ти пъхне в указателя числото ;-))) - един съвет измисли си универсален начин за подобни изпълнения - аз съм си направил един/два метода който създават подобни обекти и освобождават - и ползвам един запис - като ми трябва това просто го копирам, сменям типа в записа и всичко пее ;-)) А с още един метод си чета стойностите ;-))

---
Е т'ва е живот!
Отговор
в отговор на PhantomAS #6

Пъха ги ве :)

Pointer(FieldByName('Field2').AsInteger);
При всички случаи това няма да ти пъхне в указателя числото ;-)))
-- Аве пъха си числото като пич ве PhantomAS :) Идеята с методите е добра, ама наистина ги пъха - test-вай го ако искаш. Само че си стоят там докато не update-не6 листа.

Тука става и така, за други места ще си пиша методи (наричат го мър***)

-------------
Special killer double trouble triple extra nicotine monster!

Редактирано от z_free на

Отговор
в отговор на z_free #7

Re: Пъха ги ве :)

Мързеливия начин ти го е дал AquilaX (познат)28.05.03 14:39
ComboBox1.Items.AddObject('alabala', TObject(1));
Ако не ме лъже паметта имаше проблем само с -1, но за идентификатори (положителни) върши работа.

А PhantomAS(няма)28.05.03 14:17 е прав за "временната променлива" и ако това не го разбираш, ще трябва да попрочетеш малко за указатели и обекти

Отговор
в отговор на z_free #8

Re: Awe tova e gotino

var
x:integer;
begin
for x:=1 to 5
do ComboBox1.Items.Objects[ComboBox1.Items.Add(IntToStr(x))] := Pointer(x);
for x:=0 to ComboBox1.Items.Count-1 do ShowMessage('pre:'+IntToStr(integer(ComboBox1.Items.Objects[x])));
ComboBox1.Items.Insert(0, 'Моля изберете');
for x:=0 to ComboBox1.Items.Count-1 do ShowMessage('post:'+IntToStr(integer(ComboBox1.Items.Objects[x])));
ComboBox1.Items.Clear;
end;


при мене това си работи без проблеми - малкия страничен ефект е че има едно "post:0 "
след "pre:5"

това сичкото на D7

------------------------------
I got a COMPILER, and I'm not afraid to use it!
Отговор
в отговор на NDeu #9

Само да добавя...

Погледни какво то4но връща Pointer функцията - тя не е променена от времето на Турбо Паскал !!!! Поправка - това не е функция ами typecast-инг - т.е. връща адреса на временната променлива който всъщност е самия указател. А функцията която имах предвид е Addr. Обаче какво става при промяна на компилатора - след 1 годнина - или примерно ако Int/32/64 <> Pointer (32) - само ако пипнеш малко опции на компилатора ?

А ефекта е че записва integer -а в списъка с обектите - това което може би искаш да направиш. Ама не знам до колко ще е устойчив този ефект/дефект.

Ей хора зарежете този .NET и попрочетете малко неща - ако не на ниво асемблер то поне на ниво указатели и работа с памет. Това е като да тръгнеш да строиш космически кораб без да знаеш как работи реактивния двигател - на тези ракети самоделки продавани по магазините ;-)))
z_free - без да се заяждам ама попрочети нещо за указателите, ще ти е от полза. След като ги разбереш - попрочети малко теория за компилатори и ще разбереш още повече неща ;-))) Гарантирам ти, че ще ти е по интересно от писането на делфи програмчета.
Ето ти един пример в който теорията е много ама много полезна - това го казвам по повод един скорошен дебат по ТВ за нашето образование - не това което е сега ами това което беше преди 10 годнини най малко

Ох отплеснах се - край.

---
Е т'ва е живот!

Редактирано от PhantomAS на

Отговор
в отговор на SDR #10

Re: Awe tova e gotino

Ами вмъкваш Item - ама не Item + Object ;-) ползвай InsertObject


Ма какво ще стане с този typecasting ако sizeof(integer) <> sizeof(pointer) - мазало а? ;-)))
Е хубаво си е C/C++ - там мацаниците са доста по често явление ;-))) та човек може доста да научи за указателите.
---
Е т'ва е живот!

Редактирано от PhantomAS на

Отговор
в отговор на PhantomAS #11

Re: Awe tova e gotino

sizeof problema e compile-time problem t.e. ako ne si siguren dali toq kompilator e kato wsichki 32bit mojesh da prowerish i togawa da kompilirash ili izrichno da spomenesh w dokumentaciqta che trqbwa da se kompilira s tipowo sywmestim kompilator i rabotata spi. ako si maniak mojesh da slojish conditional direktivi i da izbegnesh problema.... ama towa samo ako naistina milish che programata sha ti se kompilira na nqkwi drugi kompilatori ......

po princip i az polzwam Insert/AddObject ama poneje choweka tak e pochnal az reshih da ne mu razabiwam okoto - pa mojeshe da ima nekwi dopalnitelni problemi - znaesh li pri Bugland sichko e wazmojno

------------------------------
I got a COMPILER, and I'm not afraid to use it!
Отговор
в отговор на PhantomAS #12

Re: Само да добавя...

bez da te obijdam ama..... zemi naprawi malko eksperementi predi da prikazwash gluposti shtoto maj za tebe razlika mejdu @ i pointer() nqma razlika ednoto e type-cast kojto za wseobshta radost w delphi ne prawi pochti nishto oswen che uspokoqwa nerwniq kompilator che naistina znaesh ko prawish, dokato drugoto e "addressof" kojto weche naistina wrashta razni "stranni" neshta kato adresa na ukazatelq kam instanciqta na obekta i prochie "vremeni" promenliwi

otnosno 32/64 do sega winagi sizeof(pointer)>=sizeof(integer) taka che type-casta integer=>pointer stawa bez zaguba na informaciq ....

------------------------------
I got a COMPILER, and I'm not afraid to use it!
Отговор
в отговор на SDR #13

Re: Само да добавя...

Мисля, че бях ясен в обеснението си, че съм объркал typecast-а с функцията която връща адрес -addr или още по то4но с друга функция Ptr - и двете не съм ги ползвал от 10 годнини ;-))).
В първия момент в който погледнах кода си мислех, че човека иска да си създаде нови обекти ( не за друго ами ако промени полето да не инт. ами стринг - това няма да работи) и да ги добави в комбото вързани със списъка - нещо което много често използвам аз!
Така, че идеята на мястото на pointer (int32/64 - вече и аз не знам кое от двете е) да се запише число не е нова, но след размишления - точно заради стратегията на Борланд да държат програмистити доста по далече от генерирания код (за разлика от С компилаторите) се отказах да ползвам такива неща!!!!!!!

Още повече, че подобни неща ще изглеждат невъобразимо зле (ако не изключиш съобщенията за указатели) в Д7 - виждал съм код който ползва указатели - и повярвай не е много приятна идеята да чакаш компилатора да листне 1500 съобщения (може и да отнеме повече от 5 мин) - при положение, че забравиш да изключиш опцията преди това. Д7 -цата зависва като "прани гащи" в подобно положение ;-))) и ако не знаеш много кофти изненада.

---
Е т'ва е живот!
Отговор