Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.004 c
2-1264497065
Starraider
2010-01-26 12:11
2010.03.28
StringGrid vs Enter


2-1264361195
Дмитрий
2010-01-24 22:26
2010.03.28
Scrollbar на panel


2-1264674919
novichek
2010-01-28 13:35
2010.03.28
Image на переднем плане


15-1262818935
Дмитрий С
2010-01-07 02:02
2010.03.28
DLL во все процессы.


15-1263224540
GDI+
2010-01-11 18:42
2010.03.28
Ура!!! В Украине ВД изобредли...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский