Delphi DBGrid
9 отговора
493 прегледа
Delphi DBGrid
Работя с TTable (Paradox) и DBGrid.
Когато съм на последния ред и натисна "стрелка надолу" ми се отваря нов ред за добавяне на запис след последния, а аз не искам това.
Не мога да дам ReadOnly=true в Options, защото редактитам данните директно в DBGrid.
Опитах се да използувам OnKeyUp и OnKeyDown, но не се получава добре.
Ще се радвам да получа съвет как да се справя с този проблем.
Когато съм на последния ред и натисна "стрелка надолу" ми се отваря нов ред за добавяне на запис след последния, а аз не искам това.
Не мога да дам ReadOnly=true в Options, защото редактитам данните директно в DBGrid.
Опитах се да използувам OnKeyUp и OnKeyDown, но не се получава добре.
Ще се радвам да получа съвет как да се справя с този проблем.
Re: Delphi DBGrid
Някои гридове (например DBGridEh) си имат пропърти дали да може да се прави това. Ако си с някакъв такъв грид - виж дали има. Ако използваш делфийския TDBGrid най-добре ще е да си напишеш обработчик на BeforeInsert събитието на таблицата ти. Вътре викни Abort. Това ще ти попречи и програмно да добавяш записи, така че ако това ти е необходимо добави и някакъв флаг, който да разрешава/забранява добавянето и си го управлявай при програмно добавяне на записи.
Честита Баба Марта на всички!
Честита Баба Марта на всички!
Re: Delphi DBGrid
Ами tTbale (tDataSet) има маса събития, като например BeforInsert. Ако някъде там кажеш Cancel може би ще стане.
Пфу, реших да го пробвам - оказа се най-подходящо в OnNewRecord:
procedure TForm1.Table1NewRecord(DataSet: TDataSet);
begin
Table1.cancel;
//Table1.Prior;
//Table1.Prior;
//Table1.Last;
end;
Пфу, реших да го пробвам - оказа се най-подходящо в OnNewRecord:
procedure TForm1.Table1NewRecord(DataSet: TDataSet);
begin
Table1.cancel;
//Table1.Prior;
//Table1.Prior;
//Table1.Last;
end;
Re: Delphi DBGrid
Така правиш нов record и веднага го отказваш.
По добре е BeforeInsert да се направи Abort; - така операцията нов запис се отказва преди да е извършена.
По добре е BeforeInsert да се направи Abort; - така операцията нов запис се отказва преди да е извършена.
Re: Delphi DBGrid
Стори ми се, че ако е в бефоринсерт се допуска преминаване на долния ред, въпреки, че не позволява да се въвежда (клавиатурата пука:)
Може и да бъркам.
Може и да бъркам.
Re: Delphi DBGrid
{......stop the DBGrid control from auto-appending a new entry?
(Q: How to stop the dbgrid control from auto-appending a new entry when you move down after the last record in a table.
It creates a new blank line / record in the table. Can this be stopped?}
{A: Add to your TTables's "BeforeInsert" event the following line:}
{A: It traps the down key and checks for end-of-file.}
AJ™
(Q: How to stop the dbgrid control from auto-appending a new entry when you move down after the last record in a table.
It creates a new blank line / record in the table. Can this be stopped?}
{A: Add to your TTables's "BeforeInsert" event the following line:}
procedure TForm1.Tbable1BeforeInsert(DataSet: TDataSet);
begin
Abort; {<<---this line}
end;
{A: It traps the down key and checks for end-of-file.}
procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_DOWN) then
begin
TTable1.DisableControls;
TTable1Next;
if TTable1.EOF then
Key := 0
else
TTable1.Prior;
TTable1.EnableControls;
end;
end;
AJ™
Re: Delphi DBGrid
Благодаря!
Използувах идеята по малко по-различен начин:
procedure TFORM1.DataSource1StateChange(Sender: TObject);
begin
if (Table1.State=dsInsert) then Table1.Cancel; {DataSource1.DataSet=Table1}
end;
а където добавям запис:
Table1.DisableControls; Table1.Append; Table1.EnableControls;
Работи перфектно.
Използувах идеята по малко по-различен начин:
procedure TFORM1.DataSource1StateChange(Sender: TObject);
begin
if (Table1.State=dsInsert) then Table1.Cancel; {DataSource1.DataSet=Table1}
end;
а където добавям запис:
Table1.DisableControls; Table1.Append; Table1.EnableControls;
Работи перфектно.
Re: Delphi DBGrid
Малко тежичка артилерия. Ако се използува невнимателно премахва не само това, което искам, но и което не искам. Но със сътоветните флагове и с прецизиране на Events става.