Ну зачем копировать из VCL плохое, конечно логичнее делать правильную обработку, хотя она немного трудозатратней. Мне бы и аналога StringList хватило, просто хочется режим создал объект и отдал его на откуп в DataSet. Ну если будут ресурсы, реализуйте пожалуйста.
Ещё вопросик не совсем по RefField. У меня есть 2 MemTabl'а.
В первом RefField поля хранят ссылки на TMemoryRecordEh второго. При отрисовке этих полей я стал искать способ быстрого позиционирования и понял что GotoRec и GotoBookmark работают перебором.
Код:
function TCustomMemTableEh.GotoRec(Rec: TMemoryRecordEh): Boolean;
begin
Result := SetToRec(Rec);
end;
function TCustomMemTableEh.SetToRec(Rec: TObject): Boolean;
var
i: Integer;
begin
CheckActive;
Result := False;
for i := 0 to RecordsView.ViewItemsCount-1 do
if RecordsView.ViewRecord[i] = Rec then
begin
RecNo := i+1;
Result := True;
Exit;
end;
end;
procedure TCustomMemTableEh.InternalGotoBookmarkData(var BookmarkData: TBookmarkDataEh);
var
ARecIdx: Integer;
ARec: TMemoryRecordEh;
begin
ARec := BookmarkData.MemRec;
ARecIdx := RecordsView.IndexOfRec(ARec);
...
end;
function TRecordsViewEh.IndexOfRec(Rec: TMemoryRecordEh): Integer;
var
i: Integer;
begin
Result := -1;
if ViewItemsCount = 0 then
Exit;
if ViewRecord[ViewItemsCount-1] = Rec then
Result := ViewItemsCount-1
else
begin
for i := 0 to ViewItemsCount-1 do
if ViewRecord[i] = Rec then
begin
Result := i;
Exit;
end;
end;
end;
Моментальная навигация только через RecNo. Так вот у меня вопрос если Filter не используется и все записи видимые безопасно ли использовать поле Index в TMemoryRecordEh или могут быть подводные камни? Сейчас использую так
Код:
procedure TfrmElectrRepsMain.DynamicColumnsGetCellParams(Sender: TObject;
EditMode: Boolean; Params: TColCellParamsEh);
var
Rec: TMemoryRecordEh;
BgCellColor: TColor;
begin
if Assigned(TRefObjectField(TColumnEh(Sender).Field).Value) then
begin
Rec := TMemoryRecordEh(TRefObjectField(TColumnEh(Sender).Field).Value);
mtSteps.InstantReadEnter(Rec.Index);
try
Params.Text := mtStepsersp_endtime_plan.AsString;
BgCellColor := GetBackGroundColor(mtStepsersp_endtime_plan.AsDateTime, mtStepsersp_endtime_fact.AsDateTime);
if BgCellColor <> clDefault then
Params.Background := BgCellColor;
finally
mtSteps.InstantReadLeave;
end;
end else
Params.Text := '';
end;