![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Освобождение ресурса в finally
Arinyshka © (2008-04-23 12:17:00)
Страницы: < 1 2 ... 8 9 10 11 12 13 14 ... 32 33 >
Не подскажете еще один момент:
Есть процедура, выглядит примерно так
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]Любая прикладная программа - моделирование части реального мира