Форум: "Базы";
Текущий архив: 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