mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-14 17:52:46 +02:00
177 lines
4.8 KiB
ObjectPascal
177 lines
4.8 KiB
ObjectPascal
{
|
|
|
|
***************************************************************************
|
|
* *
|
|
* This source is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
* This code is distributed in the hope that it will be useful, but *
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
|
* General Public License for more details. *
|
|
* *
|
|
* A copy of the GNU General Public License is available on the World *
|
|
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
|
|
* obtain it by writing to the Free Software Foundation, *
|
|
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
|
* *
|
|
***************************************************************************
|
|
|
|
|
|
author: Alexandru Alexandrov
|
|
date: 11.06.2005
|
|
|
|
}
|
|
|
|
unit fieldslist;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ComCtrls,
|
|
Buttons, DB, StdCtrls, ObjInspStrConsts, ComponentEditors, PropEdits;
|
|
|
|
type
|
|
|
|
{ TFieldsListFrm }
|
|
|
|
TFieldsListFrm = class(TForm)
|
|
BitBtnOk: TBitBtn;
|
|
BitBtnCancel: TBitBtn;
|
|
ListBox1: TListBox;
|
|
procedure BitBtnOkClick(Sender: TObject);
|
|
private
|
|
{ private declarations }
|
|
FDesigner: TComponentEditorDesigner;
|
|
LinkDataset: TDataset;
|
|
procedure RefreshFieldsList;
|
|
public
|
|
{ public declarations }
|
|
constructor Create(AOwner: TComponent; ADataset: TDataset;
|
|
ADesigner: TComponentEditorDesigner); reintroduce;
|
|
end;
|
|
|
|
var
|
|
FieldsListFrm: TFieldsListFrm;
|
|
|
|
implementation
|
|
|
|
{ TFieldsListFrm }
|
|
|
|
procedure TFieldsListFrm.BitBtnOkClick(Sender: TObject);
|
|
var
|
|
i: integer;
|
|
NewField: TField;
|
|
fModified: boolean;
|
|
PreActive: boolean;
|
|
|
|
function CreateFieldName(Owner:TComponent;const AName:string):string;
|
|
var
|
|
j:integer;
|
|
begin
|
|
for j:=0 to Owner.ComponentCount - 1 do
|
|
begin
|
|
if CompareText(Owner.Components[j].Name, AName)=0 then
|
|
begin
|
|
Result:=FDesigner.CreateUniqueComponentName(LinkDataset.Name + NewField.FieldName);
|
|
exit;
|
|
end;
|
|
end;
|
|
Result:=AName;
|
|
end;
|
|
|
|
begin
|
|
LinkDataset.DisableControls;
|
|
try
|
|
PreActive := LinkDataset.Active;
|
|
try
|
|
LinkDataSet.Active := False;
|
|
fModified := False;
|
|
for i := 0 to ListBox1.Items.Count - 1 do
|
|
begin
|
|
if ListBox1.Selected[i] And (LinkDataset.FindField(ListBox1.Items[i]) = Nil) then
|
|
begin
|
|
NewField := TFieldDef(ListBox1.Items.Objects[i]).CreateField(LinkDataset.Owner);
|
|
NewField.Name := CreateFieldName(LinkDataset.Owner, LinkDataset.Name + NewField.FieldName);
|
|
FDesigner.PropertyEditorHook.PersistentAdded(NewField, True);
|
|
fModified := True;
|
|
end;
|
|
end;
|
|
if fModified then FDesigner.Modified;
|
|
Finally
|
|
if PreActive then
|
|
LinkDataset.Active:=True;
|
|
end;
|
|
Finally
|
|
LinkDataset.EnableControls;
|
|
end;
|
|
end;
|
|
|
|
procedure TFieldsListFrm.RefreshFieldsList;
|
|
|
|
function CheckField(f: TFieldDef): boolean;
|
|
begin
|
|
Result := Assigned(f) And (LinkDataSet.FindField(f.Name) = Nil);
|
|
end;
|
|
|
|
function FillList: integer;
|
|
var
|
|
i: integer;
|
|
f: TFieldDef;
|
|
begin
|
|
Result := 0;
|
|
with LinkDataset do begin
|
|
for i := 0 to FieldDefs.Count - 1 do begin
|
|
f := FieldDefs.Items[i];
|
|
if CheckField(f) then begin
|
|
ListBox1.Items.AddObject(f.Name, f);
|
|
inc(Result);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
var
|
|
i: integer;
|
|
PreActive: boolean;
|
|
begin
|
|
i := 0;
|
|
ListBox1.Clear;
|
|
BitBtnOk.Enabled := False;
|
|
if not Assigned(LinkDataset) then Exit;
|
|
// refresh fielddefs
|
|
LinkDataset.FieldDefs.Update;
|
|
PreActive:=LinkDataset.Active;
|
|
LinkDataset.Active := False;
|
|
Try
|
|
i := FillList;
|
|
BitBtnOk.Enabled := i > 0;
|
|
Finally
|
|
if PreActive then
|
|
LinkDataset.Active:=True;
|
|
end;
|
|
end;
|
|
|
|
constructor TFieldsListFrm.Create(AOwner: TComponent; ADataset: TDataset;
|
|
ADesigner: TComponentEditorDesigner);
|
|
begin
|
|
inherited Create(AOwner);
|
|
LinkDataset := ADataset;
|
|
if Not Assigned(LinkDataset) then ShowMessage('LinkDataset = nil!')
|
|
else begin
|
|
FDesigner := ADesigner;
|
|
Caption := fesFlTitle + ' - ' + LinkDataset.Name;
|
|
end;
|
|
RefreshFieldsList;
|
|
end;
|
|
|
|
initialization
|
|
{$I fieldslist.lrs}
|
|
|
|
end.
|
|
|