-
Постов
11 -
Зарегистрирован
-
Посещение
Посетители профиля
Блок последних пользователей отключён и не показывается другим пользователям.
Достижения Vitaly X
-
Vitaly X изменил фотографию своего профиля
-
Тривиальная проблема, но не могу понять почему Есть стандартный пример из Delphi 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. По самому примеру как бы вопросов нет, работает как надо. Но если я создаю исключение FTab.Rows[0].RowError := EFDException.Create('Jaaaaa'); , то потом не понятно как его убить. Смотрел в 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 (получаетсяу уже освобожден ресурс). Единственный рабочий вариант, который прищел в голову - создавать исключение, пихать ссылку на него в свою переменную и потом освобождать эту мою переменную - нет ни AV, ни утечки памяти. НО почему так сложно? По какой причине не работает прямо вот так. Спасибо
-
Здравствуйте! На TToolBar имеется две кнопки (TButton), которые всегда присутствуют и они выровнены Align = Left и Align = Right. Между ними динамически может быть 0 - 3 кнопки. Как их все выровнять по горизонтали красиво (одинаково)? Главное чтобы кнопки были не как панели (без промежутков) - цель разнести из чтобы не тыкать пальцем не туда по ошибке. Спасибо.
-
Здравствуйте. FDQuery. Использую функцию RefreshUnknownRecord для ручного добавления строк (в обход Fetch). А в нормальном Fetch - RecsMax, RowSize и так далее - получается данные получаю пакетами. Есть неприятный эффект - если получил скажем 100 первых строк (id 0 - 100), потом через RefreshUnknownRecord добавил 1 (пусть будет id=101) и следующий раз получаю 101 - 200 строки, но 101 то уже в гриде, и появляется второй раз. Есть ли какое-то элегантное решение для этой проблемы? Пришло в голову только держать список ключей строк добавленных через RefreshUnknownRecord. Спасибо.
-
Да, в теории нет вопросов. Но как это реализовать на деле - большой вопрос. Я использую FireDac. Во вложении пример, как я обычно делаю. Чтобы в форме редактирования получилось использовать другой набор данных, получилось сделать как в статье: https://www.uweraabe.de/Blog/2020/10/04/tweaking-dfm-loading/ Только разве что после редактирования надо для этой измененной строки вызвать Refresh, чтобы только одну строку и обновить. Но такой фокус не пройдет с добавленной строкой Помогите, заранее спасибо ЗЫ. Добавить строку сращу нельзя, вдруг пользователь откажется добавлять запись. TweakingDFMLoading.zip
-
Всем привет. Прошу не понимать буквально мой вопрос, потому что проблема несколько шире. В двух словах, надо в мастер / деталь форме откатиться если пользователь передумал сохраняться. Это понятно что тут ничего не надо делать, если настроен CachedUpdates. Нет понимания как это увязать с другой проблемой, которую не могу решить. Есть форма "список товаров" (запрос имеет только минимум полей из таблицы "товар" - номер и название), и есть форма "карточка редактирования товара" (мастер / деталь - деталей много, мастер запрос из таблицы "товар" куда шире - описание, цены и куча всего). Редактирование существующей записи работает так как и надо. Но добавление вызывает взрыв мозга, потому не знаю как сделать: - в форме списке вызвать append / insert (запрос "список" по таблице "товар") - в форме редактирования добавить товар (CachedUpdates) - ролученный id каким то образом обновить в первом запросе, и по нему обновить всю строку Так чтоли? Я знаю что делать, если и одна форма и вторая используют один и тот же запрос, а тут заклинило. В первой форме сразу сохоанить запись до редактирования во второй форме - не красиво, а если последует отмена редактирования, что удалять? Подскажите как реализвать, большое спасибо заранее - чтобы были два разных запроса по таблице "товар" - краткий для списка и полный для карточки редактирования и с возможностью полного отката при отмене добавления.
-
Помогите, никак не могу разобраться. Есть наследник FireDac MemTable. В гриде крякозябры, но на всех этапах данные юникодныеб проверил. Как только выставляю что-то иное чем DEFAULT_CHARSET - например RUSSIAN_CHARSET - работае и отображает корректно. Где именно происходит коверкание? Сам MemTable работатет корректно.
-
Никак не могу понять, чего тут не так (чего не хватает). Если создаю компонент на лету - то первая кнопка некорректно выставляет высоту (вызов метода Memo1ChangeTracking(Memo1);). В этом же методе и создается коспонент. Но если вызываю этот же код - Memo1ChangeTracking(Memo1); - из другого метода (клик по второй кнопке) - нормально. Что за фигня? Не догоняю. Если на форму кинуть компонент TMemo, то тоже работает. unit Unit46; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Memo.Types, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, FMX.StdCtrls; type TForm46 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Memo1ChangeTracking(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form46: TForm46; Memo1: TMemo; implementation {$R *.fmx} procedure TForm46.Button1Click(Sender: TObject); begin Memo1 := TMemo.Create(self); Memo1.Parent := Form46; Memo1.Name := 'Memo1'; Memo1.DataDetectorTypes := []; Memo1.Lines.Clear; Memo1.Lines.Add('AAAAAAAAAAAAAA'); Memo1.ShowScrollBars := False; Memo1.OnChangeTracking := Memo1ChangeTracking; Memo1.Align := TAlignLayout.Horizontal; Memo1.EnabledScroll := False; Memo1.TabOrder := 0; Memo1.WordWrap := True; Memo1ChangeTracking(Memo1); end; procedure TForm46.Memo1ChangeTracking(Sender: TObject); begin Memo1.Height := Memo1.ContentBounds.Height + 5; end; procedure TForm46.Button2Click(Sender: TObject); begin Memo1ChangeTracking(Memo1); end; end.
-
отправляю посылку так procedure a; begin sendIntent(StringToJString(ACTION), StringToJString(PLUGIN), StringToJString(EXTRA_KEY)); <----- почему это выполняется после Sleep(10000) ? ........................................... TMessageManager.DefaultManager.SendMessage(Self, TStatusMessage.Create(status)); end; принимаю так procedure b; begin Sleep(10000); end;
-
TMessageManager.DefaultManager.SendMessage асинхронно
Vitaly X опубликовал вопрос в Намерения (Intent)
Здравствуйте Никак не могу понять, как сделать корректно... Ситуация - подписан на intent со сканера и когда получаю код, то шлю в главную форму через TMessageManager.DefaultManager.SendMessage. НО, до отсылки шлю обратно в другой intent. Проблема в том, что если в коде есть Sleep(10000), то посылка отправится, когда отработает то, что послал через TMessageManager.DefaultManager.SendMessage. Есть какойто вариант сделать так как я хочу? -
Значение переменной уже установлено
Vitaly X опубликовал вопрос в Вопросы по языку Object Pascal и RTL
Не понимаю, как так может быть, но что мне делать? Проблемв в том, что переменная уже инициализирована (не nil). Скажем, есть TMyObject. И есть функция MyFunc: TMyObject. Так вот, в теле этой функции Result не nil (как в десктопной версии), в инициализировано уже (ссылка куда-то). Как результат, Assigned(MyFunc) не канает, она же не nil. Большое спасибо.