Форум: "Базы";
Текущий архив: 2010.03.28;
Скачать: [xml.tar.bz2];
ВнизEhLib работа с данными Найти похожие ветки
← →
gnom (2009-03-05 13:26) [0]Добрый день.
Как можно осуществить выделение в DBGridEh несколько строк и сбор информации только по 1 полю в выделенной области?
← →
Ega23 © (2009-03-05 13:30) [1]см. TDBGridEh.Options там что-то типа MultiSelect должно быть
← →
gnom (2009-03-05 13:32) [2]Да я это выставил, мне нужно уже по выделенному пробежаться и собрать инфу только 1 поля и поместить его в массив
← →
gnom (2009-03-05 13:34) [3]вернее одного столбца
← →
Ega23 © (2009-03-05 13:41) [4]
var
bm : TBookmark
i : Integer;
ds : TDataSet;
begin
ds := DBGrid.DataSorce.DataSet;
if (not ds.Active) or (ds.IsEmpty) then Exit;
bm := ds.GetBookmark;
ds.DisableControls;
try
for i:=0 to DBGrid.SelectedRows.Count-1 do
begin
ds.GotoBookmark(pointer(DBGrid.SelectedRows.Items[i]));
ds.FieldByName(Твоё поле).asЧто-там-у-тебя ....
end;
finally
ds.GotoBookmark(bm);
ds.FreeBookmark(bm);
ds.EnableControls;
end;
end;
← →
gnom (2009-03-05 13:45) [5]Спасибо!
← →
фыва (2009-03-08 21:22) [6]
> Ega23 © (05.03.09 13:41) [4]
к чему здесь try?
← →
Германн © (2009-03-09 02:01) [7]
> фыва (08.03.09 21:22) [6]
>
>
> > Ega23 © (05.03.09 13:41) [4]
>
> к чему здесь try?
>
В основном потому, что в коде есть ds.DisableControls;
После него без конструкции try...finally обойтись нельзя!
← →
фыва (2009-03-09 16:32) [8]
> Германн © (09.03.09 02:01) [7]
> После него без конструкции try...finally обойтись нельзя!
а смайлик где?
← →
KSergey © (2009-03-10 09:50) [9]> фыва (09.03.09 16:32) [8]
> а смайлик где?
Зачем? 8-\
← →
Ega23 © (2009-03-11 10:02) [10]
> а смайлик где?
Какой смайлик?
Если между DisableControls и EnableControls произойдёт исключение, то без try..finally ты попадёшь в пикантную ситуацию.
Если сильно интересно - возьми и поэксперементируй.
← →
фыва (2009-03-11 19:44) [11]
> Если между DisableControls и EnableControls произойдёт исключение,
> то без try..finally ты попадёшь в пикантную ситуацию.
не могли бы Вы всё же описать указанную пикантную ситауцию? а то поэкпериментировал, а ситуации нет.
← →
Ega23 © (2009-03-11 20:45) [12]
> не могли бы Вы всё же описать указанную пикантную ситауцию?
> а то поэкпериментировал, а ситуации нет.
Пожалуйста.
Таблица :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 21:00) [13]
> Ega23 © (11.03.09 20:45) [12]
то есть try finally в [4] исключительно для восстановления отображения db-aware компонент?
← →
MsGuns © (2009-03-11 21:57) [14]>Ega23 © (11.03.09 20:45) [12]
>Пожалуйста.
Ты представляешь, существуют люди, которые из DB-aware контролов окромя дбгрида ну ничегошеньки не используют
Им тоже твою прививку вкатывать ?
← →
Германн © (2009-03-12 00:22) [15]
> MsGuns © (11.03.09 21:57) [14]
>
> >Ega23 © (11.03.09 20:45) [12]
> >Пожалуйста.
>
> Ты представляешь, существуют люди, которые из DB-aware контролов
> окромя дбгрида ну ничегошеньки не используют
И что?
← →
MsGuns © (2009-03-12 00:28) [16]>Германн © (12.03.09 00:22) [15]
>И что?
А то !
← →
Германн © (2009-03-12 01:23) [17]
> фыва (11.03.09 21:00) [13]
<offtop>
Всем известен пример применения блока try...finally, связанный с гарантированным освобождением занятой ранее памяти.
Но есть ещё много примеров применения блока try...finally по другим причинам. И эти причины не менее важны для нормальной работы приложения.
</offtop>
← →
MsGuns © (2009-03-12 08:10) [18]>Германн © (12.03.09 01:23) [17]
>Но есть ещё много примеров применения блока try...finally по другим >причинам. И эти причины не менее важны для нормальной работы >приложения.
Есть еще много примеров применения try..finally без всякой на то необходимости. И по этой причине нормальная работа приложения становится ненормальной.
← →
KSergey © (2009-03-12 08:24) [19]> MsGuns © (12.03.09 00:28) [16]
> >И что?
> А то !
А что? Я тоже не понял.
Если уж понадобилось использовать DisableControls/EnableControls - логично обернуть их в try/finally. В чем беда?
← →
Ega23 © (2009-03-12 10:08) [20]
> Есть еще много примеров применения 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-а больше ничего не использует. Это их личные трудности.
← →
Ega23 © (2009-03-12 10:11) [21]
> фыва (11.03.09 21:00) [13]
>
> то есть try finally в [4] исключительно для восстановления
> отображения db-aware компонент?
try..finally в [4] исключительно для корректной работы с состоянием TDataSet, что легко можно увидеть заглянув в DB.pasprocedure 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;
← →
MsGuns © (2009-03-12 14:13) [22]>Ega23 © (12.03.09 10:08) [20]
>Сергей, тебя последнее время сильно несёт.
В зеркало
← →
Ega23 © (2009-03-12 14:33) [23]
> В зеркало
Покажешь, где я неправ - прилюдно извинюсь.
← →
фыва (2009-03-12 20:31) [24]
> Ega23 © (12.03.09 10:11) [21]
> try..finally в [4] исключительно для корректной
> работы с состоянием TDataSet...
а с try except, например, нельзя добиться корректной работы с "состоянием TDataSet"? и почему там в finally не только EnableControls, если "исключительно для"?
← →
Ega23 © (2009-03-12 20:43) [25]
> а с 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).
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2010.03.28;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.004 c