?? myldbfldlinks.pas
字號:
unit MYLDBFldLinks;
interface
{$I MYLDBVER.Inc}
uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms,
StdCtrls, ExtCtrls, DB, Buttons,
// MYLDBoluteDatabase Unit
MYLDBExcept,
MYLDBConst,
{$IFDEF DEBUG_LOG}
MYLDBDebug,
{$ENDIF}
{$IFDEF D6H}
DesignIntf, DesignEditors;
{$ELSE}
DSGNINTF;
{$ENDIF}
type
////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBBaseFieldLinkProperty
//
////////////////////////////////////////////////////////////////////////////////
TMYLDBBaseFieldLinkProperty = class(TStringProperty)
private
FChanged: Boolean;
FDataSet: TDataSet;
protected
function GetDataSet: TDataSet;
procedure GetFieldNamesForIndex(List: TStrings); virtual;
function GetIndexBased: Boolean; virtual;
function GetIndexDefs: TIndexDefs; virtual;
function GetIndexFieldNames: string; virtual;
function GetIndexName: string; virtual;
function GetMasterFields: string; virtual; Abstract;
procedure SetIndexFieldNames(const Value: string); virtual;
procedure SetIndexName(const Value: string); virtual;
procedure SetMasterFields(const Value: string); virtual; Abstract;
public
constructor CreateWith(ADataSet: TDataSet); virtual;
procedure GetIndexNames(List: TStrings);
property IndexBased: Boolean read GetIndexBased;
property IndexDefs: TIndexDefs read GetIndexDefs;
property IndexFieldNames: string read GetIndexFieldNames write SetIndexFieldNames;
property IndexName: string read GetIndexName write SetIndexName;
property MasterFields: string read GetMasterFields write SetMasterFields;
property Changed: Boolean read FChanged;
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
property DataSet: TDataSet read GetDataSet;
end;
////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBLinkFields
//
////////////////////////////////////////////////////////////////////////////////
TMYLDBLinkFields = class(TForm)
DetailList: TListBox;
MasterList: TListBox;
BindList: TListBox;
Label30: TLabel;
Label31: TLabel;
IndexList: TComboBox;
IndexLabel: TLabel;
Label2: TLabel;
Bevel1: TBevel;
Bevel2: TBevel;
AddButton: TButton;
DeleteButton: TButton;
ClearButton: TButton;
Button1: TButton;
Button2: TButton;
Help: TButton;
procedure FormCreate(Sender: TObject);
procedure BindingListClick(Sender: TObject);
procedure AddButtonClick(Sender: TObject);
procedure DeleteButtonClick(Sender: TObject);
procedure BindListClick(Sender: TObject);
procedure ClearButtonClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure HelpClick(Sender: TObject);
procedure IndexListChange(Sender: TObject);
private
FDataSet: TDataSet;
FMasterDataSet: TDataSet;
FDataSetProxy: TMYLDBBaseFieldLinkProperty;
FFullIndexName: string;
MasterFieldList: string;
IndexFieldList: string;
OrderedDetailList: TStringList;
OrderedMasterList: TStringList;
procedure OrderFieldList(OrderedList, List: TStrings);
procedure AddToBindList(const Str1, Str2: string);
procedure Initialize;
property FullIndexName: string read FFullIndexName;
procedure SetDataSet(Value: TDataSet);
public
property DataSet: TDataSet read FDataSet write SetDataSet;
property DataSetProxy: TMYLDBBaseFieldLinkProperty read FDataSetProxy write FDataSetProxy;
function Edit: Boolean;
end;
function EditMasterFields(ADataSet: TDataSet; ADataSetProxy: TMYLDBBaseFieldLinkProperty): Boolean;
implementation
{$R *.DFM}
uses Dialogs, DBConsts, LibHelp, TypInfo;
{ Utility Functions }
function StripFieldName(const Fields: string; var Pos: Integer): string;
var
i: Integer;
begin
i := Pos;
while ((i <= Length(Fields)) and (Fields[I] <> ';')) do
Inc(i);
Result := Copy(Fields, Pos, i - Pos);
if (i <= Length(Fields)) and (Fields[i] = ';') then
Inc(i);
Pos := i;
end;
function StripDetail(const Value: string): string;
var
S: String;
i: Integer;
begin
S := Value;
i := 0;
while Pos('->', S) > 0 do
begin
i := Pos('->', S);
S[i] := ' ';
end;
Result := Copy(Value, 0, i - 2);
end;
function StripMaster(const Value: string): string;
var
S: String;
i: Integer;
begin
S := Value;
i := 0;
while Pos('->', S) > 0 do
begin
i := Pos('->', S);
S[i] := ' ';
end;
Result := Copy(Value, i + 3, Length(Value));
end;
function EditMasterFields(ADataSet: TDataSet; ADataSetProxy: TMYLDBBaseFieldLinkProperty): Boolean;
begin
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('EditMasterFields start');
{$ENDIF}
with TMYLDBLinkFields.Create(nil) do
try
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('EditMasterFields 1');
{$ENDIF}
DataSetProxy := ADataSetProxy;
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('EditMasterFields 2');
{$ENDIF}
DataSet := ADataSet;
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('EditMasterFields 3');
{$ENDIF}
Result := Edit;
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('EditMasterFields 4');
{$ENDIF}
finally
Free;
end;
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('EditMasterFields finish');
{$ENDIF}
end;
////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBBaseFieldLinkProperty
//
////////////////////////////////////////////////////////////////////////////////
function TMYLDBBaseFieldLinkProperty.GetIndexBased: Boolean;
begin
Result := False;
end;
function TMYLDBBaseFieldLinkProperty.GetIndexDefs: TIndexDefs;
begin
Result := nil;
end;
function TMYLDBBaseFieldLinkProperty.GetIndexFieldNames: string;
begin
Result := '';
end;
function TMYLDBBaseFieldLinkProperty.GetIndexName: string;
begin
Result := '';
end;
procedure TMYLDBBaseFieldLinkProperty.GetIndexNames(List: TStrings);
var
i: Integer;
begin
if (IndexDefs <> nil) then
for i := 0 to IndexDefs.Count - 1 do
List.Add(IndexDefs.Items[i].Name);
end;
procedure TMYLDBBaseFieldLinkProperty.GetFieldNamesForIndex(List: TStrings);
begin
end;
procedure TMYLDBBaseFieldLinkProperty.SetIndexFieldNames(const Value: string);
begin
end;
procedure TMYLDBBaseFieldLinkProperty.SetIndexName(const Value: string);
begin
end;
function TMYLDBBaseFieldLinkProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog];
end;
procedure TMYLDBBaseFieldLinkProperty.Edit;
begin
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('TMYLDBBaseFieldLinkProperty.Edit start');
{$ENDIF}
FChanged := EditMasterFields(DataSet, Self);
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('TMYLDBBaseFieldLinkProperty.Edit 1');
{$ENDIF}
if (FChanged) then
begin
Modified;
end;
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('TMYLDBBaseFieldLinkProperty.Edit finish');
{$ENDIF}
end;
constructor TMYLDBBaseFieldLinkProperty.CreateWith(ADataSet: TDataSet);
begin
FDataSet := ADataSet;
end;
function TMYLDBBaseFieldLinkProperty.GetDataSet: TDataSet;
begin
if (FDataSet) = nil then
FDataSet := TDataSet(GetComponent(0));
Result := FDataSet;
end;
////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBLinkFields
//
////////////////////////////////////////////////////////////////////////////////
procedure TMYLDBLinkFields.FormCreate(Sender: TObject);
begin
OrderedDetailList := TStringList.Create;
OrderedMasterList := TStringList.Create;
HelpContext := hcDFieldLinksDesign;
end;
procedure TMYLDBLinkFields.FormDestroy(Sender: TObject);
begin
OrderedDetailList.Free;
OrderedMasterList.Free;
end;
function TMYLDBLinkFields.Edit;
begin
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('TMYLDBLinkFields.Edit start');
{$ENDIF}
Initialize;
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('TMYLDBLinkFields.Edit 0');
{$ENDIF}
if (ShowModal = mrOK) then
begin
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('TMYLDBLinkFields.Edit 1');
{$ENDIF}
if (FullIndexName <> '') then
DataSetProxy.IndexName := FullIndexName
else
DataSetProxy.IndexFieldNames := IndexFieldList;
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('TMYLDBLinkFields.Edit 2');
{$ENDIF}
DataSetProxy.MasterFields := MasterFieldList;
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('TMYLDBLinkFields.Edit 3');
{$ENDIF}
Result := True;
end
else
Result := False;
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('TMYLDBLinkFields.Edit finish');
{$ENDIF}
end;
procedure TMYLDBLinkFields.SetDataSet(Value: TDataSet);
var
IndexDefs: TIndexDefs;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -