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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.027 c
3-1084371769
windows
2004-05-12 18:22
2004.05.30
русский язык


1-1084724706
killer
2004-05-16 20:25
2004.05.30
функция округления


6-1081314901
D.Z.
2004-04-07 09:15
2004.05.30
Дескриптор сокета в чужой программе.


14-1084430929
Kerk
2004-05-13 10:48
2004.05.30
RTFM


14-1084467296
romychk
2004-05-13 20:54
2004.05.30
Не могу настроить TCP IP