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

Вниз

Почему не отключается DataSet.Controls?   Найти похожие ветки 

 
Aleksandr   (2003-07-28 12:51) [0]

Несколько закладок в программе обеспечивают несколько разных отображений набора данных. При переходе по каждой закладке запоминаю номер записи, делаю DataSet.DisableControls, устанавливаю на него фильтр и сортировку, определенные для этой закладки, а также колонки DBGrid. После чего возвращаюсь на запись и включаю DataSet.Enablecontrols. Так вот какая фигня - это запрещение Controls просто в принципе не срабатывает - отчетливо видно "скакание" курсора по записям - первая, а затем текущая. Хотя показывает, что ControlsDisabled=true. Может, я чего-то перестал понимать? Или какая-то из операций (Filter:=..., IndexDefs.Add..IndexName:=..., Grid.Columns.Clear..Grid.Columns.Add...) делает отключение контролей нерабочим?


 
KDS   (2003-07-28 13:34) [1]

давай конуретный кусок исходника


 
Aleksandr   (2003-07-28 17:54) [2]

Ну, например, метод, который выполняет само переоформление отображения:

procedure TWorkForm.TabSetChange(Sender: TObject);
begin
Screen.Cursor:=crSQLWait;
try
GetPos; // store position in dataset
Client.DisableControls; // disable visual controlling
try
View.CurrentView:=ViewInfo.ViewByName(TabSet.Tabs[TabSet.TabIndex]);
GoToPos // scroll dataset to stored position
finally
Client.EnableControls
end
finally
Screen.Cursor:=crDefault
end
end;


и, соответственно, метод, который вызывается при выполнении
View.CurrentView:=ViewInfo.ViewByName(TabSet.Tabs[TabSet.TabIndex]) :

procedure TViewInfo.SetCurView(const Value: TViewItem);
begin
if FCurView<>Value then begin
FCurView := Value;
FCurView.Requery
end
end;

function TViewItem.Requery : boolean; //потомок от TObjectList
var
i : integer;
C : TDBColumn;
begin
if FilterDifferent then
SetFilter; //set filter
if IndexDifferent then
SetIndex; //set index
if GridDifferent then begin //if columns differents by count or visible or title
TViewInfo(FOwner).Grid.Columns.Clear;
for i:=0 to Count-1 do begin
C:=TViewInfo(FOwner).Grid.Columns.Add;
Items[i].GetColumn(C); //set width, visible and title to column from item
end
end
else if WidthsDifferent then //if only widths differs
for i:=0 to Count-1 do
if Items[i].Visible then
TViewInfo(FOwner).Grid.Columns[i].Width:=Items[i].Width
end;



Таким образом, даже если только ширины колонок переустанавливаются, все равно начинает скакать курсор. Если переделываются индекс или фильтр, ничего не происходит.


 
KDS   (2003-07-28 18:06) [3]

достаточно одной конструкции try... finally
procedure TWorkForm.TabSetChange(Sender: TObject);
begin
Screen.Cursor:=crSQLWait;
try
Client.DisableControls;
GetPos; ( TabSet.Tabs[TabSet.TabIndex])
достаточно одной конструкции try... finally
procedure TWorkForm.TabSetChange(Sender: TObject);
begin
Screen.Cursor:=crSQLWait;
try
Client.DisableControls;
GetPos; View.CurrentView:=ViewInfo.ViewByName(TabSet.Tabs[TabSet.TabIndex]);
finally
GoToPos;
Client.EnableControls;
Screen.Cursor:=crDefault
end
end;

но проблема не в этом участке
загляни в :GetPos;GoToPos;SetFilter;SetIndex;
возможно гдето еще используется DisableControls без EnableControls



 
Aleksandr   (2003-07-28 18:24) [4]

Честное слово, нигде. Смотрите сами:

procedure TWorkForm.GoToPos;
begin
if NOT Client.Active then
Exit;
if FIdsFields="" then
Exit;
if FColNo>-1 then
Grid.SelectedIndex:=FColNo;
if Pos(";",FIdsFields)<>0 then
Client.Locate(FIdsFields,VarArrayOf([FIdsValues[0],FIdsValues[1]]),[])
else
Client.Locate(FIdsFields,FIdsValues[0],[])
end;

procedure TWorkForm.GetPos;
var
s : string;
begin
if NOT Client.Active then
Exit;
if Grid.SelectedIndex>-1 then
FColNo:=Grid.SelectedIndex;
s:=FIdsFields;
if Pos(";",s)<>0 then begin
FIdsValues[1]:=Client.FindField(System.Copy(s,Pos(";",s)+1,length(s)-Pos(";",s))).AsInteger;
System.Delete(s,Pos(";",s),length(s)-Pos(";",s)+1)
end;
FIdsValues[0]:=Client.FindField(s).AsInteger
end;

procedure TViewItem.SetFilter;
var
F : TFilterList; //my object list, parser of WHERE sections
begin
if FTempFilterInfo.Count=0 then
F:=FFilterInfo
else
F:=FTempFilterInfo;
TViewInfo(FOwner).DataSet.Filter:=F.FilterStr;
TViewInfo(FOwner).DataSet.Filtered:=true
end;

procedure TViewItem.SetIndex;
var
C : TClientDataSet;
s,d : string;
d : string;
i : integer;
IndName : string;
Si : TRiSortedFieldsList; //my object list, parser of ORDER BY sections
begin
C:=(FOwner AS TViewInfo).DataSet;
C.IndexFieldNames:="";
C.IndexDefs.Clear;
if (FSortInfo.Count=0) AND (FTempSortInfo.Count=0) then
Exit;
s:="";
d:="";
if FTempSortInfo.Count=0 then
Si:=FSortInfo
else
Si:=FTempSortInfo;
for i:=0 to Si.Count-1 do begin
if s="" then
s:=Si.Items[i].FieldName
else
s:=s+";"+SI.Items[i].FieldName;
if SI.Items[i].SortOrder=fsDesc then begin
if d="" then
d:=SI.Items[i].FieldName
else
d:=d+";"+SI.Items[i].FieldName
end
end;
if d="" then
C.IndexFieldNames:=s
else try
IndName:=s;
if Pos(";",s)<>0 then
IndName:=ReplaceString(";","_",IndName);
if d="" then
IndName:=IndName+"1"
else
IndName:=IndName+"2";
C.IndexDefs.Add(IndName,s,[]);
C.IndexDefs.Items[C.IndexDefs.Count-1].DescFields:=d;
C.IndexName:=IndName
except
on E:Exception do
( 0,h_Error,E.Message)
Честное слово, нигде. Смотрите сами:

procedure TWorkForm.GoToPos;
begin
if NOT Client.Active then
Exit;
if FIdsFields="" then
Exit;
if FColNo>-1 then
Grid.SelectedIndex:=FColNo;
if Pos(";",FIdsFields)<>0 then
Client.Locate(FIdsFields,VarArrayOf([FIdsValues[0],FIdsValues[1]]),[])
else
Client.Locate(FIdsFields,FIdsValues[0],[])
end;

procedure TWorkForm.GetPos;
var
s : string;
begin
if NOT Client.Active then
Exit;
if Grid.SelectedIndex>-1 then
FColNo:=Grid.SelectedIndex;
s:=FIdsFields;
if Pos(";",s)<>0 then begin
FIdsValues[1]:=Client.FindField(System.Copy(s,Pos(";",s)+1,length(s)-Pos(";",s))).AsInteger;
System.Delete(s,Pos(";",s),length(s)-Pos(";",s)+1)
end;
FIdsValues[0]:=Client.FindField(s).AsInteger
end;

procedure TViewItem.SetFilter;
var
F : TFilterList; //my object list, parser of WHERE sections
begin
if FTempFilterInfo.Count=0 then
F:=FFilterInfo
else
F:=FTempFilterInfo;
TViewInfo(FOwner).DataSet.Filter:=F.FilterStr;
TViewInfo(FOwner).DataSet.Filtered:=true
end;

procedure TViewItem.SetIndex;
var
C : TClientDataSet;
s,d : string;
d : string;
i : integer;
IndName : string;
Si : TRiSortedFieldsList; //my object list, parser of ORDER BY sections
begin
C:=(FOwner AS TViewInfo).DataSet;
C.IndexFieldNames:="";
C.IndexDefs.Clear;
if (FSortInfo.Count=0) AND (FTempSortInfo.Count=0) then
Exit;
s:="";
d:="";
if FTempSortInfo.Count=0 then
Si:=FSortInfo
else
Si:=FTempSortInfo;
for i:=0 to Si.Count-1 do begin
if s="" then
s:=Si.Items[i].FieldName
else
s:=s+";"+SI.Items[i].FieldName;
if SI.Items[i].SortOrder=fsDesc then begin
if d="" then
d:=SI.Items[i].FieldName
else
d:=d+";"+SI.Items[i].FieldName
end
end;
if d="" then
C.IndexFieldNames:=s
else try
IndName:=s;
if Pos(";",s)<>0 then
IndName:=ReplaceString(";","_",IndName);
if d="" then
IndName:=IndName+"1"
else
IndName:=IndName+"2";
C.IndexDefs.Add(IndName,s,[]);
C.IndexDefs.Items[C.IndexDefs.Count-1].DescFields:=d;
C.IndexName:=IndName
except
on E:Exception do
RiMessage(0,h_Error,E.Message)
end
end;



 
KDS   (2003-07-28 19:31) [5]

мнда... это ужо надо лезть в исходники TTable,
которые поставляются вместе с Делфи


 
Aleksandr   (2003-07-28 19:36) [6]

Вы хотели сказать, DBGrid?
Мда... вот и у меня сложилось ощущение, что это кривизна самого DBGrid. Кстати, уже вторая, которую я нашел - первую хоть залечил (в методе WriteText "shr 1" надо исправлять на "div 2", иначе при пользовательской прорисовке на большом количестве колонок вылетает integer overflow). Боюсь так далеко лезть...


 
KDS   (2003-07-28 20:44) [7]

вообщето DisableControls; относится не к DBGrid,
TDataSet или к его предшественнику.
Может проще не копаться в ... а обойти этот момент другим способом?


 
Aleksandr   (2003-07-29 03:46) [8]

Другим - это как? Не представляю вариантов, помимо вообще написания своего грида.


 
KSergey   (2003-07-29 10:39) [9]

Прошу прощения, не совсем по теме.

Aleksandr © (29.07.03 03:46)
Другим - это как? Не представляю вариантов, помимо вообще написания своего грида.


Тянет меня сегодня на ругательства, так вот к сожалению часто так и приходится делать. или брать сторонние разработки, часто в них что-то лучше, во всяком случае в них можно смело править их исходный код - это никому не мешает, в отличии от исправления VCL...

достаточно одной конструкции try... finally
procedure TWorkForm.TabSetChange(Sender: TObject);
begin
Screen.Cursor:=crSQLWait;
try
Client.DisableControls;
GetPos; ( TabSet.Tabs[TabSet.TabIndex])
Прошу прощения, не совсем по теме.

Aleksandr © (29.07.03 03:46)
Другим - это как? Не представляю вариантов, помимо вообще написания своего грида.

Тянет меня сегодня на ругательства, так вот к сожалению часто так и приходится делать. или брать сторонние разработки, часто в них что-то лучше, во всяком случае в них можно смело править их исходный код - это никому не мешает, в отличии от исправления VCL...

достаточно одной конструкции try... finally
procedure TWorkForm.TabSetChange(Sender: TObject);
begin
Screen.Cursor:=crSQLWait;
try
Client.DisableControls;
GetPos; View.CurrentView:=ViewInfo.ViewByName(TabSet.Tabs[TabSet.TabIndex]);
finally
GoToPos;
Client.EnableControls;
Screen.Cursor:=crDefault
end
end;

А вот тут я бы выразил сомнения. А если в GoToPos произойдет исключение? Тогда курсор уже никак не восстановится...



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.08.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.008 c
3-68182
Beginner3000
2003-07-25 23:59
2003.08.21
Lookup поле


3-68210
Magic&Wizard
2003-07-28 11:24
2003.08.21
FireBird 1.5 vs InterBase 7.0


14-68482
VEG
2003-08-04 19:33
2003.08.21
Издевательства над винчестером


3-68246
Magic&Wizard
2003-07-25 17:03
2003.08.21
HELP прорисовка окна при выполнении длинных запросов


1-68348
BillyJeans
2003-08-08 13:32
2003.08.21
Как отловить запуск консольного приложения?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский