实现当点击修改按钮时,弹出一个FORM并读出选中的DATAGRID中的行信息,但不知为何,第一次点击修改时不会显示该行的记录,并发现FORMCREATE事件没有触发,为何会这样呢?
if frmMedicineBaseInfo_Edit = nil then
frmMedicineBaseInfo_Edit := TfrmMedicineBaseInfo_Edit.Create(self);
frmMedicineBaseInfo_Edit.ShowModal;
frmMedicineBaseInfo_Edit.Free;
frmMedicineBaseInfo_Edit := nil;我想可能是因为frmMedicineBaseInfo_Edit <> nil而引起的,是吗?如何处理呢?
if frmMedicineBaseInfo_Edit = nil then
frmMedicineBaseInfo_Edit := TfrmMedicineBaseInfo_Edit.Create(self);
frmMedicineBaseInfo_Edit.ShowModal;
frmMedicineBaseInfo_Edit.Free;
frmMedicineBaseInfo_Edit := nil;我想可能是因为frmMedicineBaseInfo_Edit <> nil而引起的,是吗?如何处理呢?
你可以将读取当前行的数据写成一个函数,分别在按钮和ONCELLCLICK里调用好了。
//点击修改按钮显示修改窗体
procedure TfrmMedicineBaseInfo.btnEditClick(Sender: TObject);
begin
M_NO := adoqMedicineBaseInfo.FieldByName('M_NO').AsString;
if frmMedicineBaseInfo_Edit = nil then
frmMedicineBaseInfo_Edit := TfrmMedicineBaseInfo_Edit.Create(self);
frmMedicineBaseInfo_Edit.ShowModal;
frmMedicineBaseInfo_Edit.Free;
frmMedicineBaseInfo_Edit := nil;
end;//点击修改后,显示的窗体
procedure TfrmMedicineBaseInfo_Edit.FormCreate(Sender: TObject);
var
sqlStr : String;
begin
//读取剂型列表
sqlStr := 'select TypeID, TypeName from MedicineType order by TypeID';
QrOpenSql(adoqTmp, sqlStr);
M_TypeList := TStringList.Create();
while not adoqTmp.Eof do
begin
cmbM_Type.Items.Add(adoqTmp.FieldByName('TypeName').AsString);
M_TypeList.Add(adoqTmp.FieldByName('TypeID').AsString);
adoqTmp.Next;
end;
//读取单位列表
sqlStr := 'select UnitID, UnitName from MedicineUnit order by UnitID';
QrOpenSql(adoqTmp, sqlStr);
M_UnitList := TStringList.Create();
while not adoqTmp.Eof do
begin
cmbM_Unit.Items.Add(adoqTmp.FieldByName('UnitName').AsString);
M_UnitList.Add(adoqTmp.FieldByName('UnitID').AsString);
adoqTmp.Next;
end; //读取药品信息
sqlStr := 'select M_NO, M_Name, M_PY, M_Style, M_Type, M_Produce, M_Unit, '
+ 'InStockPrice, SalePrice from Medicine '
+ 'where M_NO = '''+FrmMedicineBaseInfo.M_NO+'''';
QrOpenSql(adoqTmp, sqlStr);
edtM_NO.Text := adoqTmp.FieldByName('M_NO').AsString;
edtM_Name.Text := adoqTmp.FieldByName('M_Name').AsString;
edtM_PY.Text := adoqTmp.FieldByName('M_PY').AsString;
edtM_Style.Text := adoqTmp.FieldByName('M_Style').AsString;
cmbM_Type.ItemIndex := cmbM_Type.Items.IndexOf(adoqTmp.FieldByName('M_Type').AsString);
edtM_Produce.Text := adoqTmp.FieldByName('M_Produce').AsString;
cmbM_Unit.ItemIndex := cmbM_Unit.Items.IndexOf(adoqTmp.FieldByName('M_Unit').AsString);
edtInStockPrice.Text := adoqTmp.FieldByName('InStockPrice').AsString;
edtSalePrice.Text := adoqTmp.FieldByName('SalePrice').AsString;
end;