Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

Динамический объект.   Найти похожие ветки 

 
Shopot ©   (2004-05-08 22:50) [0]

Как я понимаю Дельфи-это фигня(извините модераторы, но не могу...)! Я не могу определить, существует объект
в памяти или нет. В C++ это сделать 2 секунды. Но на дельфи
писать меньше, а ошибок больше. Вот например, мне надо определить существует ли
BMP типа TBitMap, или мне надо делать BMP := TBitMap.Create. Ведь если
он не существует BMP все равно не = nil, тогда как определить
есть ли он вообще?


 
Palladin ©   (2004-05-08 23:00) [1]

следить за собой надо... и контролировать себя...
инициализировать любой объект всегда nil, и при free тоже выставлять в nil... или пользоватся FreeAndNil, тогда приучишь себя к дисциплине кодирования...


 
Algol   (2004-05-08 23:14) [2]


> Shopot

А как это определить в C++ ?


 
Gero ©   (2004-05-08 23:19) [3]


> В C++ это сделать 2 секунды

Это команда для определения так долго выполняется?


 
TUser ©   (2004-05-09 05:43) [4]

Ой, а я на Делфи не могу икону в трей упихать. Щас модераторы спать лягут, я скажу все, что я об этом Делфи думаю.

PS. Это не у тебя оператор присвоения недавно к краху системы приводил? Тоже Борланд виноват, аднзначно.


 
mike-d ©   (2004-05-09 09:01) [5]

> Shopot ©   (08.05.04 22:50)


> существует ли
> BMP типа TBitMap, или мне надо делать BMP := TBitMap.Create.
> Ведь если
> он не существует BMP все равно не = nil, тогда как определить
> есть ли он вообще?


(ИМНО) Например так...
if Assigned(BMP) then
begin
 if BMP.InstanceSize <> 0 then TBitMap.Create;
end
else BMP := TBitMap.Create;


 
mike-d ©   (2004-05-09 09:05) [6]

Сорри, ошибочка вкралась :)
Конечно же...
 if Assigned(BMP) then
 begin
   if BMP.InstanceSize = 0 then TBitMap.Create;
 end
 else BMP := TBitMap.Create;


 
Palladin ©   (2004-05-09 10:05) [7]

Дайте мне красный карандаш на пять сек.


 
Palladin ©   (2004-05-09 10:14) [8]


> mike-d ©   (09.05.04 09:05) [6]

Потрудитесь шаг за шагом объяснить Ваш код. В подробностях. А так же предпосылки его появления.


 
Юрий Зотов ©   (2004-05-09 10:36) [9]

> Shopot ©   (08.05.04 22:50)  

> Как я понимаю Дельфи-это фигня(извините модераторы, но не
> могу...)! Я не могу определить, существует объект
> в памяти или нет.

Безусловно, Вы правы. Это именно Delphi виновата в том, что Вы чего-то не можете сделать. А когда человек не умеет управлять автомобилем - то это автомобиль плохой.

> mike-d ©   (09.05.04 09:01) [5]
> mike-d ©   (09.05.04 09:05) [6]

1. К сожалению, в Вашем ответе сразу 2 грубых ошибки.
2. Если бы Вы сначала проверили свой ответ САМИ, то не было бы причин на это указывать.


 
mike-d ©   (2004-05-09 12:21) [10]

> Юрий Зотов ©   (09.05.04 10:36) [9]
Да, согласен - облажался. Буду исправляться...


 
Adder ©   (2004-05-09 17:11) [11]

Всё фигня, кроме пчёл (с)


 
Anatoly Podgoretsky ©   (2004-05-09 17:35) [12]

Adder ©   (09.05.04 17:11) [11]
и модератора женщины


 
Игорь Шевченко ©   (2004-05-09 18:41) [13]

И все-таки, было бы интересно услышать начальника транспортного цеха.


 
Anatoly Podgoretsky ©   (2004-05-09 19:38) [14]

Сейчас доложит.


 
Shopot ©   (2004-05-09 21:14) [15]

По-моему никто из вас никогда серьезно с памятью не работал.
Забыли вы старый добрый ДОС, где просто потеешь, чтобы наскребсти последние 2-3 байта и ввести новую возможность в программу. Вы прыгнули сразу ни Винды, типа 32 бита, плоская модель памяти, засирай - нехочу, а если сам не засрешь, то за тебя все сделает великий и могучий компилятор! А вот Винды поперли на ООП не обдумав как этим вообще можно пользоваться. Поэтому даже в 95 Винде более 2000 ошибок, которые автоматически переходят в твою прогу. А ты сидишь материшся и ничего не можешь сделать, т.к. пользователь хочет программу под Виндовс. Может это и не Дельфи такая плохая, может я чего не понимаю, но объясните мне ПОЖАЛУЙСТА, как определить создан объект или нет (допустим создается он автоматически, самой системой) если у меня есть переменная экземпляра этого объекта.

