Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Освобождение ресурса в finally


Страницы:   1 2 ... 8 9 10 11 12 13 14 ... 32 33

Arinyshka ©   (2008-04-23 12:17:00) 

Не подскажете еще один момент:
Есть процедура, выглядит примерно так

procedure TSetPayFrm.BtnAddImageClick(Sender: TObject);
var  TempBitmap:TBitmap;
begin
if not(opendialog1.Execute) then  exit;
try
 TempBitmap  := TBitmap.Create;
 TempBitmap.LoadFromFile(OpenDialog1.FileName);
finally
TempBitmap.Free;
end;
end;

На освобождение  TempBitmap.Free; выдает варнинг
[Warning] uSetPaymentMain.pas(313): Variable 'TempBitmap' might not have been initialized
Не смертельно, но непонятно... почему варнинг? При изменениии условия и включении всей конструкции в один блок begin..end ситуация не менялась.


Palladin   (2008-05-04 16:21:00) [201]


> А про сторонние компоненты я тоже ничего не писал :)

Ну ты много чего не писал. Да и не сторонние они, они мои личные, и это не компоненты, а библиотека классов разработанная несколько лет назад. Она продолжает развиваться и дальше. XML, например, я реализовал совсем не давно. При чем развивается так, что старые проекты использовавшие эту библиотеку, продолжают компилироваться.


> ИМХО : Использование готовых классов - это не совсем ООП.

Это как раз ООП. Как ты думаешь, на кой нужны классы сами по себе? А никому они не нужны сами по себе. Они призваны решать какие-то задачи. Если ты ожидал, что я сейчас начну рождать систему из мелких классов для решения этой задачи, то ты ошибаешься, у меня набор конкретных классов, однажды написанных, и использование из в совокупности позволяет быстро решить, как эту задачу, так и множество других. Причем решение это интуитивно понятно для тех кто даже и не знает эти классы. Из названий методов и обращений можно догадаться что происходит.

А ты как поклонник ПП и противник ООП не должен пользоватся существующими классами, а разбить процедуру на подпроцедуры. Вот это и будет ПП.


ANB   (2008-05-04 16:07:00) [202]

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


ANB   (2008-05-04 16:05:00) [203]


> TWRXMLElements,TWRXMLElements - классы представляющие элементы
> распарсенного XML файла

А про сторонние компоненты я тоже ничего не писал :) Но все соответствует задаче - чем удобнее, тем и пользуемся.


> Везде, я оперирую тремя объектами.

ИМХО : Использование готовых классов - это не совсем ООП. Иначе мона сказать, что я тока ООП и использую.


Восхищенный   (2008-05-04 15:59:00) [204]

> ANB   (04.05.08 15:45) [447]

> 1. А где ООП то ?

ООП как раз видно. Не видно ПП. Скорее, это ХП называется.
:о)


Palladin   (2008-05-04 15:56:00) [205]


> ANB   (04.05.08 15:45) [447]



> 1. А где ООП то ?

Везде, я оперирую тремя объектами.


> Но : For i:=0 to theResults.Count-1 Do
>  Dispose(PRec(theResults.IntegerData[i])); меня слегка смущает.
>  Это действительно безопасно ?

абсолютно


> 4. В Д7 у меня не компиляется (ругается на неизвестный тип
> WRXMLElements)
> Что надо прикрутить в юзес ?

Ничего не нужно, без моих библиотек он у тебя и не скомпилируется. В кратце:

TWRXMLElements,TWRXMLElements - классы представляющие элементы распарсенного XML файла

TWRIntegerMap - класс, карты ключ-значение


ANB   (2008-05-04 15:45:00) [206]

Претензии :
1. А где ООП то ?
2. По собственно коду претензий особо нету.
Но : For i:=0 to theResults.Count-1 Do
 Dispose(PRec(theResults.IntegerData[i])); меня слегка смущает. Это действительно безопасно ?


ANB   (2008-05-04 15:42:00) [207]


> о как... мы оказывается не о делфи...

1. Где было про делфи ?
2. Время больше моего
3. Код у меня явно короче
4. В Д7 у меня не компиляется (ругается на неизвестный тип WRXMLElements)
Что надо прикрутить в юзес ?


Palladin   (2008-05-04 15:27:00) [208]

о как... мы оказывается не о делфи...


Palladin   (2008-05-04 15:25:00) [209]

procedure TForm1.Button1Click(Sender: TObject);
Type
PRec=^TRec;
TRec=Record
 Count:Integer;
 Sum:Currency;
End;

Var
theSource:TWRXMLElements;
theReqs:TWRXMLElements;
theResults:TWRIntegerMap;

nType:Integer;
fSum:Currency;

n,i:Integer;

Function _NewElement:PRec;
Begin
 New(Result);
 Result.Count:=0;
 Result.Sum:=0;
End;

