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

📄 ezexpressions.pas

📁 很管用的GIS控件
💻 PAS
📖 第 1 页 / 共 4 页
字号:
              TheRecno := FPrimaryLayer.Recno;
              FRecordList[TheRecno] := true;
              FMinRecno := IMin( FMinRecno, TheRecno );
              FMaxRecno := IMax( FMaxRecno, TheRecno );
            End;
          Finally
            EntityToQuery.free;
          End;
        Finally
          FPrimaryLayer.Next;
        End;
      End;
    Finally
      FPrimaryLayer.CancelFilter;
    End;
  End;

Begin
  Inherited Create( ParameterList );
  ErrorFound:=false;
  If ParameterList <> Nil Then
  Begin
    If ( ParameterList.Count = 3 ) And
      ( ParameterList.Param[0] Is TEntExpr ) And
      ( ParameterList.Param[1] Is TEzGraphicOperatorExpr ) And
      ( ( ParameterList.ExprType[2] = ttString ) Or
        ( ParameterList.Param[2] Is TEntExpr ) Or
        ( ParameterList.Param[2] Is TEzQueryVectorExpr ) Or
        ( ParameterList.Param[2] Is TEzQueryLayerExpr ) Or
        ( ParameterList.Param[2] Is TEzQueryScopeExpr ) ) Then
    Begin
      // all is right
    End
    Else If ParameterList.Count > 3 Then  // a list of records
    Begin
      For I := 3 To ParameterList.Count - 1 Do
      Begin
        If Not ( ParameterList.ExprType[I] = ttInteger ) Then
        Begin
          ErrorFound := true;
          Break;
        End;
      End;
    End
    Else
      ErrorFound := true;
  End
  Else
    ErrorFound := true;

  if ErrorFound then
    Raise EExpression.Create( Format(SWrongParameters, ['QUERY_LAYER']) );

  FMainExpr := MainExpr;
  FRecordList := TBits.Create;
  { determines the type of query }
  QueryLayerKind := Low( TEzQueryLayerKind );
  TestLayer := Nil;
  TheRecordList := Nil;
  If ParameterList.Count > 3 Then
  Begin
    If ( ParameterList.Count = 4 ) And ( ParameterList.ExprType[2] = ttBoolean ) And
      ( ParameterList.ExprType[3] = ttString ) Then
      QueryLayerKind := qlkComplexExpression
    Else
      QueryLayerKind := qlkFixedRecords;
  End
  Else If ParameterList.Count = 3 Then
  Begin
    If Param[2] Is TEntExpr Then
      QueryLayerKind := qlkAllRecords
    Else If Param[2] Is TEzQueryVectorExpr Then
      QueryLayerKind := qlkQueryVector
    Else If Param[2] Is TEzQueryScopeExpr Then
      QueryLayerKind := qlkQueryScope
    Else If Param[2] Is TEzQueryLayerExpr Then
      QueryLayerKind := qlkQueryLayer
    Else
      Raise EExpression.Create( 'Third parameter is wrong' );
  End;
  FMinRecno := System.MaxInt;
  FMaxRecno := -System.MaxInt;
  { get the test layer}
  FPrimaryLayer:= ( Param[0] As TEntExpr ).FLayer;
  { get the graphic operator }
  Operator := TEzGraphicOperator( Param[1].AsInteger );
  Case QueryLayerKind Of
    qlkFixedRecords:
      Begin
        { get the layer whose records will be used to query to FPrimaryLayer. }
        TestLayer := ( Param[2] As TEntExpr ).FLayer;
        { query to specific records }
        For I := 3 To ParameterCount - 1 Do
        Begin
          TestEntity := TestLayer.LoadEntityWithRecno( Param[I].AsInteger );
          If TestEntity = Nil Then
            Continue;
          Try
            DoQuery;
          Finally
            TestEntity.free;
          End;
        End;
      End;
    qlkAllRecords:
      Begin
        { get the layer whose records will be used to query to FPrimaryLayer. }
        TestLayer := ( Param[2] As TEntExpr ).FLayer;
        { use all the records in SourceLayer}
        TestLayer.First;
        TestLayer.StartBuffering;
        Try
          While Not TestLayer.eof Do
          Begin
            Try
              If TestLayer.RecIsDeleted Then
                continue;
              TestEntity := TestLayer.RecLoadEntity;
              If TestEntity = Nil Then
                Continue;
              Try
                DoQuery;
              Finally
                TestEntity.free;
              End;
            Finally
              TestLayer.Next;
            End;
          End;
        Finally
          TestLayer.EndBuffering;
        End;
      End;
    qlkQueryVector, qlkQueryScope, qlkQueryLayer, qlkComplexExpression:
      Begin
        If QueryLayerKind = qlkQueryVector Then
        Begin
          TestLayer := TEzQueryVectorExpr( Param[2] ).FPrimaryLayer;
          TheRecordList := TEzQueryVectorExpr( Param[2] ).FRecordList;
          MinRec := TEzQueryVectorExpr( Param[2] ).FMinRecno;
          MaxRec := TEzQueryVectorExpr( Param[2] ).FMaxRecno;
        End
        Else If QueryLayerKind = qlkQueryScope Then
        Begin
          TestLayer := TEzQueryScopeExpr( Param[2] ).FPrimaryLayer;
          TheRecordList := TEzQueryScopeExpr( Param[2] ).FRecordList;
          MinRec := TEzQueryScopeExpr( Param[2] ).FMinRecno;
          MaxRec := TEzQueryScopeExpr( Param[2] ).FMaxRecno;
        End
        Else If QueryLayerKind in [qlkQueryLayer, qlkComplexExpression] Then
        Begin
          TestLayer := TEzQueryLayerExpr( Param[2] ).FPrimaryLayer;
          TheRecordList := TEzQueryLayerExpr( Param[2] ).FRecordList;
          MinRec := TEzQueryLayerExpr( Param[2] ).FMinRecno;
          MaxRec := TEzQueryLayerExpr( Param[2] ).FMaxRecno;
        End
        Else
        Begin
          MinRec := 0;
          MaxRec := -1;
        End;
        For I := MinRec To MaxRec Do
        Begin
          If TheRecordList[I] Then
          Begin
            TestEntity := TestLayer.LoadEntityWithRecno( I );
            If TestEntity = Nil Then
              Continue;
            Try
              DoQuery;
            Finally
              TestEntity.free;
            End;
          End;
        End;
      End;
  End;

End;

Destructor TEzQueryLayerExpr.Destroy;
Begin
  FRecordList.free;
  Inherited Destroy;
End;

{$IFDEF BCB}
function TEzQueryLayerExpr.GetPrimaryLayer: TEzBaseLayer;
begin
  Result := FPrimaryLayer;
end;
{$ENDIF}

Function TEzQueryLayerExpr.GetAsBoolean: Boolean;
Var
  TheRecno: Integer;
Begin
  TheRecno := FPrimaryLayer.Recno;
  If TheRecno <= FMaxRecno Then
    Result := FRecordList[TheRecno]
  Else
    Result := false;
End;

Function TEzQueryLayerExpr.GetExprType: TExprType;
Begin
  result := ttBoolean;
End;

{$IFDEF BCB}
function TEzVectorExpr.GetVector: TEzVector;
begin
  Result := FVector;
end;
{$ENDIF}

{ TEzQueryVectorExpr }

Constructor TEzQueryVectorExpr.Create( ParameterList: TParameterList;
  MainExpr: TEzMainExpr );
Var
  TestEntity: TEzEntity;
  Operator: TEzGraphicOperator;
  Vector: TEzVector;
  EntityToQuery: TEzEntity;
  Passed: Boolean;
  TheRecno: Integer;
  VectorType: TEzVectorType;
  BufferWidth: Double;
  TempEntity: TEzEntity;
