мб я чтото не так делаю но при таком запросе все равно абстракт эррор.
заработала вот такая версия. тока тут пару лишних процедур.
Код:
unit MainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, Grids, DBGrids, DBTables, StdCtrls, ExtCtrls, DBCtrls,
DBXpress, FMTBcd, SqlExpr, DBClient, Provider, ADODB, Mask;
const
WM_CLICKBN=WM_USER+1;
type
TButtonArray=packed array of TButton;
TCheckBoxArray=packed array of TCheckBox;
TEditArray=packed array of TEdit;
TfmMain = class(TForm)
DataSource1: TDataSource;
ADOConnection1: TADOConnection;
ADODataSet1: TADODataSet;
ADOCommand1: TADOCommand;
ADODataSet1NAME: TStringField;
GroupBox1: TGroupBox;
ScrollBox1: TScrollBox;
Button1: TButton;
DBGrid1: TDBGrid;
Button2: TButton;
Button3: TButton;
RadioGroup1: TRadioGroup;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
DBCheckBox1: TDBCheckBox;
Label1: TLabel;
Label2: TLabel;
ButtonAdd: TButton;
GroupBox2: TGroupBox;
GroupBox3: TGroupBox;
DBEdit3: TDBEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
{ Private declarations }
public
procedure ButtonClick(Sender: TObject);
procedure WMCLICKBN(var M: TMessage); message WM_CLICKBN;
end;
var
fmMain: TfmMain;
BA: TButtonArray;
CB: TCheckBoxArray;
ED: TEditArray;
implementation
{$R *.dfm}
procedure TfmMain.ButtonClick(Sender: TObject);
var i,k,l,z,q,w,e,r:integer;
begin
for i := 0 to High(CB) do
if CB[i].Tag = (Sender as TButton).Tag then
begin
z:=i;
CB[i].Destroy;
end;
for k := z to high(CB) do
CB[k]:=CB[k+1] ;
if z < high(CB) then
begin
for l := z to high(CB)-1 do
begin
CB[l].Top:=CB[l].Top-32;
end;
end;
for q := 0 to High(ED) do
if ED[q].Tag = (Sender as TButton).Tag then
begin
r:=q;
ED[q].Destroy;
end;
for w := r to high(ED) do
ED[w]:=ED[w+1] ;
if r < high(ED) then
begin
for e := r to high(ED)-1 do
begin
ED[e].Top:=ED[e].Top-32;
end;
end;
SetLength(ED,Length(ED)-1);
SetLength(CB,Length(CB)-1);
PostMessage(fmMain.Handle,WM_CLICKBN,Integer(Sender),0);
end;
procedure TfmMain.FormCreate(Sender: TObject);
begin
ADOConnection1.Open;
ADODataSet1.Open;
dbEdit1.Text:='';
dbEdit2.Text:='';
end;
procedure TfmMain.Button1Click(Sender: TObject);
var
i: Integer;
begin
SetLength(BA,Length(BA)+1);
BA[High(BA)] := TButton.Create(nil);
BA[High(BA)].OnClick := ButtonClick;
BA[High(BA)].Width := 25;
BA[High(BA)].Height :=20;
BA[High(BA)].Left := 270;
BA[High(BA)].Top := 20+(High(BA)*32);
BA[High(BA)].Caption := 'del';
BA[High(BA)].Parent := ScrollBox1;
BA[High(BA)].Visible := True;
BA[High(BA)].Tag :=High(BA);
SetLength(CB,Length(CB)+1);
CB[High(CB)] := TCheckBox.Create(nil);
CB[High(CB)].Left := 20;
CB[High(CB)].Top := 20+(High(CB)*32);
CB[High(CB)].Parent := ScrollBox1;
CB[High(CB)].Visible := True;
CB[High(CB)].Tag :=High(BA);
SetLength(ED,Length(ED)+1);
ED[High(ED)] := TEdit.Create(nil);
ED[High(ED)].Width := 200;
ED[High(ED)].Height :=25;
ED[High(ED)].Left := 50;
ED[High(ED)].Top := 20+(High(ED)*32);
ED[High(ED)].Text:='';
ED[High(ED)].Parent := ScrollBox1;
ED[High(ED)].Visible := True;
ED[High(ED)].Tag :=High(BA);
end;
procedure TfmMain.WMCLICKBN(var M: TMessage);
var
bn: TButton; cc:TCheckBox;
i,l,z: Integer;
begin
bn := TButton(M.WParam);
if not (bn is TButton) then Exit;
for i := 0 to High(BA)-1 do
begin
if BA[i]=bn then
begin
z:=i;
Move(BA[i+1],BA[i],SizeOf(TButton)*(High(BA)-i));
Break;
end;
end;
if z<High(BA) then
begin
for l := z to high(BA)-1 do
begin
BA[l].Top:=BA[l].Top-32;
end;
end;
SetLength(BA,High(BA));
FreeAndNil(bn);
end;