ΠΠ΅ΡΠΎΠ΄ DisableControls ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΡΠ»ΡΡΠ°Π΅,ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ DBGridΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ . ΠΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡΠ½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ TBookmark.
ΠΠ΅ΡΠΎΠ΄ IndexOf Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΊΠ»Π°Π΄ΠΊΠΈ.Π Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ IndexOf, Π° Π½Π΅Refresh, Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ ΠΈΡΡ ΠΎΠ΄Ρ ΠΈΠ·ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.*}
procedure TForm1.SelectClick(Sender: TObject);
var
x: word;
TempBookmark: TBookMark;
begin
DBGrid1.Datasource.Dataset.DisableControls;
with DBgrid1.SelectedRows do if Count > 0 then begin
TempBookmark:= DBGrid1.Datasource.Dataset.GetBookmark;
for x:= 0 to Count - 1 do begin
if IndexOf(Items[x]) > -1 then begin
DBGrid1.Datasource.Dataset.Bookmark:= Items[x];
showmessage(DBGrid1.Datasource.Dataset.Fields[1].AsString);
end;
end;
end;
DBGrid1.Datasource.Dataset.GotoBookmark(TempBookmark);
DBGrid1.Datasource.Dataset.FreeBookmark(TempBookmark);
DBGrid1.Datasource.Dataset.EnableControls;
end;
{*ΠΠ°Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π²Π°ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π°ΠΊΠ»Π°Π΄ΠΊΡ ΠΈΠ·Π°ΡΠ΅ΠΌ Π½Π°ΠΉΡΠΈ Π΅Π΅ Π² ΡΠΏΠΈΡΠΊΠ΅ Π²ΡΠ±ΡΠ°Π½Π½ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° DBGrid.*}
//Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π·Π°ΠΊΠ΄Π°Π΄ΠΊΡ
procedure TForm1.GetBookMarkClick(Sender: TObject);
begin
Bookmark1:= DBGrid1.Datasource.Dataset.GetBookmark;
end;
//ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΠΌ Π·Π°ΠΊΠ»Π°Π΄ΠΊΡ
procedure TForm1.FreeBookmarkClick(Sender: TObject);
begin
if assigned(Bookmark1) then begin
DBGrid1.Datasource.Dataset.FreeBookmark(Bookmark1);
Bookmark1:= nil;
end;
end;
//ΠΡΠΏΠΎΠ»ΡΡΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄ Find Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ
//Π·Π°ΠΏΠΈΡΠΈ-Π·Π°ΠΊΠ»Π°Π΄ΠΊΠΈ Π² ΡΠΏΠΈΡΠΊΠ΅ Π²ΡΠ±ΡΠ°Π½Π½ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° DBGrid
procedure TForm1.FindClick(Sender: TObject);
begin
if assigned(Bookmark1) then begin
if DBGrid1.SelectedRows.Find(TBookMarkStr(Bookmark1),z) then showmessage(inttostr(z));
end;
end;
end.
ΠΠ΅ΡΡΠΈΠΊΠ°Π»ΡΠ½Π°Ρ ΠΏΠΎΠ»ΠΎΡΠ° ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ Dbgrid
Delphi 1
ΠΡΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΊΠΎΠ΄Ρ VCL, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠ°Π±Π»ΠΈΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ Π΄Π²ΠΈΠΆΠΊΠ° Π²Π΅ΡΡΠΈΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΠΎΠ»ΠΎΡΡ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ.
(ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΠΌΠΈ Paradox ΠΈ BDE. ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ°Π±Π»ΠΈΡΠ°ΠΌΠΈ/Π΄Π²ΠΈΠΆΠΊΠ°ΠΌΠΈ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ DBIGetSeqNo Π½Π° ΡΡΠ½ΠΊΡΠΈΡ, Π½Π°Π΄Π΅ΠΆΠ½ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ ΡΠ΅ΠΊΡΡΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ Π·Π°ΠΏΠΈΡΠΈ Π²Π½Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π»ΠΈ ΡΠ°Π±Π»ΠΈΡΠ° ΠΈΠ½Π΄Π΅ΠΊΡ ΠΈΠ»ΠΈ Π½Π΅Ρ.)
Π DBGRID.PAS ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ Π΄Π²Π΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ:
procedure TCustomDBGrid.UpdateScrollBar;
var
Pos: Integer;
mPos, mMax: longint;
begin
if FDatalink.Active and HandleAllocated then
with FDatalink.DataSet do begin
UpdateCursorPos;
if (DBIGetSeqNo(Handle,mPos) = DBIERR_NONE) then begin
mMax := RecordCount;
while mMax > 1000 do begin
mMax := mMax div 10;
mPos := mPos div 10;
end;
SetScrollRange(Self.Handle, SB_VERT, 1, mMax, False);
end else begin
if BOF then mPos := 0
else if EOF then mPos := 4
else mPos := 2;
SetScrollRange(Self.Handle, SB_VERT, 0, 4, False);
end; (**)
if GetScrollPos(Self.Handle, SB_VERT) <> mPos then
SetScrollPos(Self.Handle, SB_VERT, mPos, True);
end;
end;
procedure TCustomDBGrid.WMVScroll(var Message: TWMVScroll);
var
mMin, mMax: integer;
RecCount, RecNo, NewRecNo: longint;
begin
if not AcquireFocus then Exit;
if FDatalink.Active then
with Message, FDataLink.DataSet, FDatalink do
case ScrollCode of
SB_LINEUP: MoveBy(-ActiveRecord - 1);
SB_LINEDOWN: MoveBy(RecordCount - ActiveRecord);
SB_PAGEUP: MoveBy(-VisibleRowCount);
SB_PAGEDOWN: MoveBy(VisibleRowCount);
SB_THUMBPOSITION:
if (DBIGetSeqNo(Handle,RecNo) = DBIERR_NONE) then begin
GetScrollRange(self.Handle, SB_VERT, mMin, mMax);
NewRecNo := Pos*(FDataLink.DataSet.RecordCount div mMax);
MoveBy(NewRecNo-RecNo);
end else case Pos of
0: First;
1: MoveBy(-VisibleRowCount);
2: Exit;
3: MoveBy(VisibleRowCount);
4: Last;
end;
SB_BOTTOM: Last;
SB_TOP: First;
end;
end;
ΠΠΌΠ΅ΠΉΡΠ΅ Π² Π²ΠΈΠ΄Ρ, ΡΡΠΎ ΠΈΠ·-Π·Π° Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ Π² VCL (MoveBy ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ integer-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π²ΠΌΠ΅ΡΡΠΎ longint), ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΡΠ°Π±Π»ΠΈΡΠ°ΠΌΠΈ (RecordCount>MaxInt). ΠΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ ΡΡΠΎΠΌΡ ΡΠ°ΠΊΡΡ Ρ Π½Π°ΡΠ΅Π» Π² ΠΆΡΡΠ½Π°Π»Π΅ Delphi Magazine. ΠΠ»Ρ Π±ΠΎΠ»ΡΡΠΈΡ ΡΠ°Π±Π»ΠΈΡ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π²ΡΠ·ΠΎΠ²Ρ MoveBy Π½Π° DBISetToSeqNo ΠΈΠ»ΠΈ DBIGetRelativeRecord. ΠΠ΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ ΠΏΠΎΡΠ»Π΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° Π²ΡΠ·Π²Π°ΡΡ Resnyc([]) ΠΈΠ»ΠΈ Refresh!
P.S. ΠΠΎΠΊΠ° Π²Ρ ΠΊΠΎΠ²ΡΡΡΠ΅ΡΠ΅ΡΡ Π² DBGRIDS.PAS: Π½Π°ΠΉΠ΄ΠΈΡΠ΅ ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ TitleColor Π½Π° FixedColor Π² TCustomDBGrid.Create ΠΈ Π² TCustomDBGrid.DrawCell. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° FixedColor Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΏΠΎΠΊΠ°Π· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ, ΠΈ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊΠ°ΠΊ ΠΈ ΠΎΠΆΠΈΠ΄Π°Π»ΠΎΡΡ.
β Reinhard Kalinke
TDBGrid Lookup-ΠΏΠΎΠ»Π΅ Π² D2
Delphi 2
1. ΠΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡ lookup-ΠΏΠΎΠ»Π΅ Π² TDBGrid Π΄Π»Ρ Delphi 2.0
2. Π Π°Π·ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΡΠΎΡΠΌΠ΅ 2 ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° TTable, 1 ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ TDataSource ΠΈ 1 β TDBGrid.
β’ ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΠ΅ Table1 β ΠΊ DataSource1 β ΠΊ DBGrid1
β’ DataSource1.DataSet = Table1
β’ DBGrid1.DataSource = DataSource1
3. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Table1
β’ Table1.Database = DBDemos
β’ Table1.TableName = Customer
β’ Table1.Active = True
4. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Table2
β’ Table2.Database = DBDemos
β’ Table2.TableName = Orders
β’ Table2.Active = True
5. ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π²ΡΠ΅ ΠΏΠΎΠ»Ρ Π΄Π»Ρ Table1, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Fields Editor (ΡΠ΅Π΄Π°ΠΊΡΠΎΡ ΠΏΠΎΠ»Π΅ΠΉ):
β’ ΠΠ²Π°ΠΆΠ΄Ρ ΡΠ΅Π»ΠΊΠ½ΠΈΡΠ΅ Π½Π° Table1
β’ ΠΠ°ΠΆΠΌΠΈΡΠ΅ ΠΏΡΠ°Π²ΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ ΠΌΡΡΠΈ Π² ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ΅ ΠΏΠΎΠ»Π΅ΠΉ
β’ ΠΡΠ±Π΅ΡΠΈΡΠ΅ ΠΏΡΠ½ΠΊΡ Add New Fields. ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΠΈΡ Π²ΡΠ΅.
6. ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π΄Π»Ρ Table1.
β’ ΠΠ°ΠΆΠΌΠΈΡΠ΅ ΠΏΡΠ°Π²ΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ ΠΌΡΡΠΈ Π² ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ΅ ΠΏΠΎΠ»Π΅ΠΉ ΠΈ Π²ΡΠ±Π΅ΡΠΈΡΠ΅ ΠΏΡΠ½ΠΊΡ Β«New FieldΒ».
7. ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ Π²Π½ΠΎΠ²Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ:
β’ Name: Bob
β’ Type: String
β’ Size: 30
β’ Select Lookup
β’ Key Fields: CustNo β ΠΠΎΠ»Π΅ Π² Table1 Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
β’ DataSet: Table2 β ΠΠ΄Π΅ΡΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ°Π±Π»ΠΈΡΠ½ΡΠΉ lookup
β’ LookUpKeys: CustNo β ΠΠ°Π½Π½ΡΠΉ ΠΊΠ»ΡΡ ΠΊΠΎΠΏΠΈΡΡΠ΅ΡΡΡ Π² KeyField
β’ Result Field: OrderNo β ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΏΠΎΠΊΠ°Π·Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² Π²ΡΠΏΠ°Π΄Π°ΡΡΠ΅ΠΌ ΡΠΏΠΈΡΠΊΠ΅
8. ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
ΠΠ°ΠΊ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΎΠ»Π±ΡΠΎΠ² Π² TDBGrid Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΈ ΠΏΠΎ ΡΡΠΈΠΌ ΡΡΠΎΠ»Π±ΡΠ°ΠΌ?
Nomadic ΡΠΎΠ²Π΅ΡΡΠ΅Ρ:
ΠΡΠΎ ΠΌΠ°Π»Π΅Π½ΡΠΊΠ°Ρ Π²ΡΡΠ°Π²ΠΊΠ° Π² ΠΠ°Ρ Π½Π°ΡΠ»Π΅Π΄Π½ΠΈΠΊ ΠΎΡ TCustomDBGrid, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ΅ΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΡ Π·Π°Π΄Π°ΡΡ.
// DBGRIDEX.PAS
// ----------------------------------------------------------------------------
destructor TDbGridEx.Destroy;
begin
_HideColumnsValues.Free;_HideColumns.Free;
inherited Destroy;
end;
// ----------------------------------------------------------------------------
constructor TDbGridEx.Create(Component : TComponent);
begin
inherited Create(Component);
FFreezeCols := ?;
_HideColumnsValues := TList.Create;
_HideColumns := TList.Create;
end;
// ----------------------------------------------------------------------------
procedure TDbGridEx.KeyDown(var Key: Word; Shift: TShiftState);
begin
if (Key = VK_LEFT) then ColBeforeEnter(-1);
if (Key = VK_RIGHT) then ColBeforeEnter(1);
inherited;
end;
// ----------------------------------------------------------------------------
procedure TDbGridEx.SetFreezeColor(AColor : TColor);
begin
InvalidateRow(0);
end;
// ----------------------------------------------------------------------------
procedure TDbGridEx.SetFreezeCols(AFreezeCols : Integer);
begin
FFreezeCols := AFreezeCols;
InvalidateRow(0);
end;
// ----------------------------------------------------------------------------
procedure TDbGridEx.ColEnter;
begin
ColBeforeEnter(0);
if Assigned(OnColEnter) then OnColEnter(Self);
end;
// ----------------------------------------------------------------------------
procedure TDbGridEx.ColBeforeEnter(ADelta : Integer);
var nIndex : Integer;
function ReadWidth : Integer;
var i : Integer;