СТрока FTab.Rows[0].RowError := EFDException.Create('Jaaaaa') меня вгоняет в ступор.
По идее ресурс этот должен освободить FireDac, в debug вижу что он идет сюда и это и делает
function TFDDatSRow.SetRowError(const AValue: EFDException): Boolean;
var
pInfo: PFDDataRowExtraInfo;
begin
Result := False;
pInfo := GetRowInfo(AValue <> nil);
if pInfo <> nil then begin
if pInfo^.FRowException <> nil then begin
Result := True;
FDFreeAndNil(pInfo^.FRowException);
end;
if AValue <> nil then
AValue.Duplicate(pInfo^.FRowException)
else
CheckNoInfo;
end;
end;
Но на выходе - это мое созданное исключение в списке утечек памяти.
Пробовал очищать его напрямую - FreeAndNil(FTab.Rows[0].RowError) - AV в итоге (получается уже освобожден ресурс).
Если пихать указатель в свою переменную и потом освобождать - то вроде норм. НО не кошерно.
А как заставить чтобы это работало прям с FireDac?
Вопрос
audiofeel
unit fCreateRows; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ComCtrls, ExtCtrls, StdCtrls, Buttons, FireDAC.DatS, FireDAC.Stan.Intf, FireDAC.Stan.Error; type TfrmCreateRows = class(TForm) btnCreateTable: TButton; btnPopulate: TButton; btnPrint: TButton; btnAddError: TButton; pnlControlButtons: TPanel; Console: TMemo; pnlMain: TPanel; procedure FormDestroy(Sender: TObject); procedure btnCreateTableClick(Sender: TObject); procedure btnPopulateClick(Sender: TObject); procedure btnPrintClick(Sender: TObject); procedure btnAddErrorClick(Sender: TObject); private { Private declarations } FTab: TFDDatSTable; public { Public declarations } end; var frmCreateRows: TfrmCreateRows; implementation uses uDatSUtils; {$R *.dfm} procedure TfrmCreateRows.btnCreateTableClick(Sender: TObject); begin FTab := TFDDatSTable.Create('Table'); // define table structure FTab.Columns.Add('id', dtInt32); FTab.Columns.Add('string', dtAnsiString).Size := 12; FTab.Columns.Add('double', dtDouble); btnPopulate.Enabled := True; end; procedure TfrmCreateRows.btnPopulateClick(Sender: TObject); var oCol: TFDDatSColumn; oRow1, oRow2: TFDDatSRow; begin // 1. create row oRow1 := FTab.NewRow; // set values oRow1.SetValues([1, 'first row', 14.124145]); // add to table FTab.Rows.Add(oRow1); // 2. create and set values oRow2 := FTab.NewRow([2, 'second row', 14515.1251]); // add to table FTab.Rows.Add(oRow2); // 3. create, set values and add to table FTab.Rows.Add([3, 'third row', 114.22]); // 4. edit row oRow1.BeginEdit; oRow1.SetData(0, 10); oRow1.EndEdit; // 5. once more oCol := FTab.Columns[1]; oRow1.BeginEdit; oRow1.SetData(oCol, 'ten row'); oRow1.EndEdit; btnAddError.Enabled := True; btnPrint.Enabled := True; end; procedure TfrmCreateRows.btnAddErrorClick(Sender: TObject); begin FTab.Rows[0].RowError := EFDException.Create('Jaaaaa'); btnPrint.Enabled := True; end; procedure TfrmCreateRows.btnPrintClick(Sender: TObject); begin PrintRows(FTab, Console.Lines, 'Our rows...'); end; procedure TfrmCreateRows.FormDestroy(Sender: TObject); begin FTab.Free; end; end.Это пример стандартный из Delphi.
СТрока FTab.Rows[0].RowError := EFDException.Create('Jaaaaa') меня вгоняет в ступор.
По идее ресурс этот должен освободить FireDac, в debug вижу что он идет сюда и это и делает
function TFDDatSRow.SetRowError(const AValue: EFDException): Boolean; var pInfo: PFDDataRowExtraInfo; begin Result := False; pInfo := GetRowInfo(AValue <> nil); if pInfo <> nil then begin if pInfo^.FRowException <> nil then begin Result := True; FDFreeAndNil(pInfo^.FRowException); end; if AValue <> nil then AValue.Duplicate(pInfo^.FRowException) else CheckNoInfo; end; end;Но на выходе - это мое созданное исключение в списке утечек памяти.
Пробовал очищать его напрямую - FreeAndNil(FTab.Rows[0].RowError) - AV в итоге (получается уже освобожден ресурс).
Если пихать указатель в свою переменную и потом освобождать - то вроде норм. НО не кошерно.
А как заставить чтобы это работало прям с FireDac?
Спасибо
0 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.