kolmck/mckLVColumnsEditor.pas
dkolmck 829d5adfe5 Первая ревизия основана на 2.88+ =)
отличия от 2.88:
+ procedure TControl.TBClear;  {* |<#toolbar>     Deletes all buttons. Dufa }
+ property TControl.TBButtonLParam[const Idx: Integer]: DWORD read TBGetButtonLParam write TBSetButtonLParam;
    {* |<#toolbar>  Allows to access/change LParam. Dufa }
+ добавлен MCKfakeClasses200x.inc для исправления глюка с ложными МСК варнингами(в версиях 2006-2009) // Dufa
* DefFont = Tahoma
* procedure TDirList.ScanDirectory исправлена утечка памяти // Dufa
* function TControl.WndProcTransparent исправлено "странное" поведение приложения, при кол-во форм >= 2   // Galkov
* procedure TControl.SetCurIndex устранен AV // Galkov
* visual_xp_styles.inc:  function IsManifestFilePresent : boolean; исправлена ошибка при работе с библиотеками //Dufa

*** возможно что-то забыл.... %)

git-svn-id: https://svn.code.sf.net/p/kolmck/code@3 91bb2d04-0c0c-4d2d-88a5-bbb6f4c1fa07
2009-08-05 17:45:57 +00:00

528 lines
13 KiB
ObjectPascal

unit mckLVColumnsEditor;
interface
{$I KOLDEF.INC}
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, ComCtrls, StdCtrls,
{$IFDEF _D6orHigher}
DesignIntf, DesignEditors, DesignConst, Variants
{$ELSE}
DsgnIntf
{$ENDIF}
;
type
TfmLVColumnsEditor = class(TForm)
private
pnButtons: TPanel;
pnView: TPanel;
btAdd: TButton;
btDel: TButton;
btUp: TButton;
btDown: TButton;
chkStayOnTop: TCheckBox;
lvColumns: TListView;
procedure FormResize(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure chkStayOnTopClick(Sender: TObject);
procedure btAddClick(Sender: TObject);
procedure btDelClick(Sender: TObject);
procedure btUpClick(Sender: TObject);
procedure btDownClick(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure lvColumnsSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
{$IFDEF VER90} {$DEFINE OLDDELPHI} {$ENDIF}
{$IFDEF VER100} {$DEFINE OLDDELPHI} {$ENDIF}
{$IFDEF OLDDELPHI}
procedure lvColumnsChange(Sender: TObject; Item: TListItem; Change: TItemChange);
{$ENDIF}
procedure lvColumnsEdited(Sender: TObject; Item: TListItem;
var S: String);
procedure FormDestroy(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
FListView: TComponent;
procedure SetListView(const Value: TComponent);
procedure AdjustButtons;
procedure SelectLV;
public
{ Public declarations }
property ListView: TComponent read FListView write SetListView;
procedure MakeActive( SelectAny: Boolean );
constructor Create( AOwner: TComponent ); override;
end;
var
fmLVColumnsEditor: TfmLVColumnsEditor;
implementation
uses mirror, mckCtrls, mckObjs;
procedure TfmLVColumnsEditor.AdjustButtons;
var LI: TListItem;
begin
LI := lvColumns.Selected;
if LI = nil then
begin
btAdd.Enabled := lvColumns.Items.Count = 0;
btDel.Enabled := FALSE;
btUp.Enabled := FALSE;
btDown.Enabled := FALSE;
end
else
begin
btAdd.Enabled := TRUE;
btDel.Enabled := TRUE;
btUp.Enabled := LI.Index > 0;
btDown.Enabled := LI.Index < lvColumns.Items.Count - 1;
end;
end;
procedure TfmLVColumnsEditor.FormResize(Sender: TObject);
begin
lvColumns.Columns[ 0 ].Width := lvColumns.ClientWidth;
end;
procedure TfmLVColumnsEditor.MakeActive(SelectAny: Boolean);
var F: TForm;
D: IDesigner;
FD: IFormDesigner;
Col: TKOLListViewColumn;
begin
if lvColumns.Items.Count > 0 then
if lvColumns.Selected = nil then
if SelectAny then
lvColumns.Selected := lvColumns.Items[ 0 ];
if lvColumns.Selected <> nil then
begin
Col := lvColumns.Selected.Data;
F := (FListView as TKOLListView).Owner as TForm;
if F <> nil then
begin
{$IFDEF _D6orHigher}
F.Designer.QueryInterface(IFormDesigner,D);
{$ELSE}
D := F.Designer;
{$ENDIF}
if D <> nil then
if QueryFormDesigner( D, FD ) then
begin
RemoveSelection( FD );
FD.SelectComponent( Col );
end;
end;
end;
AdjustButtons;
end;
procedure TfmLVColumnsEditor.SetListView(const Value: TComponent);
var LV: TKOLListView;
begin
FListView := Value;
LV := FListView as TKOLListView;
Caption := LV.Name + ' columns';
end;
procedure TfmLVColumnsEditor.FormShow(Sender: TObject);
var I: Integer;
LI: TListItem;
Col: TKOLListViewColumn;
LV: TKOLListView;
begin
lvColumns.Items.BeginUpdate;
TRY
lvColumns.Items.Clear;
if FListView <> nil then
if FListView is TKOLListView then
begin
LV := FListView as TKOLListView;
for I := 0 to LV.Cols.Count-1 do
begin
LI := lvColumns.Items.Add;
Col := LV.Cols[ I ];
LI.Data := Col;
LI.Caption := Col.Caption;
end;
end;
FINALLY
lvColumns.Items.EndUpdate;
END;
end;
procedure TfmLVColumnsEditor.chkStayOnTopClick(Sender: TObject);
begin
if chkStayOnTop.Checked then
FormStyle := fsStayOnTop
else
FormStyle := fsNormal;
end;
procedure TfmLVColumnsEditor.btAddClick(Sender: TObject);
var LI: TListItem;
Col: TKOLListViewColumn;
LV: TKOLListView;
I: Integer;
S: String;
begin
if FListView = nil then Exit;
if not( FListView is TKOLListView ) then Exit;
LV := FListView as TKOLListView;
LI := lvColumns.Selected;
if LI = nil then
begin
Col := TKOLListViewColumn.Create( LV );
LI := lvColumns.Items.Add;
LI.Data := Col;
end
else
begin
if LI.Index >= lvColumns.Items.Count then
Col := TKOLListViewColumn.Create( LV )
else
begin
Col := TKOLListViewColumn.Create( LV );
LV.Cols.Move( lvColumns.Items.Count, LI.Index + 1 );
end;
LI := lvColumns.Items.Insert( LI.Index + 1 );
LI.Data := Col;
end;
if LV <> nil then
if LV.Owner is TForm then
for I := 1 to MaxInt do
begin
S := 'Col' + IntToStr( I );
if (LV.Owner as TForm).FindComponent( S ) = nil then
if LV.FindComponent( S ) = nil then
begin
Col.Name := S;
break;
end;
end;
if LV.HasOrderedColumns then
Col.LVColOrder := LI.Index;
lvColumns.Selected := nil;
lvColumns.Selected := LI;
lvColumns.ItemFocused := LI;
LI.MakeVisible( FALSE );
LI.EditCaption;
end;
procedure TfmLVColumnsEditor.btDelClick(Sender: TObject);
var LI: TListItem;
J: Integer;
Col: TKOLListViewColumn;
begin
LI := lvColumns.Selected;
if LI <> nil then
begin
J := LI.Index;
Col := LI.Data;
Col.Free;
LI.Free;
if J >= lvColumns.Items.Count then
Dec( J );
if J >= 0 then
begin
lvColumns.Selected := lvColumns.Items[ J ];
lvColumns.ItemFocused := lvColumns.Selected;
end;
end;
AdjustButtons;
if lvColumns.Items.Count = 0 then
SelectLV;
end;
procedure TfmLVColumnsEditor.btUpClick(Sender: TObject);
var LI, LI1: TListItem;
I: Integer;
LV: TKOLListView;
Col: TKOLListViewColumn;
begin
if FListView = nil then Exit;
if not(FListView is TKOLListView) then Exit;
LV := FListView as TKOLListView;
LI := lvColumns.Selected;
if LI = nil then Exit;
I := LI.Index - 1;
LI1 := lvColumns.Items.Insert( I );
LI1.Caption := LI.Caption;
LI1.Data := LI.Data;
LV.Cols.Move( I + 1, I );
LI.Free;
lvColumns.Selected := LI1;
lvColumns.ItemFocused := LI1;
Col := LI1.Data;
if Col.LVColOrder = LI1.Index + 1 then
Col.LVColOrder := LI1.Index;
AdjustButtons;
end;
procedure TfmLVColumnsEditor.btDownClick(Sender: TObject);
var LI, LI1: TListItem;
LV: TKOLListView;
Col: TKOLListViewColumn;
begin
if FListView = nil then Exit;
if not(FListView is TKOLListView) then Exit;
LV := FListView as TKOLListView;
LI := lvColumns.Selected;
if LI = nil then Exit;
LV.Cols.Move( LI.Index, LI.Index + 1 );
LI1 := lvColumns.Items.Insert( LI.Index + 2 );
LI1.Caption := LI.Caption;
LI1.Data := LI.Data;
LI.Free;
lvColumns.Selected := LI1;
lvColumns.ItemFocused := LI1;
Col := LI1.Data;
if Col.LVColOrder = LI1.Index - 1 then
Col.LVColOrder := LI1.Index;
AdjustButtons;
end;
procedure TfmLVColumnsEditor.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_INSERT: btAdd.Click;
VK_DELETE: if not lvColumns.IsEditing then btDel.Click;
VK_RETURN: if (ActiveControl = lvColumns) and not lvColumns.IsEditing and
(lvColumns.Selected <> nil) then
lvColumns.Selected.EditCaption;
VK_UP: if (GetKeyState( VK_CONTROL ) < 0) then
btUp.Click
else Exit;
VK_DOWN: if (GetKeyState( VK_CONTROL ) < 0) then
btDown.Click
else Exit;
else Exit;
end;
Key := 0;
end;
procedure TfmLVColumnsEditor.lvColumnsSelectItem(Sender: TObject;
Item: TListItem; Selected: Boolean);
begin
if Selected then
MakeActive( FALSE );
end;
{$IFDEF OLDDELPHI}
procedure TfmLVColumnsEditor.lvColumnsChange(Sender: TObject; Item: TListItem; Change: TItemChange);
begin
if lvColumns.Selected <> nil then
MakeActive( FALSE );
end;
{$ENDIF}
procedure TfmLVColumnsEditor.lvColumnsEdited(Sender: TObject;
Item: TListItem; var S: String);
var Col: TKOLListViewColumn;
begin
if Item = nil then Exit;
Col := Item.Data;
Col.Caption := S;
MakeActive( FALSE );
end;
procedure TfmLVColumnsEditor.FormDestroy(Sender: TObject);
var LV: TKOLListView;
begin
if FListView = nil then Exit;
LV := FListView as TKOLListView;
LV.ActiveDesign := nil;
end;
procedure TfmLVColumnsEditor.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Rpt( 'Closing Listview columns editor', WHITE );
SelectLV;
modalResult := mrOK;
end;
procedure TfmLVColumnsEditor.SelectLV;
var F: TForm;
D: IDesigner;
FD: IFormDesigner;
begin
if FListView <> nil then
begin
F := (FListView as TKOLListView).Owner as TForm;
if F <> nil then
begin
Rpt( 'Form found: ' + F.Name, WHITE );
{$IFDEF _D6orHigher} //
F.Designer.QueryInterface(IFormDesigner,D); //
{$ELSE} //
D := F.Designer;
{$ENDIF} //
if D <> nil then
begin
Rpt( 'IDesigner interface returned', WHITE );
if QueryFormDesigner( D, FD ) then
begin
Rpt( 'IFormDesigner interface quered', WHITE );
try
RemoveSelection( FD );
FD.SelectComponent( FListView );
except
Rpt( 'EXCEPTION *** Could not clear selection!', WHITE )
end;
end;
end;
end;
end;
end;
constructor TfmLVColumnsEditor.Create(AOwner: TComponent);
begin
CreateNew(AOwner);
Left := 246;
Top := 107;
Width := 268;
Height := 314;
HorzScrollBar.Visible := False;
VertScrollBar.Visible := False;
BorderIcons := [biSystemMenu];
Caption := 'Columns';
//Color := clBtnFace;
//Font.Charset := DEFAULT_CHARSET;
//Font.Color := clWindowText;
//Font.Height := -11;
Font.Name := 'MS Sans Serif';
//Font.Style := [];
KeyPreview := True;
//OldCreateOrder := False;
Scaled := False;
OnClose := FormClose;
OnDestroy := FormDestroy;
OnKeyDown := FormKeyDown;
OnResize := FormResize;
OnShow := FormShow;
PixelsPerInch := 96;
//TextHeight := 13;
pnButtons := TPanel.Create( Self );
with pnButtons do
begin
Parent := Self;
Left := 150;
Top := 0;
Width := 110;
Height := 287;
Align := alRight;
BevelOuter := bvNone;
TabOrder := 0;
btAdd := TButton.Create( pnButtons );
with btAdd do
begin
Parent := pnButtons;
Left := 4;
Top := 4;
Width := 101;
Height := 25;
Caption := '&Add';
TabOrder := 0;
OnClick := btAddClick;
end;
btDel := TButton.Create( pnButtons );
with btDel do
begin
Parent := pnButtons;
Left := 4;
Top := 36;
Width := 101;
Height := 25;
Caption := '&Delete';
TabOrder := 1;
OnClick := btDelClick;
end;
btUp := TButton.Create( pnButtons );
with btUp do
begin
Parent := pnButtons;
Left := 4;
Top := 68;
Width := 49;
Height := 25;
Caption := '&Up';
TabOrder := 2;
OnClick := btUpClick;
end;
btDown := TButton.Create( pnButtons );
with btDown do
begin
Parent := pnButtons;
Left := 56;
Top := 68;
Width := 49;
Height := 25;
Caption := '&Down';
TabOrder := 3;
OnClick := btDownClick;
end;
chkStayOnTop := TCheckBox.Create( pnButtons );
with chkStayOnTop do
begin
Parent := pnButtons;
Left := 4;
Top := 100;
Width := 101;
Height := 17;
Caption := 'Stay On &Top';
TabOrder := 4;
OnClick := chkStayOnTopClick;
end;
end;
pnView := TPanel.Create( Self );
with pnView do
begin
Parent := Self;
Left := 0;
Top := 0;
Width := 150;
Height := 287;
Align := alClient;
BevelOuter := bvNone;
BorderWidth := 4;
TabOrder := 1;
lvColumns := TListView.Create( pnView );
with lvColumns do
begin
Parent := pnView;
Left := 4;
Top := 4;
Width := 142;
Height := 279;
Align := alClient;
Columns.Add;
HideSelection := False;
{$IFNDEF VER90}
RowSelect := True;
{$ENDIF}
ShowColumnHeaders := False;
TabOrder := 0;
ViewStyle := vsReport;
OnEdited := lvColumnsEdited;
{$IFDEF OLDDELPHI}
OnChange := lvColumnsChange;
{$ELSE}
OnSelectItem := lvColumnsSelectItem;
{$ENDIF}
end;
end;
end;
end.