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

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

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


Страницы:   1 2 ... 20 21 22 23 24 25 26 ... 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 ситуация не менялась.


Игорь Шевченко   (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 коннекта, одним сделал изменения, другим тут же прочитал, а данные то старые... не синхронизированные).


Страницы:   1 2 ... 20 21 22 23 24 25 26 ... 32 33

Наверх

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