Awe tova e gotino
12 отговора
290 прегледа
Awe tova e gotino
Добре, защо като Insert-на нов айтъм в комбо кутия и Objects на Items се нуллират? Примерно
-
и после Combo1.Items.Insert(0, 'Моля изберете');
Вече Integer(Combo1.Items.Objects[<index>]) = 0; // до преди Insert-ването е било наред. Някой сеща ли се за алтернативен "естетически
" начин да пазя Integer-и в комбото асоциирани със стринговете?
-------------
Special killer double trouble triple extra nicotine monster!
PS: Извинявайте, че ви занимавам с глупости
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-ването е било наред. Някой сеща ли се за алтернативен "естетически
-------------
Special killer double trouble triple extra nicotine monster!
PS: Извинявайте, че ви занимавам с глупости
Редактирано от z_free на
Айде малко назад...
да се върнеш - в старите години на ТурбоПаскал-а ;-)))
Значи простия отговор е, че Pointer връща указател към нещо - в твоя случай обаче това е временна променлива (а защо е такава друг път ще обеснявам)
За да пазиш някъде обектите - ще трябва да си заделиш място в паметта в структура примерно запис или просто integer. След това да му подадеш указателя. Другото което е неприятно, е че при Items.Clear - тези указатели се изчистват, но НЕ СЕ ИЗЧИСТВА ПАМЕТТА ОТ HEAP -а заделена за променливите(записите или integer-ите) които си алоцирал -и ще трябва да го правиш ръзно.
Аз лично ползвам този метод често но винаги тествам за memory leaks - и много е възможно при грешка тази памет да не се освободи!
Бих ти препоръчал да осмилиш дали няма друг начин за решаване на проблема.
---
Е т'ва е живот!
Значи простия отговор е, че Pointer връща указател към нещо - в твоя случай обаче това е временна променлива (а защо е такава друг път ще обеснявам)
За да пазиш някъде обектите - ще трябва да си заделиш място в паметта в структура примерно запис или просто integer. След това да му подадеш указателя. Другото което е неприятно, е че при Items.Clear - тези указатели се изчистват, но НЕ СЕ ИЗЧИСТВА ПАМЕТТА ОТ HEAP -а заделена за променливите(записите или integer-ите) които си алоцирал -и ще трябва да го правиш ръзно.
Аз лично ползвам този метод често но винаги тествам за memory leaks - и много е възможно при грешка тази памет да не се освободи!
Бих ти препоръчал да осмилиш дали няма друг начин за решаване на проблема.
---
Е т'ва е живот!
Re: Awe tova e gotino
ComboBox1.Items.AddObject('alabala', TObject(1));
AquilaX
____________
умният знае кога да говори, мъдрият знае кога да мълчи
AquilaX
____________
умният знае кога да говори, мъдрият знае кога да мълчи
Re: Айде малко назад...
Разбира се, че има друг начин.... просто ми се искаше да не минавам през заделянето на допълнителна памет (или за да бъда по-точен освобождаването и в последствие:) И исках направо да ползвам 4-те байта на указателя за интеджер :)
А ако не добавям 'Моля изберете' - до каква степен мога да разчитам на тези Object-и?
-------------
Special killer double trouble triple extra nicotine monster!
А ако не добавям 'Моля изберете' - до каква степен мога да разчитам на тези Object-и?
-------------
Special killer double trouble triple extra nicotine monster!
Ами не ги ползвай...
Pointer(FieldByName('Field2').AsInteger);
При всички случаи това няма да ти пъхне в указателя числото ;-))) - един съвет измисли си универсален начин за подобни изпълнения - аз съм си направил един/два метода който създават подобни обекти и освобождават - и ползвам един запис - като ми трябва това просто го копирам, сменям типа в записа и всичко пее ;-)) А с още един метод си чета стойностите ;-))
---
Е т'ва е живот!
При всички случаи това няма да ти пъхне в указателя числото ;-))) - един съвет измисли си универсален начин за подобни изпълнения - аз съм си направил един/два метода който създават подобни обекти и освобождават - и ползвам един запис - като ми трябва това просто го копирам, сменям типа в записа и всичко пее ;-)) А с още един метод си чета стойностите ;-))
---
Е т'ва е живот!
Пъха ги ве :)
Pointer(FieldByName('Field2').AsInteger);
При всички случаи това няма да ти пъхне в указателя числото ;-))) -- Аве пъха си числото като пич ве PhantomAS :) Идеята с методите е добра, ама наистина ги пъха - test-вай го ако искаш. Само че си стоят там докато не update-не6 листа.
Тука става и така, за други места ще си пиша методи (наричат го мър***)
-------------
Special killer double trouble triple extra nicotine monster!
При всички случаи това няма да ти пъхне в указателя числото ;-))) -- Аве пъха си числото като пич ве PhantomAS :) Идеята с методите е добра, ама наистина ги пъха - test-вай го ако искаш. Само че си стоят там докато не update-не6 листа.
Тука става и така, за други места ще си пиша методи (наричат го мър***)
-------------
Special killer double trouble triple extra nicotine monster!
Редактирано от z_free на
Re: Пъха ги ве :)
Мързеливия начин ти го е дал AquilaX (познат)28.05.03 14:39
ComboBox1.Items.AddObject('alabala', TObject(1));
Ако не ме лъже паметта имаше проблем само с -1, но за идентификатори (положителни) върши работа.
А PhantomAS(няма)28.05.03 14:17 е прав за "временната променлива" и ако това не го разбираш, ще трябва да попрочетеш малко за указатели и обекти
ComboBox1.Items.AddObject('alabala', TObject(1));
Ако не ме лъже паметта имаше проблем само с -1, но за идентификатори (положителни) върши работа.
А PhantomAS(няма)28.05.03 14:17 е прав за "временната променлива" и ако това не го разбираш, ще трябва да попрочетеш малко за указатели и обекти
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!
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!
Само да добавя...
Погледни какво то4но връща Pointer функцията - тя не е променена от времето на Турбо Паскал !!!! Поправка - това не е функция ами typecast-инг - т.е. връща адреса на временната променлива който всъщност е самия указател. А функцията която имах предвид е Addr. Обаче какво става при промяна на компилатора - след 1 годнина - или примерно ако Int/32/64 <> Pointer (32) - само ако пипнеш малко опции на компилатора ?
А ефекта е че записва integer -а в списъка с обектите - това което може би искаш да направиш. Ама не знам до колко ще е устойчив този ефект/дефект.
Ей хора зарежете този .NET и попрочетете малко неща - ако не на ниво асемблер то поне на ниво указатели и работа с памет. Това е като да тръгнеш да строиш космически кораб без да знаеш как работи реактивния двигател - на тези ракети самоделки продавани по магазините ;-)))
z_free - без да се заяждам ама попрочети нещо за указателите, ще ти е от полза. След като ги разбереш - попрочети малко теория за компилатори и ще разбереш още повече неща ;-))) Гарантирам ти, че ще ти е по интересно от писането на делфи програмчета.
Ето ти един пример в който теорията е много ама много полезна - това го казвам по повод един скорошен дебат по ТВ за нашето образование - не това което е сега ами това което беше преди 10 годнини най малко
Ох отплеснах се - край.
---
Е т'ва е живот!
А ефекта е че записва integer -а в списъка с обектите - това което може би искаш да направиш. Ама не знам до колко ще е устойчив този ефект/дефект.
Ей хора зарежете този .NET и попрочетете малко неща - ако не на ниво асемблер то поне на ниво указатели и работа с памет. Това е като да тръгнеш да строиш космически кораб без да знаеш как работи реактивния двигател - на тези ракети самоделки продавани по магазините ;-)))
z_free - без да се заяждам ама попрочети нещо за указателите, ще ти е от полза. След като ги разбереш - попрочети малко теория за компилатори и ще разбереш още повече неща ;-))) Гарантирам ти, че ще ти е по интересно от писането на делфи програмчета.
Ето ти един пример в който теорията е много ама много полезна - това го казвам по повод един скорошен дебат по ТВ за нашето образование - не това което е сега ами това което беше преди 10 годнини най малко
Ох отплеснах се - край.
---
Е т'ва е живот!
Редактирано от PhantomAS на
Re: Awe tova e gotino
Ами вмъкваш Item - ама не Item + Object ;-) ползвай InsertObject
Ма какво ще стане с този typecasting ако sizeof(integer) <> sizeof(pointer) - мазало а? ;-)))
Е хубаво си е C/C++ - там мацаниците са доста по често явление ;-))) та човек може доста да научи за указателите.
---
Е т'ва е живот!
Ма какво ще стане с този typecasting ако sizeof(integer) <> sizeof(pointer) - мазало а? ;-)))
Е хубаво си е C/C++ - там мацаниците са доста по често явление ;-))) та човек може доста да научи за указателите.
---
Е т'ва е живот!
Редактирано от PhantomAS на
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!
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!
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!
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!
Re: Само да добавя...
Мисля, че бях ясен в обеснението си, че съм объркал typecast-а с функцията която връща адрес -addr или още по то4но с друга функция Ptr - и двете не съм ги ползвал от 10 годнини ;-))).
В първия момент в който погледнах кода си мислех, че човека иска да си създаде нови обекти ( не за друго ами ако промени полето да не инт. ами стринг - това няма да работи) и да ги добави в комбото вързани със списъка - нещо което много често използвам аз!
Така, че идеята на мястото на pointer (int32/64 - вече и аз не знам кое от двете е) да се запише число не е нова, но след размишления - точно заради стратегията на Борланд да държат програмистити доста по далече от генерирания код (за разлика от С компилаторите) се отказах да ползвам такива неща!!!!!!!
Още повече, че подобни неща ще изглеждат невъобразимо зле (ако не изключиш съобщенията за указатели) в Д7 - виждал съм код който ползва указатели - и повярвай не е много приятна идеята да чакаш компилатора да листне 1500 съобщения (може и да отнеме повече от 5 мин) - при положение, че забравиш да изключиш опцията преди това. Д7 -цата зависва като "прани гащи" в подобно положение ;-))) и ако не знаеш много кофти изненада.
---
Е т'ва е живот!
В първия момент в който погледнах кода си мислех, че човека иска да си създаде нови обекти ( не за друго ами ако промени полето да не инт. ами стринг - това няма да работи) и да ги добави в комбото вързани със списъка - нещо което много често използвам аз!
Така, че идеята на мястото на pointer (int32/64 - вече и аз не знам кое от двете е) да се запише число не е нова, но след размишления - точно заради стратегията на Борланд да държат програмистити доста по далече от генерирания код (за разлика от С компилаторите) се отказах да ползвам такива неща!!!!!!!
Още повече, че подобни неща ще изглеждат невъобразимо зле (ако не изключиш съобщенията за указатели) в Д7 - виждал съм код който ползва указатели - и повярвай не е много приятна идеята да чакаш компилатора да листне 1500 съобщения (може и да отнеме повече от 5 мин) - при положение, че забравиш да изключиш опцията преди това. Д7 -цата зависва като "прани гащи" в подобно положение ;-))) и ако не знаеш много кофти изненада.
---
Е т'ва е живот!