![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Освобождение ресурса в finally
Arinyshka © (2008-04-23 12:17:00)
Страницы: < 1 2 ... 20 21 22 23 24 25 26 ... 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 ситуация не менялась.
Игорь Шевченко (2008-04-25 13:57:00) [441]ANB (25.04.08 12:09) [208]
> Невозможно.
Выдержку из оракловской доки, плз.
> Чем пользовались (компоненты) ?
Своими.
Где-то такой код:
procedure TdmMember.DataModuleCreate(Sender: TObject);
begin
...
if Options.RunBirthdayThread then
TBirthdayThread.Create;
if Options.RunExpiredTempThread then
TExpiredTempThread.Create;
end;
procedure TBirthdayThread.Execute;
...
dmMember.BirthdayThreadRunning := true;
with dmMember.qMemberBirthday do
begin
Prepare;
Params[0].AsString := Today;
Open;
try
while not Eof and not Terminated do
begin
....
end;
...
end;
...
end;
...
procedure TExpiredTempThread.Execute;
begin
....
dmMember.ExpiredTempThreadRunning := true;
with dmMember.qExpiredTemp do
begin
Prepare;
Open;
try
while not Eof and not Terminated do
begin
....
end;
...
end;
...
end;
ANB (2008-04-25 13:44:00) [442]
> Да, у меня каскадом вложенных try блоков и не пахнет.
Дык это Ega23 любит вложенные трай. Вот я и попросил его распилить на методы при таком подходе.
А у нас получается подход одинаковый. Просто мои строки перенесены в отдельные методы. Суть от этого не поменялась. И код короче не стал.
Вот только у меня привычка - я переношу в отдельную функцию код, если он повторяетсяболее одного раза. Мнетак понятнее.
ANB (2008-04-25 13:40:00) [443]
> 3. До какого цикла? Ты где у меня циклы увидел вообще?
Цикл подразумевается в методе "Все сделать".
Palladin (2008-04-25 13:14:00) [444]
> ANB (25.04.08 09:51) [195]
Да, я пишу сложные программы. Да, я не страдаю "жирным" запутанным кодом. Да, у меня каскадом вложенных try блоков и не пахнет. Да, мне проще оформить некий набор действий в одну логическую единицу.
1. В какие десять строк? 6 компонентов, 6 присваниваний в Nil, 6 конструкторов, 6 вызово free, сколько? 24 строчечки... + try finally end, 27 строчечек, + еще десятки строк на работу с объектами и сам по себе парсинг.
2. Я не привел тебе код для копирования и вставки, я привел тебе метод решения задачи.
3. До какого цикла? Ты где у меня циклы увидел вообще?
4. Вот именно что отличается принципиально. Перед нами сущность созданная для функционала, а не для конкретной работы. Сегодня текстовые файлы, завтра файл с определенной структурой, после завтра XML. И что будет менятся? Не вся жирная процедура, а только методы этой сущности, которые отвечают за работу с внешними данными.
ANB (2008-04-25 12:09:00) [445]
> Э...я как бы запускал несколько запросов параллельно в одной
> сессии...
Невозможно.
Чем пользовались (компоненты) ?
Есть подозрение, что сессии были созданы автоматически.
ОДАК и ДОА такого не допускают.
Можно только распараллелить запрос, но при этом все равно оракл под кажную порцию сам запустит свою сессию.
Игорь Шевченко (2008-04-25 12:06:00) [446]
> Не. У оракла если сессия чего то делает, пусть и асинхронно,
> второй запрос параллельно уже не пустишь. Там с сессиями
> все строго.
Э...я как бы запускал несколько запросов параллельно в одной сессии...
ANB (2008-04-25 11:17:00) [447]
> коннект может держать собственные потоки (асинхронность),
> т.е. нет нужды в дополнительных сессиях
Не. У оракла если сессия чего то делает, пусть и асинхронно, второй запрос параллельно уже не пустишь. Там с сессиями все строго.
А для мс скл - не наю. Когда сталкивался с ним, понял, что понятие "сессия" у него более гибкое и сложное.
ANB (2008-04-25 11:14:00) [448]
> Тоже не факт. Иные напишут с десяток классов в иерархии
> - вааще не прочитаешь, не то, что изменения какие вносить
+1.
Смотрел я как то модуль импорта в новом проекте. 20 методов по 3-5 строчек в каждом. Вызываются друг из друга. Черт ногу сломит. Хотя процедура и алгоритм довольно простые.
А так сам автор пол-часа искал, где у него что живет.
sniknik (2008-04-25 11:08:00) [449]> В одаке тяжелее так лопухнутся, т.к. компоненты не умеют сами по себе коннектится.
больше возможностей -> больше вероятность какуюто применить не по адресу.
так данная возможность "отдельно стоящего" рекордсета мной часто используется, не связывая с базой, для хранения и обработки данных.
> Да. По п.2. В принципе ИНОГДА имеет смысл открыть и несколько сессий для ускорения.
коннект может держать собственные потоки (асинхронность), т.е. нет нужды в дополнительных сессиях, если только эти сессии не к разным sql серверам. ("ИНОГДА" еще на 100 поделить, для определения реальной нужды в использовании)
Игорь Шевченко (2008-04-25 11:03:00) [450]Восхищенный (25.04.08 10:28) [200]
А если в голове разрухи нет, можно и с goto вполне читабельно написать
Anatoly Podgoretsky (2008-04-25 10:59:00) [451]> Игорь Шевченко (25.04.2008 10:16:19) [199]
Ну так любуб вещь можно испоганить, дело то не хитрое.
Ega23 (2008-04-25 10:39:00) [452]
> Тоже не факт. Иные напишут с десяток классов в иерархии
> - вааще не прочитаешь, не то, что изменения какие вносить
Игорь, ты же сам говорил, что универсальных решений не бывает.
Но вот уже достаточно длительное время у меня никак не получается процедуры-фунции-метода более, чем на 50 строк кода. Чаще - 10-20 между основным begin..end
Восхищенный (2008-04-25 10:28:00) [453]> Игорь Шевченко © (25.04.08 10:16) [199]
Если в голове разруха - то да. А если вся иерархия четко спроектирована, если понятно, для чего каждый класс нужен, что и как он делает - то нет.
Игорь Шевченко (2008-04-25 10:16:00) [454]
> Вот только нечитабельно будет.
Тоже не факт. Иные напишут с десяток классов в иерархии - вааще не прочитаешь, не то, что изменения какие вносить
Ega23 (2008-04-25 10:09:00) [455]
> 4) А теперь самое главное - чем отличается принципиально
> твой подход от моего с одним файнелли ? Ну разве что тем,
> что ты пользуешь поля класса, а я - локальные переменные,
> посему мне надо их нилить, а за тебя это неявно конструктор
> сделает.
>
Дык и всю программу можно без процедур и функций писать. С глобальными переменными и goto. И будет работать. И может быть даже не хуже.
Вот только нечитабельно будет.
Восхищенный (2008-04-25 09:55:00) [456]> ANB (25.04.08 09:51) [195]
> 4) А теперь самое главное - чем отличается принципиально
> твой подход от моего с одним файнелли?
Структурированностью и обозримостью. Из которых вытекают более простые модификация, расширение и поддержка. Они и есть - принципиально.
ANB (2008-04-25 09:53:00) [457]Да. По п.2. В принципе ИНОГДА имеет смысл открыть и несколько сессий для ускорения.
ANB (2008-04-25 09:51:00) [458]
> Palladin © (24.04.08 17:50) [192]
Хай. Снимаю свой наезд по поводу разработки сложных программ. Ты их реально пишешь. :)
Значится по коду замечания :
1) Все что здесь уже написано - это заменяет всего строк 10 в одной процедуре. Сильно проще не стало.
2) Про коннекты - отдельная песня, но т.к. я работаю с ораклом и не через АДО - это тут по барабану. В одаке тяжелее так лопухнутся, т.к. компоненты не умеют сами по себе коннектится.
3) Более серьезное замечание : селекты и инсерты надо запихать ДО цикла и препарировать. Чтобы уже в итерации тока параметры подсовывать. Потому я под кажный ДМЛ и отвел отдельный объект.
4) А теперь самое главное - чем отличается принципиально твой подход от моего с одним файнелли ? Ну разве что тем, что ты пользуешь поля класса, а я - локальные переменные, посему мне надо их нилить, а за тебя это неявно конструктор сделает.
Palladin (2008-04-24 18:16:00) [459]
> sniknik © (24.04.08 18:13) [193]
аааа.... ты придешь... я знал... я знал.... :) в общем тонкости реализации работы с БД в этом псевдопримере лучше доверить Николаю :) схема понятна...
sniknik (2008-04-24 18:13:00) [460]<> CODE>m_theSelQuery:=TADOQuery.Create(Nil);
> m_theSelQuery. ConnectionString:=p_strConnectionString;
> m_theExecQuery:=TADOQuery.Create(Nil);
> m_theExecQuery. ConnectionString:=p_strConnectionString;
ай, нехорошо... чревато глюками (2 коннекта, одним сделал изменения, другим тут же прочитал, а данные то старые... не синхронизированные).