⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ezindygis.pas

📁 很管用的GIS控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
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 + -