Форум: "Потрепаться";
Текущий архив: 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