Begin
  Inherited Create( ParameterList );
  If ( ParameterList <> Nil ) And ( ParameterList.Count = 3 ) And
     ( ParameterList.Param[0] Is TEntExpr ) And
     ( ParameterList.Param[1] Is TEzGraphicOperatorExpr ) And
     ( ParameterList.Param[2] Is TEzVectorExpr ) Then
  Begin
    // all is right here
  End Else
  Begin
    Raise EExpression.Create( Format(SWrongParameters, ['QUERY_VECTOR']) );
  End;

  FMainExpr := MainExpr;
  FRecordList := TBits.Create;
  FMinRecno := System.MaxInt;
  FMaxRecno := -System.MaxInt;

  { get the test layer}
  FPrimaryLayer := ( Param[0] As TEntExpr ).FLayer;
  { get the graphic operator }
  Operator := TEzGraphicOperator( Param[1].AsInteger );
  { get the vector }
  Vector := ( Param[2] As TEzVectorExpr ).FVector;
  VectorType:= ( Param[2] As TEzVectorExpr ).FVectorType;
  BufferWidth:= ( Param[2] As TEzVectorExpr ).FBufferWidth;
  if VectorType = vtPolygon then
  begin
    if not EqualPoint2d( Vector[0], Vector[Vector.Count - 1] ) Then
      Vector.Add( Vector[0] );
    TestEntity := TEzPolygon.Create( Vector.Count );
    TestEntity.Points.Assign( Vector );
  end else if VectorType = vtBuffer then
  begin
    TempEntity := TEzPolyline.Create( Vector.Count );
    try
      TempEntity.Points.Assign( Vector );
      TestEntity:= CreateBufferFromEntity( TempEntity, 50, BufferWidth );
    finally
      TempEntity.Free;
    end;
  end else  { assumed a simple polyline if VectorType in [ vtPolyline, vtBuffer ] }
  begin
    TestEntity := TEzPolyline.Create( Vector.Count );
    TestEntity.Points.Assign( Vector );
  end;
  { now query against this entity TestEntity }
  { Set filter for the source layer and for this entity in order to optimize speed }
  FPrimaryLayer.SetGraphicFilter( stOverlap, TestEntity.FBox );
  FPrimaryLayer.First;
  Try
    While Not FPrimaryLayer.eof Do
    Begin
      Try
        If FPrimaryLayer.RecIsDeleted Then
          Continue;
        EntityToQuery := FPrimaryLayer.RecLoadEntity;
        If EntityToQuery = Nil Then
          Continue;
        Try
          Passed := EntityToQuery.CompareAgainst( TestEntity, Operator );
          If Passed Then
          Begin
            TheRecno := FPrimaryLayer.Recno;
            FRecordList[TheRecno] := true;
            FMinRecno := IMin( FMinRecno, TheRecno );
            FMaxRecno := IMax( FMaxRecno, TheRecno );
          End;
        Finally
          EntityToQuery.free;
        End;
      Finally
        FPrimaryLayer.Next;
      End;
    End;
  Finally
    FPrimaryLayer.CancelFilter;
    TestEntity.Free;
  End;
End;

Destructor TEzQueryVectorExpr.Destroy;
Begin
  FRecordList.free;
  Inherited Destroy;
End;

Function TEzQueryVectorExpr.GetAsBoolean: Boolean;
Var
  TheRecno: Integer;
Begin
  TheRecno := FPrimaryLayer.Recno;
  If TheRecno <= FMaxRecno Then
    Result := FRecordList[TheRecno]
  Else
    Result := false;
End;

Function TEzQueryVectorExpr.GetExprType: TExprType;
Begin
  result := ttBoolean;
End;

{$IFDEF BCB}
function TEzQueryVectorExpr.GetPrimaryLayer: TEzBaseLayer;
begin
  Result := FPrimaryLayer;
end;
{$ENDIF}

{ TEzQueryScopeExpr }

Constructor TEzQueryScopeExpr.Create( ParameterList: TParameterList;
  MainExpr: TEzMainExpr );
Var
  //Resolver: TEzMainExpr;
  TheRecno: Integer;
Begin
  Inherited Create( ParameterList );

  If ( ParameterList <> Nil ) And ( ParameterList.Count = 2 ) And
     ( ParameterList.Param[0] Is TEntExpr ) And
     ( ParameterList.ExprType[1] = ttBoolean ) Then
  Begin
    // all is right
  End
  Else
    Raise EExpression.Create( Format(SWrongParameters, ['QUERY_SCOPE']) );

  FMainExpr := MainExpr;
  FRecordList := TBits.create;
  FMinRecno := System.MaxInt;
  FMaxRecno := -System.MaxInt;

  { get the test layer}
  FPrimaryLayer := ( Param[0] As TEntExpr ).FLayer;
  { create the expression }
  {Resolver := Nil;
  if no resolver is defined, then all records are included }
  {If Length( Param[1].AsString ) > 0 Then
  Begin
    Resolver := TEzMainExpr.Create( FMainExpr.Gis, FPrimaryLayer );
    Resolver.ParseExpression( Param[1].AsString );
    If Resolver.Expression.ExprType <> ttBoolean Then
      FreeAndNil( Resolver ); // all records will be included on wrong expression type !!!
  End; }
  FPrimaryLayer.First;
  FPrimaryLayer.StartBuffering;
  Try
    While Not FPrimaryLayer.Eof Do
    Begin
      Try
        If FPrimaryLayer.RecIsDeleted Then
          Continue;
        //If Resolver <> Nil Then
        //Begin
          If FPrimaryLayer.DBTable <> Nil Then
            FPrimaryLayer.Synchronize;
          If Param[1].AsBoolean Then
          Begin
            TheRecno := FPrimaryLayer.Recno;
            FRecordList[TheRecno] := true;
            FMinRecno := IMin( FMinRecno, TheRecno );
            FMaxRecno := IMax( FMaxRecno, TheRecno );
          End;
        //End
        //Else
        //Begin
          //TheRecno := FPrimaryLayer.Recno;
          //FRecordList[TheRecno] := true;
          //FMinRecno := IMin( FMinRecno, TheRecno );
          //FMaxRecno := IMax( FMaxRecno, TheRecno );
        //End;
      Finally
        FPrimaryLayer.Next;
      End;
    End;
  Finally
    FPrimaryLayer.EndBuffering;
  End;

End;

Destructor TEzQueryScopeExpr.destroy;
Begin
  FRecordList.free;
  Inherited destroy;
End;

Function TEzQueryScopeExpr.GetAsBoolean: Boolean;
Var
  TheRecno: Integer;
Begin
  TheRecno := FPrimaryLayer.Recno;
  If TheRecno <= FMaxRecno Then
    Result := FRecordList[TheRecno]
  Else
    Result := false;
End;

Function TEzQueryScopeExpr.GetExprType: TExprType;
Begin
  result := ttBoolean;
End;

{ TUDFExpr - class implementation}

Constructor TUDFExpr.Create( ParameterList: TParameterList;
  GIS: TEzBaseGIS; Layer: TEzBaseLayer; Const Identifier: String;
  DataType: TExprType; MaxLen: Integer );
Begin
  Inherited Create( ParameterList );
  FLayer := Layer;
  FGIS := GIS;
  FIdentifier := Identifier;
  FDataType := DataType;
  FMaxLen:= MaxLen;
End;

Function TUDFExpr.GetExprType: TExprType;
Begin
  Result := FDataType;
End;

Function TUDFExpr.GetMaxString: String;
Var
  Mx: Integer;
Begin
  Result:= '';
  if Not (FDatatype = ttString) then Exit;
  Mx:= FMaxLen;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -