📄 ezindygis.pas
字号:
End;
Procedure TMWSparseList.Exchange( Index1, Index2: Integer );
Begin
FList.Exchange( Index1, Index2 );
End;
Procedure TMWSparseList.Insert( Index: Integer; Const Value: Integer );
Begin
FList.Insert( Index, NewMWItem( Value, False ) );
End;
Procedure TMWSparseList.Clear;
Function ClearItem( TheIndex: Integer; TheItem: Pointer ): Integer; Far;
Begin
DisposeMWItem( PMWItem( TheItem ) ); { Item guaranteed non-nil }
Result := 0
End;
Begin
FList.ForAll( @ClearItem );
FList.Clear;
End;
{------------------------------------------------------------------------------}
{ Trial Version stuff }
{------------------------------------------------------------------------------}
{$IFDEF MW_TRIAL_VERSION}
Const
MAX_HOURS = 50;
Resourcestring
SHiddenFile = 'MWHLP.DLL';
STimeExpired = 'Demo time of TEzIndyClientGIS Component has expired !';
SDemoVersion =
'You are using a demonstration version of TEzIndyClientGIS Component' + CrLf +
'This message is only displayed on the demo version' + CrLf +
'of this software. To register, contact us at:' + CrLf +
'http://www.ezgis.com' + CrLf;
Type
TSecurityFileRec = Record
MagicNumber: LongInt;
Seconds: DWORD;
Runs: DWORD;
LastCheck: DWORD;
End;
Const
MAGIC_NUMBER = DWORD( 040508 ); {08=LA, 05=K, 04=KJ}
Var
ADOGisInstances: Integer;
ADOSecurityFile: String; { Security File }
Function BuildSecurityFile: boolean;
Var
IO: TFileStream;
SecFileRec: TSecurityFileRec;
I: integer;
R: TDateTime;
Begin
IO := TFileStream.Create( ADOSecurityFile, fmCreate );
Try
FillChar( SecFileRec, SizeOf( SecFileRec ), 0 );
SecFileRec.MagicNumber := MAGIC_NUMBER;
IO.Write( SecFileRec, SizeOf( SecFileRec ) );
{ write random data }
For I := 1 To 1500 Do
Begin
R := Random;
IO.Write( R, SizeOf( double ) );
End;
result := true;
Finally
IO.free;
End;
End;
Var
TimeStart: DWORD;
Function SecurityStartProgram: boolean;
Var
IO: TFileStream;
SecFileRec: TSecurityFileRec;
Begin
result := false;
If Not FileExists( ADOSecurityFile ) Then
Exit;
IO := TFileStream.Create( ADOSecurityFile, fmOpenRead Or fmShareDenyNone );
Try
IO.Read( SecFileRec, SizeOf( SecFileRec ) );
If SecFileRec.MagicNumber <> MAGIC_NUMBER Then
exit;
TimeStart := GetTickCount;
result := true;
Finally
IO.Free;
End;
End;
Function SecurityEndProgram: boolean;
Var
IO: TFileStream;
SecFileRec: TSecurityFileRec;
TimeEnd: DWORD;
Secsused: DWORD;
Begin
Result := false;
If Not FileExists( ADOSecurityFile ) Then Exit;
IO := TFileStream.Create( ADOSecurityFile, fmOpenReadWrite Or fmShareDenyNone );
Try
IO.Read( SecFileRec, SizeOf( SecFileRec ) );
If SecFileRec.MagicNumber <> MAGIC_NUMBER Then Exit;
TimeEnd := GetTickCount;
SecsUsed := ( TimeEnd - TimeStart ) Div 1000;
With SecFileRec Do
Begin
Inc( Seconds, SecsUsed );
Inc( Runs );
End;
IO.Seek( 0, 0 );
IO.Write( SecFileRec, SizeOf( SecFileRec ) );
result := true;
Finally
IO.free;
End;
End;
Procedure SecurityDemoTimeUsed( Var Seconds, LastCheck, Runs: DWORD );
Var
IO: TFileStream;
SecFileRec: TSecurityFileRec;
Begin
If Not FileExists( ADOSecurityFile ) Then Exit;
IO := TFileStream.Create( ADOSecurityFile, fmOpenRead Or fmShareDenyNone );
Try
IO.Read( SecFileRec, SizeOf( SecFileRec ) );
If SecFileRec.MagicNumber <> MAGIC_NUMBER Then Exit;
Seconds := SecFileRec.Seconds;
Runs := SecFileRec.Runs;
LastCheck := SecFileRec.LastCheck;
Finally
IO.Free;
End;
End;
Function SecurityCheckIfValid( ShowWarning: Boolean ): Boolean;
Var
Buffer: PChar;
SystemDir: String;
Runs, HoursUsed, SecondsUsed, LastCheck: DWORD;
Stream: TFileStream;
SecFileRec: TSecurityFileRec;
Begin
Result := false;
Buffer := StrAlloc( 255 );
Try
GetSystemDirectory( Buffer, 255 );
SystemDir := AddSlash( StrPas( Buffer ) );
Finally
StrDispose( Buffer );
End;
ADOSecurityFile := SystemDir + SHiddenFile;
If Not FileExists( ADOSecurityFile ) And Not BuildSecurityFile Then Exit;
SecurityDemoTimeUsed( SecondsUsed, LastCheck, Runs );
HoursUsed := ( SecondsUsed Div 3600 );
If ( HoursUsed >= MAX_HOURS ) And ShowWarning Then
Begin
Application.MessageBox( pchar( STimeExpired ),
pchar( smsgwarning ),
MB_OK Or MB_ICONWARNING );
Exit;
End;
{ show demo version window }
If ShowWarning Then
Begin
If ( SecondsUsed - LastCheck ) >= ( 10 * 60 ) Then // check every n minutes
Begin
Application.MessageBox( PChar( Format( SDemoVersion, [MAX_HOURS - HoursUsed] ) ),
PChar( smsgwarning ), MB_OK Or MB_ICONWARNING );
Stream := TFileStream.Create( ADOSecurityFile, fmOpenReadWrite Or fmShareDenyNone );
Try
Stream.Read( SecFileRec, SizeOf( SecFileRec ) );
SecFileRec.LastCheck := SecondsUsed;
Stream.Seek( 0, 0 );
Stream.Write( SecFileRec, SizeOf( SecFileRec ) );
Finally
Stream.Free;
End;
End;
End;
{ mark the start of use of this software }
If SecurityStartProgram = false Then Exit;
Result := true;
End;
{$ENDIF}
{------------------------------------------------------------------------------}
{ TEzIndyTable - class implementation }
{------------------------------------------------------------------------------}
Function TEzIndyTable.GetActive: Boolean;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
begin
WriteLn('DBT_GETACTIVE');
WriteLn(FLayer.Name);
Result:= ReadSmallInt <> 0;
end;
End;
Procedure TEzIndyTable.SetActive( Value: Boolean );
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
begin
WriteLn('DBT_SETACTIVE');
WriteLn(FLayer.Name);
WriteSmallInt( Ord(Value));
end;
If TEzIndyClientGIS(FLayer.Layers.GIS).FClientBuffered Then
FLayer.LocalLayer.DBTable.Active:= Value;
End;
Function TEzIndyTable.GetRecNo: Integer;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
begin
WriteLn('DBT_GETRECNO');
WriteLn(FLayer.Name);
Result:= ReadInteger;
end;
End;
Procedure TEzIndyTable.SetRecNo( Value: Integer );
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS) do
{If FClientBuffered and FLayer.LocalDataExists[Value-1] Then
// set position to corresponding record number of local storage
FLayer.LocalLayer.DBTable.Recno:= FLayer.LocalRecno[Value-1]
else }
with FTCPClient do
Begin
WriteLn('DBT_SETRECNO');
WriteLn(FLayer.Name);
WriteInteger(Value);
End;
FLastSetRecno:= Value;
End;
Procedure TEzIndyTable.Append( NewRecno: Integer );
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
Begin
WriteLn('DBT_APPEND');
WriteLn(FLayer.Name);
WriteInteger(NewRecno);
End;
End;
Function TEzIndyTable.BOF: Boolean;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS) do
{If FClientBuffered and (FLastSetRecno>0) and FLayer.LocalDataExists[FLastSetRecno-1] Then
Result:= FLayer.LocalLayer.DBTable.BOF
else }
with FTCPClient do
Begin
WriteLn('DBT_BOF');
WriteLn(FLayer.Name);
Result := ReadSmallInt <> 0;
End;
End;
Function TEzIndyTable.EOF: Boolean;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS) do
{If FClientBuffered and (FLastSetRecno>0) and FLayer.LocalDataExists[FLastSetRecno-1] Then
Result:= FLayer.LocalLayer.EOF
else}
with FTCPClient do
Begin
WriteLn('DBT_EOF');
WriteLn(FLayer.Name);
Result := ReadSmallInt <> 0;
End;
End;
Function TEzIndyTable.DateGet( Const FieldName: String ): TDateTime;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS) do
{If FClientBuffered and (FLastSetRecno>0) and FLayer.LocalDataExists[FLastSetRecno-1] Then
Result:= FLayer.LocalLayer.DBTable.DateGet(FieldName)
else}
with FTCPClient do
Begin
WriteLn('DBT_DATEGET');
WriteLn(FLayer.Name);
WriteLn(FieldName);
ReadBuffer(Result, SizeOf(Result));
End;
End;
Function TEzIndyTable.DateGetN( FieldNo: integer ): TDateTime;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
Begin
WriteLn('DBT_DATEGETN');
WriteLn(FLayer.Name);
WriteInteger(FieldNo);
ReadBuffer(Result, SizeOf(Result));
End;
End;
Function TEzIndyTable.Deleted: Boolean;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
Begin
WriteLn('DBT_DELETED');
WriteLn(FLayer.Name);
Result := ReadSmallInt <> 0;
End;
End;
Function TEzIndyTable.Field( FieldNo: integer ): String;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
Begin
WriteLn('DBT_FIELD');
WriteLn(FLayer.Name);
WriteInteger(FieldNo);
Result := ReadLn;
End;
End;
Function TEzIndyTable.FieldCount: integer;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
Begin
WriteLn('DBT_FIELDCOUNT');
WriteLn(FLayer.Name);
Result := ReadInteger;
End;
End;
Function TEzIndyTable.FieldDec( FieldNo: integer ): integer;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
Begin
WriteLn('DBT_FIELDDEC');
WriteLn(FLayer.Name);
WriteInteger(FieldNo);
Result := ReadInteger;
End;
End;
Function TEzIndyTable.FieldGet( Const FieldName: String ): String;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
Begin
WriteLn('DBT_FIELDGET');
WriteLn(FLayer.Name);
WriteLn(FieldName);
Result := ReadLn;
End;
End;
Function TEzIndyTable.FieldGetN( FieldNo: integer ): String;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
Begin
WriteLn('DBT_FIELDGETN');
WriteLn(FLayer.Name);
WriteInteger(FieldNo);
Result := ReadLn;
End;
End;
Function TEzIndyTable.FieldLen( FieldNo: integer ): integer;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
Begin
WriteLn('DBT_FIELDLEN');
WriteLn(FLayer.Name);
WriteInteger(FieldNo);
Result := ReadInteger;
End;
End;
Function TEzIndyTable.FieldNo( Const FieldName: String ): integer;
begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
Begin
WriteLn('DBT_FIELDNO',);
WriteLn(FLayer.Name);
WriteLn(FieldName);
Result := ReadInteger;
End;
End;
Function TEzIndyTable.FieldType( FieldNo: integer ): char;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
Begin
WriteLn('DBT_FIELDTYPE');
WriteLn(FLayer.Name);
WriteInteger(FieldNo);
Result := Char(ReadSmallInt);
End;
End;
Function TEzIndyTable.Find( Const ss: String; IsExact, IsNear: Boolean ): Boolean;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
Begin
WriteLn('DBT_FIND');
WriteLn(FLayer.Name);
WriteLn(ss);
WriteSmallInt(Ord(IsExact));
WriteSmallInt(Ord(IsNear));
Result := ReadSmallInt <> 0;
End;
End;
Function TEzIndyTable.FloatGet( Const Fieldname: String ): Double;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
Begin
WriteLn('DBT_FLOATGET');
WriteLn(FLayer.Name);
WriteLn(FieldName);
Readbuffer(Result,SizeOf(result));
End;
End;
Function TEzIndyTable.FloatGetN( FieldNo: Integer ): Double;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
Begin
WriteLn('DBT_FLOATGETN');
WriteLn(FLayer.Name);
WriteInteger(FieldNo);
Readbuffer(Result,SizeOf(result));
End;
End;
Function TEzIndyTable.IndexCount: integer;
Begin
with TEzIndyClientGIS(FLayer.Layers.GIS).FTCPClient do
Begin
WriteLn('DBT_INDEXCOUNT');
WriteLn(FLayer.Name);
Result:= ReadInteger;
End;
End;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -