📄 rmd_editorldlinks.pas
字号:
lFound := True;
FFullIndexName := '';
DataSetProxy.IndexFieldNames := DataSetProxy.IndexDefs.Items[i].Fields;
end;
end;
end;
end;
if not lFound then
DataSetProxy.IndexName := FullIndexName;
end
else
DataSetProxy.IndexFieldNames := IndexFieldList;
DataSetProxy.MasterFields := MasterFieldList;
Result := True;
end
else
Result := False;
end;
procedure TRMDFieldsLinkForm.SetDataSet(Value: TRMDDataset);
var
lIndexDefs: TIndexDefs;
begin
Value.DataSet.FieldDefs.Update;
lIndexDefs := DataSetProxy.IndexDefs;
if Assigned(lIndexDefs) then
lIndexDefs.Update;
if not Assigned(Value.DataSet.DataSource) or not Assigned(Value.DataSet.DataSource.DataSet) then
DatabaseError('SMissingDataSource', Value.DataSet);
Value.DataSet.DataSource.DataSet.FieldDefs.Update;
FDetailDataSet := Value;
FMasterDataSet := Value.DataSet.DataSource.DataSet;
end;
procedure TRMDFieldsLinkForm.Localize;
begin
Font.Name := RMLoadStr(SRMDefaultFontName);
Font.Size := StrToInt(RMLoadStr(SRMDefaultFontSize));
Font.Charset := StrToInt(RMLoadStr(SCharset));
RMSetStrProp(Label30, 'Caption', rmRes + 3130);
RMSetStrProp(Label31, 'Caption', rmRes + 3131);
RMSetStrProp(Label2, 'Caption', rmRes + 3132);
RMSetStrProp(btnAdd, 'Caption', rmRes + 3133);
RMSetStrProp(btnClear, 'Caption', rmRes + 3134);
btnOK.Caption := RMLoadStr(SOk);
btnCancel.Caption := RMLoadStr(SCancel);
end;
procedure TRMDFieldsLinkForm.Initialize;
var
SIndexName: string;
procedure SetUpLists(const MasterFieldList, DetailFieldList: string);
var
I, J: Integer;
MasterFieldName, DetailFieldName: string;
begin
I := 1;
J := 1;
while (I <= Length(MasterFieldList)) and (J <= Length(DetailFieldList)) do
begin
MasterFieldName := StripFieldName(MasterFieldList, I);
DetailFieldName := StripFieldName(DetailFieldList, J);
if (MasterList.Items.IndexOf(MasterFieldName) <> -1) and
(OrderedDetailList.IndexOf(DetailFieldName) <> -1) then
begin
with OrderedDetailList do
Objects[IndexOf(DetailFieldName)] := TObject(True);
with DetailList.Items do Delete(IndexOf(DetailFieldName));
with MasterList.Items do Delete(IndexOf(MasterFieldName));
BindList.Items.Add(Format('%s -> %s',
[DetailFieldName, MasterFieldName]));
btnClear.Enabled := True;
end;
end;
end;
begin
if not DataSetProxy.IndexBased then
begin
IndexLabel.Visible := False;
IndexList.Visible := False;
end
else
begin
with DataSetProxy do
begin
GetIndexNames(IndexList.Items);
if IndexFieldNames <> '' then
SIndexName := IndexDefs.FindIndexForFields(IndexFieldNames).Name
else SIndexName := IndexName;
if (SIndexName <> '') and (IndexList.Items.IndexOf(SIndexName) >= 0) then
IndexList.ItemIndex := IndexList.Items.IndexOf(SIndexName) else
IndexList.ItemIndex := 0;
end;
end;
with DataSetProxy do
begin
MasterFieldList := MasterFields;
if (IndexFieldNames = '') and (IndexName <> '') and
(IndexDefs.IndexOf(IndexName) >= 0) then
IndexFieldList := IndexDefs[IndexDefs.IndexOf(IndexName)].Fields
else
IndexFieldList := IndexFieldNames;
end;
IndexListChange(nil);
FMasterDataSet.GetFieldNames(MasterList.Items);
OrderedMasterList.Assign(MasterList.Items);
SetUpLists(MasterFieldList, IndexFieldList);
end;
procedure TRMDFieldsLinkForm.IndexListChange(Sender: TObject);
var
I: Integer;
IndexExp: string;
begin
DetailList.Items.Clear;
if DataSetProxy.IndexBased then
begin
DataSetProxy.IndexName := IndexList.Text;
I := DataSetProxy.IndexDefs.IndexOf(DataSetProxy.IndexName);
if I <> -1 then
IndexExp := DataSetProxy.IndexDefs.Items[I].Expression;
if IndexExp <> '' then
DetailList.Items.Add(IndexExp)
else
DataSetProxy.GetFieldNamesForIndex(DetailList.Items);
end
else
begin
DetailDS.DataSet.GetFieldNames(DetailList.Items);
end;
MasterList.Items.Assign(OrderedMasterList);
OrderedDetailList.Assign(DetailList.Items);
for I := 0 to OrderedDetailList.Count - 1 do
OrderedDetailList.Objects[I] := TObject(False);
BindList.Clear;
btnAdd.Enabled := False;
btnClear.Enabled := False;
btnDelete.Enabled := False;
MasterList.ItemIndex := -1;
end;
procedure TRMDFieldsLinkForm.OrderFieldList(OrderedList, List: TStrings);
var
I, J: Integer;
MinIndex, Index, FieldIndex: Integer;
begin
for J := 0 to List.Count - 1 do
begin
MinIndex := $7FFF;
FieldIndex := -1;
for I := J to List.Count - 1 do
begin
Index := OrderedList.IndexOf(List[I]);
if Index < MinIndex then
begin
MinIndex := Index;
FieldIndex := I;
end;
end;
List.Move(FieldIndex, J);
end;
end;
procedure TRMDFieldsLinkForm.AddToBindList(const Str1, Str2: string);
var
I: Integer;
NewField: string;
NewIndex: Integer;
begin
NewIndex := OrderedDetailList.IndexOf(Str1);
NewField := Format('%s -> %s', [Str1, Str2]);
with BindList.Items do
begin
for I := 0 to Count - 1 do
begin
if OrderedDetailList.IndexOf(StripDetail(Strings[I])) > NewIndex then
begin
Insert(I, NewField);
Exit;
end;
end;
Add(NewField);
end;
end;
procedure TRMDFieldsLinkForm.BindingListClick(Sender: TObject);
begin
btnAdd.Enabled := (DetailList.ItemIndex <> LB_ERR) and
(MasterList.ItemIndex <> LB_ERR);
end;
procedure TRMDFieldsLinkForm.btnAddClick(Sender: TObject);
var
DetailIndex: Integer;
MasterIndex: Integer;
begin
DetailIndex := DetailList.ItemIndex;
MasterIndex := MasterList.ItemIndex;
AddToBindList(DetailList.Items[DetailIndex],
MasterList.Items[MasterIndex]);
with OrderedDetailList do
Objects[IndexOf(DetailList.Items[DetailIndex])] := TObject(True);
DetailList.Items.Delete(DetailIndex);
MasterList.Items.Delete(MasterIndex);
btnClear.Enabled := True;
btnAdd.Enabled := False;
end;
procedure TRMDFieldsLinkForm.btnClearClick(Sender: TObject);
var
I: Integer;
BindValue: string;
begin
for I := 0 to BindList.Items.Count - 1 do
begin
BindValue := BindList.Items[I];
DetailList.Items.Add(StripDetail(BindValue));
MasterList.Items.Add(StripMaster(BindValue));
end;
BindList.Clear;
btnClear.Enabled := False;
btnDelete.Enabled := False;
OrderFieldList(OrderedDetailList, DetailList.Items);
DetailList.ItemIndex := -1;
MasterList.Items.Assign(OrderedMasterList);
for I := 0 to OrderedDetailList.Count - 1 do
OrderedDetailList.Objects[I] := TObject(False);
btnAdd.Enabled := False;
end;
procedure TRMDFieldsLinkForm.btnDeleteClick(Sender: TObject);
var
I: Integer;
begin
with BindList do
begin
for I := Items.Count - 1 downto 0 do
begin
if Selected[I] then
begin
DetailList.Items.Add(StripDetail(Items[I]));
MasterList.Items.Add(StripMaster(Items[I]));
with OrderedDetailList do
Objects[IndexOf(StripDetail(Items[I]))] := TObject(False);
Items.Delete(I);
end;
end;
if Items.Count > 0 then Selected[0] := True;
btnDelete.Enabled := Items.Count > 0;
btnClear.Enabled := Items.Count > 0;
OrderFieldList(OrderedDetailList, DetailList.Items);
DetailList.ItemIndex := -1;
OrderFieldList(OrderedMasterList, MasterList.Items);
MasterList.ItemIndex := -1;
btnAdd.Enabled := False;
end;
end;
procedure TRMDFieldsLinkForm.BindListClick(Sender: TObject);
begin
btnDelete.Enabled := BindList.ItemIndex <> LB_ERR;
end;
procedure TRMDFieldsLinkForm.btnOKClick(Sender: TObject);
var
Gap: Boolean;
I: Integer;
FirstIndex: Integer;
begin
FirstIndex := -1;
MasterFieldList := '';
IndexFieldList := '';
FFullIndexName := '';
if DataSetProxy.IndexBased then
begin
Gap := False;
for I := 0 to OrderedDetailList.Count - 1 do
begin
if Boolean(OrderedDetailList.Objects[I]) then
begin
if Gap then
begin
MessageDlg(Format(SLinkDesigner,
[OrderedDetailList[FirstIndex]]), mtError, [mbOK], 0);
ModalResult := 0;
DetailList.ItemIndex := DetailList.Items.IndexOf(OrderedDetailList[FirstIndex]);
Exit;
end;
end
else begin
Gap := True;
if FirstIndex = -1 then FirstIndex := I;
end;
end;
if not Gap then FFullIndexName := DataSetProxy.IndexName;
end;
with BindList do
begin
for I := 0 to Items.Count - 1 do
begin
MasterFieldList := Format('%s%s;', [MasterFieldList, StripMaster(Items[I])]);
IndexFieldList := Format('%s%s;', [IndexFieldList, StripDetail(Items[I])]);
end;
if MasterFieldList <> '' then
SetLength(MasterFieldList, Length(MasterFieldList) - 1);
if IndexFieldList <> '' then
SetLength(IndexFieldList, Length(IndexFieldList) - 1);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -