Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.03.28;
Скачать: CL | DM;

Вниз

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.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;


 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.012 c
3-1220515408
DVM
2008-09-04 12:03
2010.03.28
ID последней добавленной записи


15-1262467825
Юрий
2010-01-03 00:30
2010.03.28
С днем рождения ! 3 января 2010 воскресенье


15-1263072625
Юрий
2010-01-10 00:30
2010.03.28
С днем рождения ! 10 января 2010 воскресенье


15-1263034579
palva
2010-01-09 13:56
2010.03.28
Опять про Аватар


15-1263074944
Илья_
2010-01-10 01:09
2010.03.28
Игра FIFA 2010 по сети