536 lines
14 KiB
ObjectPascal
536 lines
14 KiB
ObjectPascal
{*******************************************************************}
|
|
{ }
|
|
{ Developer Express Visual Component Library }
|
|
{ ExpressMemData - CLX/VCL Edition }
|
|
{ }
|
|
{ Copyright (c) 1998-2009 Developer Express Inc. }
|
|
{ ALL RIGHTS RESERVED }
|
|
{ }
|
|
{ The entire contents of this file is protected by U.S. and }
|
|
{ International Copyright Laws. Unauthorized reproduction, }
|
|
{ reverse-engineering, and distribution of all or any portion of }
|
|
{ the code contained in this file is strictly prohibited and may }
|
|
{ result in severe civil and criminal penalties and will be }
|
|
{ prosecuted to the maximum extent possible under the law. }
|
|
{ }
|
|
{ RESTRICTIONS }
|
|
{ }
|
|
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
|
|
{ (DCU, OBJ, DLL, DPU, SO, ETC.) ARE CONFIDENTIAL AND PROPRIETARY }
|
|
{ TRADE SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER}
|
|
{ IS LICENSED TO DISTRIBUTE THE EXPRESSMEMDATA }
|
|
{ AS PART OF AN EXECUTABLE PROGRAM ONLY. }
|
|
{ }
|
|
{ THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED }
|
|
{ FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE }
|
|
{ COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE }
|
|
{ AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT }
|
|
{ AND PERMISSION FROM DEVELOPER EXPRESS INC. }
|
|
{ }
|
|
{ CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON }
|
|
{ ADDITIONAL RESTRICTIONS. }
|
|
{ }
|
|
{*******************************************************************}
|
|
|
|
unit dxmdsedt;
|
|
|
|
interface
|
|
|
|
{$I cxVer.inc}
|
|
|
|
uses
|
|
{$IFDEF DELPHI6}
|
|
DesignIntf,
|
|
{$ELSE}
|
|
DsgnIntf,
|
|
{$ENDIF}
|
|
Windows, Classes, Controls, Forms, StdCtrls, dxmdaset, ExtCtrls, Menus, Graphics;
|
|
|
|
type
|
|
TfrmdxMemDataEditor = class(TForm)
|
|
private
|
|
ListBox: TListBox;
|
|
pnButtons: TPanel;
|
|
BAdd: TButton;
|
|
BDelete: TButton;
|
|
BUp: TButton;
|
|
BDown: TButton;
|
|
pmColumns: TPopupMenu;
|
|
miShowButtons: TMenuItem;
|
|
procedure ListBoxClick(Sender: TObject);
|
|
procedure FormClose(Sender: TObject; var Action: TCloseAction);
|
|
procedure BAddClick(Sender: TObject);
|
|
procedure BDeleteClick(Sender: TObject);
|
|
procedure miUpClick(Sender: TObject);
|
|
procedure miDownClick(Sender: TObject);
|
|
procedure miSelectAllClick(Sender: TObject);
|
|
procedure miShowButtonsClick(Sender: TObject);
|
|
procedure ListBoxDragOver(Sender, Source: TObject; X, Y: Integer;
|
|
State: TDragState; var Accept: Boolean);
|
|
procedure ListBoxStartDrag(Sender: TObject;
|
|
var DragObject: TDragObject);
|
|
procedure ListBoxEndDrag(Sender, Target: TObject; X, Y: Integer);
|
|
procedure ListBoxDragDrop(Sender, Source: TObject; X, Y: Integer);
|
|
|
|
procedure CreateControls;
|
|
|
|
procedure MoveField(ADirection: Integer);
|
|
procedure GetSelection(AList: TList);
|
|
procedure SetSelection(AList: TList);
|
|
protected
|
|
{$IFDEF DELPHI9}
|
|
procedure CreateParams(var Params: TCreateParams); override;
|
|
{$ENDIF}
|
|
public
|
|
Data: TdxMemData;
|
|
FormDesigner: IDesigner;
|
|
|
|
procedure FillList;
|
|
end;
|
|
|
|
function ShowMemDataFieldEditor(AData: TdxMemData; AFormDesigner: IDesigner): Boolean;
|
|
|
|
implementation
|
|
|
|
uses
|
|
Contnrs, DB, dxmdseda;
|
|
|
|
var
|
|
FormList: TList;
|
|
|
|
const
|
|
OldDragIndex: Integer = -1;
|
|
|
|
type
|
|
TMemDataSetDesigner = class(TDataSetDesigner)
|
|
private
|
|
AForm: TfrmdxMemDataEditor;
|
|
FDestroying: Boolean;
|
|
public
|
|
destructor Destroy; override;
|
|
procedure DataEvent(Event: TDataEvent;
|
|
Info: Longint); override;
|
|
end;
|
|
|
|
destructor TMemDataSetDesigner.Destroy;
|
|
begin
|
|
FDestroying := True;
|
|
if AForm <> nil then
|
|
AForm.Close;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TMemDataSetDesigner.DataEvent(Event: TDataEvent;
|
|
Info: Longint);
|
|
var
|
|
i, j: Integer;
|
|
begin
|
|
if AForm <> nil then
|
|
with AForm do
|
|
begin
|
|
ListBox.Items.BeginUpdate;
|
|
for i := 0 to Data.FieldCount - 1 do
|
|
if Data.Fields[i].Owner = Data.Owner then
|
|
begin
|
|
j := ListBox.Items.IndexOfObject(Data.Fields[i]);
|
|
if j > -1 then
|
|
ListBox.Items[j] := Data.Fields[i].FieldName;
|
|
end;
|
|
ListBox.Items.EndUpdate;
|
|
end;
|
|
end;
|
|
|
|
function ShowMemDataFieldEditor(AData: TdxMemData; AFormDesigner: IDesigner): Boolean;
|
|
var
|
|
AForm: TfrmdxMemDataEditor;
|
|
i: Integer;
|
|
begin
|
|
AForm := nil;
|
|
for i := 0 to FormList.Count - 1 do
|
|
if TfrmdxMemDataEditor(FormList[i]).Data = AData then
|
|
begin
|
|
AForm := TfrmdxMemDataEditor(FormList[i]);
|
|
Break;
|
|
end;
|
|
if AForm = nil then
|
|
begin
|
|
AForm := TfrmdxMemDataEditor.CreateNew(nil);
|
|
AForm.CreateControls;
|
|
AForm.Data := AData;
|
|
AForm.FormDesigner := AFormDesigner;
|
|
TMemDataSetDesigner.Create(AData);
|
|
TMemDataSetDesigner(AData.Designer).AForm := AForm;
|
|
FormList.Add(AForm);
|
|
end;
|
|
with AForm do
|
|
begin
|
|
FillList;
|
|
Caption := 'Editing ' + Data.Name + '.Fields';
|
|
Show;
|
|
Result := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.FillList;
|
|
Var
|
|
i: Integer;
|
|
begin
|
|
ListBox.Items.BeginUpdate;
|
|
ListBox.Items.Clear;
|
|
for i := 0 to Data.FieldCount - 1 do
|
|
if Data.Fields[i].Owner = Data.Owner then
|
|
ListBox.Items.AddObject(Data.Fields[i].FieldName, Data.Fields[i]);
|
|
ListBox.Items.EndUpdate;
|
|
ListBoxClick(nil);
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.ListBoxClick(Sender: TObject);
|
|
var
|
|
AList: IDesignerSelections;
|
|
i: Integer;
|
|
begin
|
|
if (csDesigning in Data.ComponentState) then
|
|
begin
|
|
AList := CreateSelectionList;
|
|
try
|
|
for i := 0 to Listbox.Items.Count - 1 do
|
|
if Listbox.Selected[i] then
|
|
AList.Add(TComponent(Listbox.Items.Objects[i]));
|
|
if AList.Count > 0 then
|
|
FormDesigner.SetSelections(AList)
|
|
else
|
|
FormDesigner.SelectComponent(Data);
|
|
finally
|
|
AList := nil;
|
|
end;
|
|
end;
|
|
BDelete.Enabled := Listbox.SelCount > 0;
|
|
BUp.Enabled := Listbox.SelCount > 0;
|
|
BDown.Enabled := Listbox.SelCount > 0;
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.FormClose(Sender: TObject; var Action: TCloseAction);
|
|
begin
|
|
if (Data <> nil) and Not (csDestroying in Data.ComponentState)
|
|
and (Data.Designer <> nil) and not TMemDataSetDesigner(Data.Designer).FDestroying then
|
|
begin
|
|
TMemDataSetDesigner(Data.Designer).AForm := nil;
|
|
Data.Designer.Free;
|
|
end;
|
|
FormList.Remove(self);
|
|
Action := caFree;
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.BAddClick(Sender: TObject);
|
|
var
|
|
AField: TField;
|
|
P: TPoint;
|
|
begin
|
|
P := Point(BAdd.Left + BAdd.Width, BAdd.Top);
|
|
P := ClientToScreen(P);
|
|
Data.Close;
|
|
AField := GetMemDataNewFieldType(Data, P.X, P.Y, FormDesigner);
|
|
if AField <> nil then
|
|
begin
|
|
FillList;
|
|
ListBox.Selected[ListBox.Items.Count-1] := True;
|
|
ListBox.ItemIndex := ListBox.Items.Count-1;
|
|
ListBox.SetFocus;
|
|
ListBoxClick(nil);
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.BDeleteClick(Sender: TObject);
|
|
var
|
|
i, OldIndex: Integer;
|
|
List: TList;
|
|
begin
|
|
if Data <> nil then
|
|
begin
|
|
OldIndex := ListBox.ItemIndex;
|
|
List := TList.Create;
|
|
for i := 0 to ListBox.Items.Count - 1 do
|
|
if ListBox.Selected[i] then
|
|
List.Add(ListBox.Items.Objects[i]);
|
|
for i := 0 to List.Count - 1 do
|
|
TField(List[i]).Free;
|
|
List.Free;
|
|
FillList;
|
|
if OldIndex >= ListBox.Items.Count then
|
|
OldIndex := ListBox.Items.Count - 1;
|
|
if (OldIndex <> -1) and (ListBox.Items.Count > 0) then
|
|
ListBox.Selected[OldIndex] := True;
|
|
ListBox.SetFocus;
|
|
ListBoxClick(nil);
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.miUpClick(Sender: TObject);
|
|
begin
|
|
MoveField(-1);
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.miDownClick(Sender: TObject);
|
|
begin
|
|
MoveField(1);
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.miSelectAllClick(Sender: TObject);
|
|
var
|
|
i: Integer;
|
|
begin
|
|
with ListBox do
|
|
for i := 0 to Items.Count - 1 do
|
|
Selected[i] := True;
|
|
ListBox.SetFocus;
|
|
ListBoxClick(nil);
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.miShowButtonsClick(Sender: TObject);
|
|
begin
|
|
miShowButtons.Checked := not miShowButtons.Checked;
|
|
pnButtons.Visible := miShowButtons.Checked;
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.ListBoxDragOver(Sender, Source: TObject; X,
|
|
Y: Integer; State: TDragState; var Accept: Boolean);
|
|
var
|
|
Index: Integer;
|
|
begin
|
|
Accept := Source = ListBox;
|
|
if not Accept then
|
|
Exit;
|
|
Index := ListBox.ItemAtPos(Point(X, Y), True);
|
|
if OldDragIndex <> Index then
|
|
begin
|
|
if OldDragIndex <> -1 then
|
|
ListBox.Selected[OldDragIndex] := False;
|
|
if Index <> -1 then
|
|
if not ListBox.Selected[Index] then
|
|
begin
|
|
ListBox.Selected[Index] := True;
|
|
OldDragIndex := Index;
|
|
end
|
|
else
|
|
OldDragIndex := -1;
|
|
end;
|
|
if (Index <> -1) then
|
|
ListBox.ItemIndex := Index;
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.ListBoxStartDrag(Sender: TObject;
|
|
var DragObject: TDragObject);
|
|
begin
|
|
OldDragIndex := -1;
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.ListBoxEndDrag(Sender, Target: TObject; X,
|
|
Y: Integer);
|
|
begin
|
|
if OldDragIndex <> -1 then
|
|
begin
|
|
ListBox.Selected[OldDragIndex] := False;
|
|
OldDragIndex := -1;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.ListBoxDragDrop(Sender, Source: TObject; X,
|
|
Y: Integer);
|
|
var
|
|
i, Index: Integer;
|
|
List: TList;
|
|
begin
|
|
if OldDragIndex <> -1 then
|
|
begin
|
|
ListBox.Selected[OldDragIndex] := False;
|
|
OldDragIndex := -1;
|
|
end;
|
|
Index := ListBox.ItemAtPos(Point(X, Y), True);
|
|
if (Index <> -1) and (Data <> nil) then
|
|
begin
|
|
List := TList.Create;
|
|
try
|
|
GetSelection(List);
|
|
if TField(List[0]).Index > Index then
|
|
for i := List.Count - 1 downto 0 do
|
|
TField(List[i]).Index := Index + 1
|
|
else
|
|
for i := 0 to List.Count - 1 do
|
|
TField(List[i]).Index := Index + 1;
|
|
if FormDesigner <> nil then
|
|
FormDesigner.Modified;
|
|
FillList;
|
|
SetSelection(List);
|
|
ListBoxClick(nil);
|
|
finally
|
|
List.Free;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.CreateControls;
|
|
|
|
function CreateMenuItem(ACaption: String; AShortCut: TShortCut; ANotifyEvent: TNotifyEvent): TMenuItem;
|
|
begin
|
|
Result := TMenuItem.Create(pmColumns);
|
|
pmColumns.Items.Add(Result);
|
|
Result.Caption := ACaption;
|
|
Result.ShortCut := AShortCut;
|
|
Result.OnClick := ANotifyEvent;
|
|
end;
|
|
|
|
begin
|
|
pmColumns := TPopupMenu.Create(self);
|
|
CreateMenuItem('&Add...', 45, BAddClick);
|
|
CreateMenuItem('&Delete', 46, BDeleteClick);
|
|
CreateMenuItem('Move &Up', 0, miUpClick);
|
|
CreateMenuItem('Move Dow&n', 0, miDownClick);
|
|
CreateMenuItem('&Select All', 0, miSelectAllClick);
|
|
CreateMenuItem('-', 0, nil);
|
|
miShowButtons := CreateMenuItem('&Show Buttons', 0, miShowButtonsClick);
|
|
miShowButtons.Checked := True;
|
|
|
|
ListBox := TListBox.Create(self);
|
|
with ListBox do
|
|
begin
|
|
Parent := self;
|
|
Align := alClient;
|
|
ListBox.DragMode := dmAutomatic;
|
|
ItemHeight := 16;
|
|
MultiSelect := True;
|
|
PopupMenu := pmColumns;
|
|
TabOrder := 0;
|
|
OnClick := ListBoxClick;
|
|
OnDragDrop := ListBoxDragDrop;
|
|
OnDragOver := ListBoxDragOver;
|
|
OnEndDrag := ListBoxEndDrag;
|
|
OnStartDrag := ListBoxStartDrag;
|
|
end;
|
|
|
|
pnButtons := TPanel.Create(self);
|
|
with pnButtons do
|
|
begin
|
|
Parent := self;
|
|
Width := 107;
|
|
Align := alRight;
|
|
BevelOuter := bvNone;
|
|
TabOrder := 1;
|
|
end;
|
|
|
|
BAdd := TButton.Create(self);
|
|
with BAdd do
|
|
begin
|
|
Parent := pnButtons;
|
|
Left := 8;
|
|
Top := 7;
|
|
Width := 92;
|
|
Height := 28;
|
|
Caption := '&Add ...';
|
|
OnClick := BAddClick;
|
|
end;
|
|
|
|
BDelete := TButton.Create(self);
|
|
with BDelete do
|
|
begin
|
|
Parent := pnButtons;
|
|
Left := BAdd.Left;
|
|
Top := BAdd.Top + BAdd.Height + BAdd.Top;
|
|
Width := BAdd.Width;
|
|
Height := BAdd.Height;
|
|
Caption := '&Delete';
|
|
OnClick := BDeleteClick;
|
|
end;
|
|
|
|
BUp := TButton.Create(self);
|
|
with BUp do
|
|
begin
|
|
Parent := pnButtons;
|
|
Left := BAdd.Left;
|
|
Top := BDelete.Top + BDelete.Height + BAdd.Top;
|
|
Width := BAdd.Width;
|
|
Height := BAdd.Height;
|
|
Caption := 'Move &Up';
|
|
OnClick := miUpClick;
|
|
end;
|
|
|
|
BDown := TButton.Create(self);
|
|
with BDown do
|
|
begin
|
|
Parent := pnButtons;
|
|
Left := BAdd.Left;
|
|
Top := BUp.Top + BUp.Height + BAdd.Top;
|
|
Width := BAdd.Width;
|
|
Height := BAdd.Height;
|
|
Caption := 'Move Dow&n';
|
|
OnClick := miDownClick;
|
|
end;
|
|
|
|
ActiveControl := ListBox;
|
|
BorderIcons := [biSystemMenu];
|
|
|
|
BorderStyle := bsSizeToolWin;
|
|
|
|
Caption := 'Columns Editor';
|
|
Left := 100;
|
|
Top := 100;
|
|
Color := clBtnFace;
|
|
OnClose := FormClose;
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.MoveField(ADirection: Integer);
|
|
var
|
|
i: Integer;
|
|
List: TList;
|
|
begin
|
|
if Data <> nil then
|
|
begin
|
|
List := TList.Create;
|
|
try
|
|
GetSelection(List);
|
|
for i := 0 to List.Count - 1 do
|
|
TField(List[i]).Index := TField(List[i]).Index + ADirection;
|
|
if FormDesigner <> nil then
|
|
FormDesigner.Modified;
|
|
FillList;
|
|
SetSelection(List);
|
|
finally
|
|
List.Free;
|
|
end;
|
|
ListBoxClick(nil);
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.GetSelection(AList: TList);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to ListBox.Items.Count - 1 do
|
|
if ListBox.Selected[I] then
|
|
AList.Add(ListBox.Items.Objects[i]);
|
|
end;
|
|
|
|
procedure TfrmdxMemDataEditor.SetSelection(AList: TList);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to ListBox.Items.Count - 1 do
|
|
ListBox.Selected[I] := AList.IndexOf(ListBox.Items.Objects[I]) <> -1;
|
|
end;
|
|
|
|
{$IFDEF DELPHI9}
|
|
procedure TfrmdxMemDataEditor.CreateParams(var Params: TCreateParams);
|
|
begin
|
|
inherited;
|
|
Params.WndParent := Application.MainForm.Handle;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
initialization
|
|
FormList := TList.Create;
|
|
|
|
finalization
|
|
FormList.Free;
|
|
|
|
end.
|
|
|