home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1999 March
/
Chip_1999-03_cd.bin
/
zkuste
/
delphi
/
D234C13
/
RALIB.ZIP
/
RALib
/
Lib
/
RAIDb.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1998-08-24
|
4KB
|
177 lines
{***********************************************************
R&A Library
Copyright (C) 1996-98 R&A
component : TRAIField
description : Calclulated DB Field
programer : black
e-mail : blacknbs@chat.ru
www : www.chat.ru\~blacknbs\ralib
************************************************************}
{$INCLUDE RA.INC}
unit RAIDb;
interface
uses
SysUtils, Classes, Db,
RAIIntf, RAIClas, RAIImpl, RAISystem;
type
TSetGetInfo = RAIIntf.TSetGetInfo;
TSetGetVarEvent = procedure (Sender : TObject; var SGI : TSetGetInfo; var Done : boolean) of object;
TRAIField = class(TField)
protected
FRAIObject : TIInterObject;
FProgramSource : string;
FOnSyncSetGetVar : TSetGetVarEvent;
procedure GetText(var Text: string; DisplayText: Boolean); override;
procedure SetProgramSource(AValue : string);
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
property RAIObject : TIInterObject read FRAIObject;
published
property ProgramSource : string read FProgramSource write SetProgramSource;
property OnSyncSetGetVar : TSetGetVarEvent read FOnSyncSetGetVar write FOnSyncSetGetVar;
end;
implementation
{*********************** TRAIField *********************}
type
TIBOF = class(TIInterObject)
protected
MainOwner : TComponent;
Field : TRAIField;
function SyncSetGetVar(var SGI : TSetGetInfo) : boolean; override;
public
constructor Create;
procedure Calc(Pr : string);
end;
TIDataSet = class(TIThreadObject)
public
FDataSet : TDataSet;
constructor Create(ADataSet : TDataSet);
function SyncSetGetVar(var SGI : TSetGetInfo) : boolean; override;
end;
constructor TIBOF.Create;
begin
inherited Create;
{Add available modules}
SysObjs.Add(TISystem.Create);
SysObjs.Add(TISysUtils.Create);
end;
procedure TIBOF.Calc(Pr : string);
begin
Formula := Pr;
Run;
end;
function TIBOF.SyncSetGetVar(var SGI : TSetGetInfo) : boolean;
var
Comp : TComponent;
Done : boolean;
begin
{Find DataSet}
Result := inherited SyncSetGetVar(SGI);
if Assigned(Field.FOnSyncSetGetVar) then
begin
Done := false;
Field.FOnSyncSetGetVar(Field, SGI, Done);
Result := Done;
end;
with SGI do
if not Result and Get then
begin
Comp := MainOwner.FindComponent(Name);
if (Comp <> nil) and (Comp is TDataSet) then
begin
Result := true;
Res.vObject := TIDataSet.Create(Comp as TDataSet);
Res.vObject._Release;
end else
with TIDataSet.Create(Field.DataSet) do
try
Result := SyncSetGetVar(SGI);
finally
_Release;
end;
end;
end;
constructor TIDataSet.Create(ADataSet : TDataSet);
begin
inherited Create;
FDataSet := ADataSet;
end;
function TIDataSet.SyncSetGetVar(var SGI : TSetGetInfo) : boolean;
var
Field : TField;
DSState : TDataSetState;
begin
{Find field}
Result := inherited SyncSetGetVar(SGI);
with SGI do
if not Result then
begin
Field := FDataSet.FindField(Name);
Result := Field <> nil;
if Result then
if Get then
case Field.DataType of
ftString : Res.vString := PChar(Field.AsString);
else Res.Str := PChar(Field.AsString)
end
else {Set} begin
DSState := Field.DataSet.State;
Field.DataSet.Edit;
Field.AsString := Res.Str;
if DSState = dsBrowse then Field.DataSet.Post;
end;
end;
end;
constructor TRAIField.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
FRAIObject := TIBOF.Create;
(FRAIObject as TIBOF).MainOwner := AOwner;
(FRAIObject as TIBOF).Field := Self;
FieldKind := fkCalculated;
SetDataType(ftString);
end;
destructor TRAIField.Destroy;
begin
FRAIObject.Release;
inherited Destroy;
end;
procedure TRAIField.GetText(var Text: string; DisplayText: Boolean);
begin
(FRAIObject as TIBOF).Calc(FProgramSource);
if FRAIObject.ErrCode = ieOk then
Text := FRAIObject.Res.AsString else
Text := FRAIObject.ErrMessage;
end;
procedure TRAIField.SetProgramSource(AValue : string);
begin
FProgramSource := AValue;
if not (csLoading in ComponentState) then DataChanged;
end;
end.