begin
theResults:=TWRIntegerMap.Create;
Try
 theSource:=CreateWRXMLFromFile('c:\test.xml');
 Try
 
  If theSource.Count=2 Then theReqs:=theSource[1].Elements.ByName['request'] Else
  If theSource.Count=1 Then theReqs:=theSource[0].Elements.ByName['request'] Else Exit;
  If theReqs=Nil Then Exit;

  For i:=0 to theReqs.Count-1 Do
   Begin
    nType:=theReqs[i].AsInt['request_type'];
    fSum:=theReqs[i].AsCur['sum'];

    If Not theResults.Find(nType,n) Then theResults.Add_Integer(nType,Integer(_NewElement),n);
    Inc(PRec(theResults.IntegerData[n]).Count);
    With PRec(theResults.IntegerData[n])^ Do Sum:=Sum+fSum;
   End;

  For i:=0 to theResults.Count-1 Do
   With PRec(theResults.IntegerData[i])^ Do
    Memo1.Lines.Add('Type:'+IntToStr(theResults[i])+', Count:'+IntToStr(Count)+', Sum:'+CurrToStr(Sum));
   
 Finally
  theSource.Free;
 End;
Finally
 For i:=0 to theResults.Count-1 Do
  Dispose(PRec(theResults.IntegerData[i]));
 theResults.Free;
End;
end;


жду вопросов и претензий


ANB   (2008-05-04 15:19:00) [210]

Ой. Накосячил чуток.
Код :

with X as
(
select
'<?xml version="1.0" encoding="windows-1251" ?>
 <requests>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="102" request_sum="15.45"/>
   <request request_type="104" request_sum="16.45"/>
   <request request_type="101" request_sum="11.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="102" request_sum="15.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="103" request_sum="15.45"/>
   <request request_type="101" request_sum="14.45"/>
   <request request_type="105" request_sum="15.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="101" request_sum="11.45"/>
   <request request_type="106" request_sum="15.45"/>
   <request request_type="101" request_sum="12.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="107" request_sum="15.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="102" request_sum="18.45"/>
   <request request_type="103" request_sum="15.45"/>
   <request request_type="101" request_sum="15.45"/>
 </requests>
'
XMLValue
from dual
)
select
request_type
,count(*) request_count
,sum(request_sum) request_sum
from
(
select
 extractvalue (value (XMLValue), '/request@request_type') request_type
,to_number(extractvalue (value (XMLValue), '/request@request_sum'),'999999999999.9999') request_sum
from
table
(
  xmlsequence
  (
   xmltype((
   select
    XMLValue
   from
    X
    )).extract ('/requests/request')
  )
) XMLValue
)
group by
 request_type

Ответ :
   REQUEST_TYPE REQUEST_COUNT REQUEST_SUM
1 101 15 219.75
2 102 3 49.35
3 103 2 30.9
4 104 1 16.45
5 105 1 15.45
6 106 1 15.45
7 107 1 15.45

Мона засчитать, что закончил в 15:19.


ANB   (2008-05-04 15:18:00) [211]

Для тех, у кого нету оракла ответ :

   REQUEST_TYPE REQUEST_COUNT REQUEST_COUNT
1 101 15 219.75
2 102 3 49.35
3 103 2 30.9
4 104 1 16.45
5 105 1 15.45
6 106 1 15.45
7 107 1 15.45


ANB   (2008-05-04 15:15:00) [212]

Да. Реальное решение будет еще проще, т.к. я заранее перегоню клоб в переменную.


ANB   (2008-05-04 15:13:00) [213]

Мой ответ :

with X as
(
select
'<?xml version="1.0" encoding="windows-1251" ?>
 <requests>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="102" request_sum="15.45"/>
   <request request_type="104" request_sum="16.45"/>
   <request request_type="101" request_sum="11.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="102" request_sum="15.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="103" request_sum="15.45"/>
   <request request_type="101" request_sum="14.45"/>
   <request request_type="105" request_sum="15.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="101" request_sum="11.45"/>
   <request request_type="106" request_sum="15.45"/>
   <request request_type="101" request_sum="12.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="107" request_sum="15.45"/>
   <request request_type="101" request_sum="15.45"/>
   <request request_type="102" request_sum="18.45"/>
   <request request_type="103" request_sum="15.45"/>
   <request request_type="101" request_sum="15.45"/>
 </requests>
'
XMLValue
from dual
)
select
request_type
,count(*) request_count
,sum(request_sum) request_count
from
(
select
 extractvalue (value (XMLValue), '/request@request_type') request_type
,to_number(extractvalue (value (XMLValue), '/request@request_sum'),'999999999999.9999') request_sum
from
table
(
  xmlsequence
  (
   xmltype((
   select
    XMLValue
   from
    X
    )).extract ('/requests/request')
  )
) XMLValue
)
group by
 request_type
-- Начал 15:02
-- Закончил 15:12


Зазвиняюсь за задержку - начальник отвлек. Время честное.


Palladin   (2008-05-04 15:04:00) [214]

ок... приступил...


ANB   (2008-05-04 15:00:00) [215]

Есть предложение.
Решаем задачу тем способом, который больше нравится, затем сравниваем время, потраченное на решение и объем кода.
Рискнем доверять друг другу, т.е. поверим времени на слово. (в конце концов не корову разыгрываем).

И так, имеем XML с таким содержимым (для простоты мона считать, что он находится где удобнее - в строке-константе, в таблице, в файле, т.е. с вводом выводом не заморачиваемся).

<?xml version="1.0" encoding="windows-1251" ?>
 <requests>
   <request request_type="101" sum="15.45"/>
   <request request_type="102" sum="15.45"/>
   <request request_type="104" sum="16.45"/>
   <request request_type="101" sum="11.45"/>
   <request request_type="101" sum="15.45"/>
   <request request_type="101" sum="15.45"/>
   <request request_type="101" sum="15.45"/>
   <request request_type="102" sum="15.45"/>
   <request request_type="101" sum="15.45"/>
   <request request_type="101" sum="15.45"/>
   <request request_type="103" sum="15.45"/>
   <request request_type="101" sum="14.45"/>
   <request request_type="105" sum="15.45"/>
   <request request_type="101" sum="15.45"/>
   <request request_type="101" sum="11.45"/>
   <request request_type="106" sum="15.45"/>
   <request request_type="101" sum="12.45"/>
   <request request_type="101" sum="15.45"/>
   <request request_type="101" sum="15.45"/>
   <request request_type="107" sum="15.45"/>
   <request request_type="101" sum="15.45"/>
   <request request_type="102" sum="18.45"/>
   <request request_type="103" sum="15.45"/>
   <request request_type="101" sum="15.45"/>
 </requests>

Считаем, что более 5 тысяч элементов не будет.
Нужно - быстренько посчитать, сколько элементов какого типа и на какую сумму содержится в этом XML. Уточняю : группировка по request_type.

Приступаем ?


ANB   (2008-05-04 14:50:00) [216]


> Только давай уж сравнивать сравнимое, я посмотрю сколько
> времени у тебя уйдет на реализацию, того, что тебе дается
> уже в готовом виде, с обработкой исключений, очередей сообщений,
>  форм, аналогов компонент с обработкой событий, ошибок,
>  и т.д. и т.п. Или ты будешь делать все в WinAPI или работать
> в консоли? Не забудем и про базы данных и графику.
> Вот тогда и поговорим.

Использование готовых классов - это не ООП, а фактически процедурное программирование.
ЗЫ. Чего бы их не пользовать, если они уже написаны.


Palladin   (2008-05-04 14:01:00) [217]


> ANB   (04.05.08 10:26) [432]
> Единственная область, где ООП имеет практически подавляющее
> преимущество - моделирование

Моделирование чего?


Anatoly Podgoretsky   (2008-05-04 13:31:00) [218]


> Во всех остальных задачах ПП и ООП практически либо равны
> по трудоемкости реализации, либо ПП имеет преимущество.
> Причем, по скорости, выполнения ПП имеет преимущество почти
> всегда.

Только давай уж сравнивать сравнимое, я посмотрю сколько времени у тебя уйдет на реализацию, того, что тебе дается уже в готовом виде, с обработкой исключений, очередей сообщений, форм, аналогов компонент с обработкой событий, ошибок,  и т.д. и т.п. Или ты будешь делать все в WinAPI или работать в консоли? Не забудем и про базы данных и графику.
Вот тогда и поговорим.

А так все можно сделать и с помощью АСМ, и если хорошо поработать, разработав приличную библиотеку макросов, то в дальнейшем создание приложений, в совокупности с внешним редактором ресурсов будет занимать примерно тоже время или даже быстрее.


oxffff   (2008-05-04 12:09:00) [219]


> ANB   (04.05.08 10:26) [432]
>
> >  И я ярый противник безсмысленного обращения к ПП, когда
>
> > есть более чем смысленное решение ООП
>
> Такого не бывает практически никогда.
>
> Единственная область, где ООП имеет практически подавляющее
> преимущество - моделирование и рисование (которое тоже,
> в принципе, моделирование). Собственно, с него ООП и начиналось.
>
>
> Во всех остальных задачах ПП и ООП практически либо равны
> по трудоемкости реализации, либо ПП имеет преимущество.
> Причем, по скорости, выполнения ПП имеет преимущество почти
> всегда.


ПП это что полупрограммирование?


Жуков Олег   (2008-05-04 10:50:00) [220]

Любая прикладная программа - моделирование части реального мира


Страницы:   1 2 ... 8 9 10 11 12 13 14 ... 32 33

Наверх

Титульная страница Поиск, карта сайта Написать письмо