![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
EhLib работа с данными [D7, MSSQL]
gnom © (2009-03-05 13:26:00)Добрый день.
Как можно осуществить выделение в DBGridEh несколько строк и сбор информации только по 1 полю в выделенной области?
Ega23 (2009-03-12 20:43:00) [1]
> а с try except, например, нельзя добиться корректной работы
> с "состоянием TDataSet"?
Вот ты достал. Не хочешь - не используй. Хочешь - используй.
Но для всяких "сомневающихся", типа тебя и Ганза - пожалуйста. Открываем тупо DB.pas и смотрим все finally:
procedure TDefCollection.UpdateDefs(AMethod: TDefUpdateMethod);
begin
if not Updated then
begin
Inc(FInternalUpdateCount);
BeginUpdate;
try
AMethod;
finally
EndUpdate;
Dec(FInternalUpdateCount);
end;
Updated := True; { Defs are now a mirror of data source }
end;
end;
procedure TFlatList.Update;
begin
if not Updated then
begin
Locked := False;
BeginUpdate;
try
Clear;
UpdateList;
FUpdated := True;
finally
EndUpdate;
Locked := True;
end;
end;
end;
procedure TField.RefreshLookupList;
var
WasActive: Boolean;
begin
if FLookupDataSet <> nil then
begin
WasActive := FLookupDataSet.Active;
ValidateLookupInfo(True);
with FLookupDataSet do
try
LookupList.Clear;
DisableControls;
try
First;
while not Eof do
begin
FLookupList.Add(FieldValues[FLookupKeyFields],
FieldValues[FLookupResultField]);
Next;
end;
finally
EnableControls;
end;
finally
Active := WasActive;
end;
end
else
ValidateLookupInfo(False);
end;
function TBlobField.GetAsString: string;
var
Len: Integer;
begin
with DataSet.CreateBlobStream(Self, bmRead) do
try
Len := Size;
SetString(Result, nil, Len);
ReadBuffer(Pointer(Result)^, Len);
finally
Free;
end;
end;
procedure TDataSet.AddRecord(const Values: array of const; Append: Boolean);
var
Buffer: PChar;
begin
BeginInsertAppend;
if not Append then UpdateCursorPos;
DisableControls;
try
MoveBuffer(FRecordCount, FActiveRecord);
try
Buffer := ActiveBuffer;
InitRecord(Buffer);
FState := dsInsert;
try
DoOnNewRecord;
DoAfterInsert;
SetFields(Values);
DoBeforePost;
InternalAddRecord(Buffer, Append);
finally
FreeFieldBuffers;
FState := dsBrowse;
FModified := False;
end;
except
MoveBuffer(FActiveRecord, FRecordCount);
raise;
end;
Resync([]);
DoAfterPost;
finally
EnableControls;
end;
end;
Примеры взяты тупо наугад из списка (не знаю, их там штук 50-70).
фыва (2009-03-12 20:31:00) [2]
> Ega23 © (12.03.09 10:11) [21]
> try..finally в [4] исключительно для корректной
> работы с состоянием TDataSet...
а с try except, например, нельзя добиться корректной работы с "состоянием TDataSet"? и почему там в finally не только EnableControls, если "исключительно для"?
Ega23 (2009-03-12 14:33:00) [3]
> В зеркало
Покажешь, где я неправ - прилюдно извинюсь.
MsGuns (2009-03-12 14:13:00) [4]>Ega23 © (12.03.09 10:08) [20]
>Сергей, тебя последнее время сильно несёт.
В зеркало
Ega23 (2009-03-12 10:11:00) [5]
> фыва (11.03.09 21:00) [13]
>
> то есть try finally в [4] исключительно для восстановления
> отображения db-aware компонент?
try..finally в [4] исключительно для корректной работы с состоянием TDataSet, что легко можно увидеть заглянув в DB.pas
procedure TDataSet.DisableControls;
begin
if FDisableCount = 0 then
begin
FDisableState := FState;
FEnableEvent := deDataSetChange;
end;
Inc(FDisableCount);
end;
procedure TDataSet.EnableControls;
begin
if FDisableCount <> 0 then
begin
Dec(FDisableCount);
if FDisableCount = 0 then
begin
if FDisableState <> FState then DataEvent(deUpdateState, 0);
if (FDisableState <> dsInactive) and (FState <> dsInactive) then
DataEvent(FEnableEvent, 0);
end;
end;
end;
Ega23 (2009-03-12 10:08:00) [6]
> Есть еще много примеров применения try..finally без всякой
> на то необходимости. И по этой причине нормальная работа
> приложения становится ненормальной.
Сергей, тебя последнее время сильно несёт. Честно.
1. Я try..finally ставлю не задумываясь. Просто на автомате. Потому что это - потенциальная попа. Также я try..finally не задумываясь ставлю:
1.1.
Lock (или EnterCriticalSection)
try
...
finally
Unlock (или CriticalSection)
end;
1.2.
Что-то там- BeginUpdate
try
finally
Что-то там- EndUpdate
end;
1.3.
Временный_объект.Create
try
finally
Временный_объект.free;
end;
2. Если есть потенциально опасный участок кода (к которому безусловно относится игра с DisableControls, если ты в код TDataSet заглянешь), то я не вижу никакой причины обернуть его в try..finally
3. Ты можешь писать код так, как тебе угодно.
> Ты представляешь, существуют люди, которые из DB-aware контролов
> окромя дбгрида ну ничегошеньки не используют
> Им тоже твою прививку вкатывать ?
Мне, откровенно говоря, наплевать слюной на людей, которые кроме DBGrid-а больше ничего не использует. Это их личные трудности.
KSergey (2009-03-12 08:24:00) [7]> MsGuns © (12.03.09 00:28) [16]
> >И что?
> А то !
А что? Я тоже не понял.
Если уж понадобилось использовать DisableControls/EnableControls - логично обернуть их в try/finally. В чем беда?
MsGuns (2009-03-12 08:10:00) [8]>Германн © (12.03.09 01:23) [17]
>Но есть ещё много примеров применения блока try...finally по другим >причинам. И эти причины не менее важны для нормальной работы >приложения.
Есть еще много примеров применения try..finally без всякой на то необходимости. И по этой причине нормальная работа приложения становится ненормальной.
Германн (2009-03-12 01:23:00) [9]
> фыва (11.03.09 21:00) [13]
<offtop>
Всем известен пример применения блока try...finally, связанный с гарантированным освобождением занятой ранее памяти.
Но есть ещё много примеров применения блока try...finally по другим причинам. И эти причины не менее важны для нормальнойработы приложения.
</offtop>
MsGuns (2009-03-12 00:28:00) [10]>Германн © (12.03.09 00:22) [15]
>И что?
А то !
Германн (2009-03-12 00:22:00) [11]
> MsGuns © (11.03.09 21:57) [14]
>
> >Ega23 © (11.03.09 20:45) [12]
> >Пожалуйста.
>
> Ты представляешь, существуют люди, которые из DB-aware контролов
> окромя дбгрида ну ничегошеньки не используют
И что?
MsGuns (2009-03-11 21:57:00) [12]>Ega23 © (11.03.09 20:45) [12]
>Пожалуйста.
Ты представляешь, существуют люди, которые из DB-aware контролов окромя дбгрида ну ничегошеньки не используют
Им тоже твою прививку вкатывать ?
фыва (2009-03-11 21:00:00) [13]
> Ega23 © (11.03.09 20:45) [12]
то есть try finally в [4] исключительно для восстановления отображения db-aware компонент?
Ega23 (2009-03-11 20:45:00) [14]
> не могли бы Вы всё же описать указанную пикантную ситауцию?
> а то поэкпериментировал, а ситуации нет.
Пожалуйста.
Таблица :
create table test (intval1 int, intval2 int);
insert into test (intval1, intval2) values (1, 2);
insert into test (intval1, intval2) values (2, 4);
insert into test (intval1, intval2) values (3, 8);
insert into test (intval1, intval2) values (4, 16);
Форма, коннекшн, Dataset (Select * from test), datasource (смотрит на DataSet), DBGrid (смотрит на DataSource).
Кнопка1 (dataSet.Close; DataSet.Open)
Label1 : TLabel, кнопка 2, Edit1 : TEdit
По клику на второй кнопке прохожу по всему датасету, беру поле, обозначенное в Edit1 и в Label вывожу сумму по данному полю.
procedure TForm2.Button2Click(Sender: TObject);
var
bm : TBookmark;
i : Integer;
begin
i := 0;
with ADODataSet1 do
begin
DisableControls;
bm := GetBookmark;
First;
while not Eof do
begin
i := i + FieldByName(Edit1.Text).AsInteger;
Next;
end;
GotoBookmark(bm);
FreeBookmark(bm);
EnableControls;
end;
Label1.Caption := IntToStr(i);
end;
Теперь введи в Edit1 'intval3', получи справедливый exception, и после этого попробуй в гриде перейти на любую другую запись.
фыва (2009-03-11 19:44:00) [15]
> Если между DisableControls и EnableControls произойдёт исключение,
> то без try..finally ты попадёшь в пикантную ситуацию.
не могли бы Вы всё же описать указанную пикантную ситауцию? а то поэкпериментировал, а ситуации нет.
Ega23 (2009-03-11 10:02:00) [16]
> а смайлик где?
Какой смайлик?
Если между DisableControls и EnableControls произойдёт исключение, то без try..finally ты попадёшь в пикантную ситуацию.
Если сильно интересно - возьми и поэксперементируй.
KSergey (2009-03-10 09:50:00) [17]> фыва (09.03.09 16:32) [8]
> а смайлик где?
Зачем? 8-\
фыва (2009-03-09 16:32:00) [18]
> Германн © (09.03.09 02:01) [7]
> После него без конструкции try...finally обойтись нельзя!
а смайлик где?
Германн (2009-03-09 02:01:00) [19]
> фыва (08.03.09 21:22) [6]
>
>
> > Ega23 © (05.03.09 13:41) [4]
>
> к чему здесь try?
>
В основном потому, что в коде есть ds.DisableControls;
После него без конструкции try...finally обойтись нельзя!
фыва (2009-03-08 21:22:00) [20]
> Ega23 © (05.03.09 13:41) [4]
к чему здесь try?