Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΏΠΎ Delphi. ВСрсия 1.4.3 ΠΎΡ‚ 1.1.2001Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 69

Автор Π’Π°Π»Π΅Π½Ρ‚ΠΈΠ½ ΠžΠ·Π΅Ρ€ΠΎΠ²

ΠœΠ΅Ρ‚ΠΎΠ΄ 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;