>> mike-d  
Сорри, ошибочка вкралась :)
Конечно же...
if Assigned(BMP) then
begin
  if BMP.InstanceSize = 0 then TBitMap.Create; // <<<< error
end
else BMP := TBitMap.Create

А ты сам попробуй, работает?


 
Nous Mellon ©   (2004-05-09 21:18) [16]


> По-моему никто из вас никогда серьезно с памятью не работал.

Да конечно куда до тебя нашим мастерам...


 
Palladin ©   (2004-05-09 21:19) [17]

И все в пустую...

---
Помните! Чем выше качество вопроса, тем выше качество ответа.


 
Palladin ©   (2004-05-09 21:22) [18]

Я только не понял при чем тут за<этосамое> памяти... принцип который высказан в [1] справедлив для любого ЯП, ну кроме может тех где есть GC, но и там тоже лучше им следовать, в пределах разумного. Если утекает память нечего ЯП хаять, как уже сказано, в этом случае дисциплина кодирования нулевая.

---
Помните! Чем выше качество вопроса, тем выше качество ответа.


 
Mihey ©   (2004-05-09 21:26) [19]

2 Shopot:

Да шадап уже...

var a: TBitmap;

... OnCreate

a := nil;

... Some SuppaPuppaProcedures
If (n > 0) and BillGatesStinks then a := TBitmap.Create else ...

... Добралися
If a = nil then a := TBitmap.Create else ShowMessage("2-то зачем?");


 
TCrash ©   (2004-05-09 21:30) [20]

Рулез, так и нужно


 
Игорь Шевченко ©   (2004-05-09 21:51) [21]

Shopot ©   (09.05.04 21:14)

Жаль, что мы так и не услышали начальника транспортного цеха.

Так как ты на С++ определяешь, чудо ?


 
Palladin ©   (2004-05-09 21:54) [22]


> , чудо ?

:)))

---
Помните! Чем выше качество вопроса, тем выше качество ответа.


 
Юрий Зотов ©   (2004-05-09 22:11) [23]

> Shopot © (09.05.04 21:14) [15]

Что касается правильного и полного ответа, то он был дан в первом же посте. И если человек хотя бы понимает, что такое указатели и динамическая память, то такого ответа ему должно было быть более, чем достаточно.

Поэтому совершенно непонятно, почему же для программиста, серьезно работавшего с памятью, не забывшего старый добрый ДОС, где ему приходилось просто потеть, чтобы наскрести последние 2-3 байта и ввести новую возможность в программу - почему же для ТАКОГО программиста простейшая задачка вдруг стала проблемой?

Ох, что-то тут не сладывается. Поскольку для программиста, который ДЕЙСТВИТЕЛЬНО умеет работать памятью это даже не вопрос - определить, создан ли объект, или нет.

Может быть, проблема в этом:
> А вот Винды поперли на ООП

Или вот в этом:
> допустим создается он автоматически, самой системой

Оказывается, Windows - это не только объектно-ориентированная система, но она еще и объекты Delphi умеет создавать - сама и автоматически. Ох, что-то тут снова не складывается.

А еще непонятно, почему этот программист вдруг начинает гнуть пальцы и катить баллоны на Delphi, на Windows, на других... в общем, на все и всех, кроме самого себя.

Может быть, ГЛАВНАЯ проблема как раз в этом и есть? Если задуматься.

=============================================

С трудом сдержался...
:о)


 
default ©   (2004-05-10 09:53) [24]

function IsInvalidPointer(Obj: TObject): Boolean;
begin
Result := True;
try
 FreeMem(Pointer(Obj));
except
 Result := False
end;
end;
я нисколько не уверен в том что это "хороший и даже работающий" способ
в одном нет сомнений - FreeMem распознаёт "убитый указатель"
а в том что при этой проверке FreeMem ничего плохого не творит никакой уверенности нет, но ошибок у меня не возникало с использованием объекта после такой проверки(когда он не был убит ещё)


 
Algol   (2004-05-10 10:13) [25]


> default ©   (10.05.04 09:53) [24]

Верный способ разрушить программу...


 
default ©   (2004-05-10 10:18) [26]

Algol   (10.05.04 10:13) [25]
я ж написал что нет никакой уверенности в этом способе, но как говорится "всё работает"


 
Algol   (2004-05-10 10:26) [27]


> default ©   (10.05.04 10:18) [26]


Потерянный указатель может указывать куда угодно, в том числе и на недавно созданный и ничего не подозреваюищий объект, который вы своим FreeMem и хлопните.


 
Тимохов ©   (2004-05-10 10:32) [28]

Уважаемые.
Может просто игронировать такие отстойные посты?
Обидно аж за потраченное на такую фигню время уважаемых людей... :((


 
default ©   (2004-05-10 10:45) [29]

Algol   (10.05.04 10:26) [27]
да всё это прекрасно понятно...давайте говорить конкретно
покажите пример кода показывающий несостоятельность этого способа
(сотый раз повторюсь - я ни на грамм не говорю что это хороший  рабочий способ просто хочется увидеть где он обломается)


 
Anatoly Podgoretsky ©   (2004-05-10 10:45) [30]

Тимохов ©   (10.05.04 10:32) [28]
Да не растраивайся, ведь не по серьезному же тратится, какая уж тут серьезность.


 
default ©   (2004-05-10 10:47) [31]

Тимохов ©   (10.05.04 10:32) [28]
извините, конечно, но не люблю когда подмазываются...
"уважаемые люди" сами, наверно, решат учавствовать им в данном сабже или нет


 
Тимохов ©   (2004-05-10 10:53) [32]


> default ©   (10.05.04 10:47) [31]

извините, конечно, но не люблю когда не по делу огрызаются.
Вы не находите, что темы типа "Дельфи - г..но" побуждают бурные эмоции, хотя имхо должны были бы просто не вызывать интереса?


 
default ©   (2004-05-10 10:57) [33]

Тимохов ©   (10.05.04 10:53) [32]
это вопросы к модераторам
если они это не удалили значит этот сабж имеет право жить
а было бы инересно если бы все посты были "умнющими"?
некоторое время, наверно, только потом бы всем стало скучно, и не хотелось бы читать посты потому чтобы понять в чём дело и придумать неорд-ое решение надо минимум часа 2 было бы...


 
Sergey Masloff   (2004-05-10 10:58) [34]

default ©   (10.05.04 10:45) [29]
или я чего-то не понял или...

procedure TForm1.Button1Click(Sender: TObject);
var
 p : Pointer;
begin
 p := Pointer($0000FFFF); // Например
 if IsInvalidPointer(p) then
   ShowMessage("Инвалид")
 else
   ShowMessage(TObject(p).ClassName);
end;


 
default ©   (2004-05-10 10:59) [35]

не посты а сабжы...(то есть вопросы поставленные...)


 
Тимохов ©   (2004-05-10 11:01) [36]


> default ©   (10.05.04 10:57) [33]

Дело не в глупости данного вопроса, а в его провокационности.
Вопросы должно быть по делу. Пусть глупые и глубоко неквалифицированные - поправить человека всегда найдется желающий.


 
Sergey Masloff   (2004-05-10 11:01) [37]

ну в смысле ShowMessage(TObject(p).ClassName); -> AccessViolation


 
default ©   (2004-05-10 11:05) [38]

Sergey Masloff   (10.05.04 10:58) [34]
sorry, название не соотв-ет смыслу IsNotInvalidPointer
то что FreeMem распознаёт битые указатели на объекты это ладно, хотелось бы увидеть чтоб после передачи нормального указателя на объект в эту ф-ию объектом пользоваться было бы нельзя


 
Verg ©   (2004-05-10 11:25) [39]


>  хотелось бы увидеть чтоб после передачи нормального указателя
> на объект в эту ф-ию объектом пользоваться было бы нельзя


procedure TForm1.Button1Click(Sender: TObject);
begin
 IsNotInvalidPointer(Form1);
end;


 
Algol   (2004-05-10 11:37) [40]

Вот тоже любопытный результат:

type
 TMyClass=class
 v:Integer;
 end;
....
procedure TForm1.Button1Click(Sender: TObject);
var V,V1:TMyClass;
begin
V:=TMyClass.Create;
V.v:=1111111;
if IsNotInvalidPointer(V) then
   showMessage(intToStr(V.V));

if IsNotInvalidPointer(V) then
   showMessage(intToStr(V.V));
end;



Страницы: 1 2 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.037 c
3-1083830612
Top100
2004-05-06 12:03
2004.05.30
индекс поля в DBGrid


4-1081938230
Tommy
2004-04-14 14:23
2004.05.30
NTQuerySystemInformation and Threads


14-1083938202
X9
2004-05-07 17:56
2004.05.30
Winternl.h


1-1084608983
AlexZ_CRC
2004-05-15 12:16
2004.05.30
Fofm1.Button*.Caption:=massiv[i];


14-1084540198
Denis_ada
2004-05-14 17:09
2004.05.30
Клиент-серверн. приложение по работе с папками и файлами





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский