home *** CD-ROM | disk | FTP | other *** search
- Unit DQLinkCtrl;
-
- {.$DEFINE MAKE_DQUERY}
- Interface
-
- Uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, DQQField;
- // StdUtil, DRBase
- Const
- LINE_BOX = 5;
- Type
- PointPtr = ^TPoint;
- TQueryLinkType = (tltEqual, tltNotEqual, tltGreater, tltLess,
- tltGreaterEqual, tltLessEqual, tltLeftOuter,
- tltRightOuter);
- RQueryLinkPtr = ^RQueryLink;
- RQueryLink = Packed Record
- QueryLinkType: TQueryLinkType;
- MAlias: String[255];
- MField: String[255];
- DAlias: String[255];
- DField: String[255];
-
- { Not Uses }
- MCtrl: TControl;
- DCtrl: TControl;
- LineList: TList;
- bSelect: Boolean;
- End;
- TSelectLinkEvent = Procedure (Sender: TObject; bSelect: Boolean) Of Object;
- { ---------- TDQLinkCtrl ---------- }
- TDQLinkCtrl = Class (TScrollBox)
- Private
- Protected
- FCanvas: TCanvas;
- FTableLink: TList;
-
- FOnNewLink: TNotifyEvent;
- FOnSelectLinkEvent: TSelectLinkEvent;
-
- FFieldHeight: Integer;
- FFieldWidth: Integer;
- iSpaceX: Integer;
- iSpaceY: Integer;
- FLineSelectColor: TColor;
- FLineColor: TColor;
- Function AddField (StDataBase, StTable, StAlias: String;
- Fields: TStrings): Boolean;
- Procedure FieldReSize (Sender: TObject);
- Procedure FieldAddLink (Sender: TObject);
- Procedure CreateLine;
- Procedure PaintLineLink (LinkPtr: RQueryLinkPtr);
- Function FindLinkSelect: Integer;
- Procedure DBlClickLink (iNo: Integer);
- Procedure MouseDown (Button: TMouseButton; Shift: TShiftState;
- X, Y: Integer); Override;
- Function FindQueryField (StAlias: String): TQueryField;
-
- Procedure WMPaint (var Message: TWMPaint); message WM_PAINT;
- Procedure PaintWindow(DC: HDC); override;
- Procedure Paint; virtual;
- Procedure DestroyPoint (LineList: TList);
- Procedure ClearTableLink;
- Public
- Constructor Create (AOwner: TComponent); Override;
- Destructor Destroy; Override;
-
- Function AddTable (StDataBase, StTable, StAlias: String;
- Fields: TStrings): Boolean;
- Function AddTableExt (StDataBase, StTable, StAlias: String): Boolean;
- Procedure ReInitTableLink;
-
- Procedure DeleteLineActive;
- Procedure Arrange;
- Procedure OptionLineActive;
- Procedure ClearAllCtrl;
- Procedure DeleteControl (StAlias: String);
- Procedure GetFieldWithAlias (StAlias: String; Items: TStrings);
- Function GetLink (iCount: Integer; Var QueryLink: RQueryLink): Boolean;
- Procedure AddLink (QueryLink: RQueryLink);
-
- Property Canvas: TCanvas Read FCanvas;
- Property TableLink: TList Read FTableLink;
-
- Published
- Property OnNewLink: TNotifyEvent Read FOnNewLink Write FOnNewLink;
- Property OnSelectLinkEvent: TSelectLinkEvent Read FOnSelectLinkEvent Write FOnSelectLinkEvent;
- Property FieldHeight: Integer Read FFieldHeight Write FFieldHeight;
- Property FieldWidth: Integer Read FFieldWidth Write FFieldWidth;
-
- Property LineSelectColor: TColor Read FLineSelectColor Write FLineSelectColor
- Default clWhite;
- Property LineColor: TColor Read FLineColor Write FLineColor
- Default clBlack;
- End;
-
- {$IFDEF MAKE_DQUERY}
- Procedure Register;
- {$ENDIF}
- Function Max (lV1, lV2: LongInt): Integer;
- Function Min (lV1, lV2: LongInt): Integer;
- Function PointInRect (x, y: Integer; Rc: TRect): Boolean;
-
- Implementation
- Uses DQLinkOp;
- {$IFDEF MAKE_DQUERY}
- Procedure Register;
- Begin
- RegisterComponents ('DuckTech', [TDQLinkCtrl]);
- End;
- {$ENDIF}
- Function Max (lV1, lV2: LongInt): Integer;
- Begin
- if lV1 > lV2 Then
- Result := lV1
- Else
- Result := lV2;
- End;
- Function Min (lV1, lV2: LongInt): Integer;
- Begin
- if lV1 < lV2 Then
- Result := lV1
- Else
- Result := lV2;
- End;
- Function PointInRect (x, y: Integer; Rc: TRect): Boolean;
- Begin
- Result := PtInRect (Rc, Point (x, y));
- End;
- { ---------- TDQLinkCtrl ---------- }
- Constructor TDQLinkCtrl.Create (AOwner: TComponent);
- Begin
- inherited Create (AOwner);
- FCanvas := TControlCanvas.Create;
- TControlCanvas(FCanvas).Control := Self;
-
- FFieldHeight := D_HEIGHT;
- FFieldWidth := D_WIDTH;
- iSpaceY := 10;
- iSpaceX := 20;
- FTableLink := TList.Create;
-
- FLineSelectColor := clWhite;
- FLineColor := clBlack;
- End;
- Destructor TDQLinkCtrl.Destroy;
- Begin
- ClearTableLink;
- FTableLink.Free;
- FCanvas.Free;
- inherited Destroy;
- End;
- Procedure TDQLinkCtrl.ClearTableLink;
- Var
- i: Integer;
- LinkPtr: RQueryLinkPtr;
- Begin
- For i := 0 To FTableLink.Count - 1 Do
- Begin
- LinkPtr := RQueryLinkPtr (FTableLink.Items[i]);
- FreeMem (LinkPtr);
- End;
- FTableLink.Clear;
- End;
- Procedure TDQLinkCtrl.DestroyPoint (LineList: TList);
- Var
- j: Integer;
- PPtr: PointPtr;
- Begin
- if LineList = nil Then Exit;
- Try
- For j := 0 To LineList.Count - 1 Do
- Begin
- PPtr := PointPtr (LineList.Items[j]);
- if PPtr <> nil Then
- FreeMem (PPtr, Sizeof (TPoint));
- End;
- Finally
- LineList.Clear;
- End;
- End;
- Function TDQLinkCtrl.AddTable (StDataBase, StTable, StAlias: String;
- Fields: TStrings): Boolean;
- Begin
- Result := AddField (StDataBase, StTable, StAlias, Fields);
- if Result Then
- FieldReSize (nil);
- End;
- Function TDQLinkCtrl.AddTableExt (StDataBase, StTable, StAlias: String): Boolean;
- Begin
- Result := AddField (StDataBase, StTable, StAlias, nil);
- if Result Then
- FieldReSize (nil);
- End;
- Function TDQLinkCtrl.AddField (StDataBase, StTable, StAlias: String;
- Fields: TStrings): Boolean;
- Var
- i: Integer;
- bLoop: Boolean;
- Rc: TRect;
- RcParent: TRect;
- RcC: TRect;
- QField: TQueryField;
- Begin
- RcParent := ClientRect;
- SetRect (Rc, 0, iSpaceY, 0, 0);
- bLoop := TRUE;
- While bLoop Do
- Begin
- bLoop := FALSE;
- if (Rc.Right + FFieldWidth + iSpaceX) > RcParent.Right Then
- Begin
- Rc.Left := iSpaceX;
- Rc.Top := Rc.Bottom + iSpaceY;
- End
- Else
- Begin
- if Rc.Left = 0 Then
- Rc.Left := iSpaceX
- Else
- Rc.Left := Rc.Right + iSpaceX;
- End;
- Rc.Right := Rc.Left + FFieldWidth;
- Rc.Bottom := Rc.Top + FFieldHeight;
- For i := 0 To ControlCount - 1 Do
- Begin
- if Controls[i] is TQueryField Then
- Begin
- QField := TQueryField (Controls[i]);
- RcC.Left := QField.Left;
- RcC.Top := QField.Top;
- RcC.Right := RcC.Left + QField.Width;
- RcC.Bottom := RcC.Top + QField.Height;
- if (Rc.Left >= RcC.Left) and (Rc.Left <= RcC.Right) or
- (Rc.Right >= RcC.Left) and (Rc.Right <= RcC.Right) Then
- Begin
- if (Rc.Top >= RcC.Top) and (Rc.Top <= RcC.Bottom) or
- (Rc.Bottom >= RcC.Top) and (Rc.Bottom <= RcC.Bottom) Then
- Begin
- bLoop := TRUE;
- break;
- End;
- End;
- End;
- End;
- End;
- QField := TQueryField.Create (Self);
- QField.Font.Assign (Self.Font);
- QField.Parent := Self;
- QField.Caption := StAlias;
- QField.OnAddLink := FieldAddLink;
- QField.OnResize := FieldReSize;
- QField.Top := Rc.Top;
- QField.Height := FFieldHeight;
- QField.Width := FFieldWidth;
- QField.Left := Rc.Left;
- QField.StartMove := TRUE;
- Result := TRUE;
- Try
- if Fields = nil Then
- QField.SetDataBase (StDataBase, StTable)
- else
- QField.SetDataBaseField (StDataBase, StTable, Fields);
- Except
- QField.Free;
- Result := FALSE;
- Exit;
- End;
- FieldReSize (nil);
- QField.Visible := TRUE;
- End;
- Procedure TDQLinkCtrl.FieldReSize (Sender: TObject);
- Var
- RcParent: TRect;
- iMaxHeight: Integer;
- iMaxWidth: Integer;
- i, w, h: Integer;
- QField: TQueryField;
- Begin
- iMaxHeight := 0;
- iMaxWidth := 0;
- For i := 0 To ControlCount - 1 Do
- Begin
- if Controls[i] is TQueryField Then
- Begin
- QField := TQueryField (Controls[i]);
- if QField.StartMove = FALSE Then
- Begin
- Continue;
- End;
- h := QField.Top + QField.Height;
- if h > iMaxHeight Then
- iMaxHeight := h;
- w := QField.Left + QField.Width;
- if w > iMaxWidth Then
- iMaxWidth := w;
- End;
- End;
- VertScrollBar.Range := iMaxHeight;
- HorzScrollBar.Range := iMaxWidth;
- CreateLine;
- Invalidate;
- End;
- Function TDQLinkCtrl.FindQueryField (StAlias: String): TQueryField;
- Var
- QField: TQueryField;
- i: Integer;
- Begin
- Result := nil;
- For i := 0 To ControlCount - 1 Do
- Begin
- if not (Controls[i] is TQueryField) Then Continue;
- QField := TQueryField (Controls[i]);
- if QField.Caption = StAlias Then
- Begin
- Result := QField;
- Break;
- End;
- End;
- End;
- Procedure TDQLinkCtrl.FieldAddLink (Sender: TObject);
- Var
- LinkPtr: RQueryLinkPtr;
- QueryField: TQueryField;
- Begin
- if (Sender is TQueryField) = FALSE Then Exit;
- QueryField := TQueryField (Sender);
- GetMem (Pointer (LinkPtr), Sizeof (RQueryLink));
- FillChar (LinkPtr^, Sizeof (RQueryLink), $0);
- With QueryField Do
- Begin
- LinkPtr^.MAlias := QueryField.MAlias;
- LinkPtr^.MField := QueryField.MField;
- LinkPtr^.MCtrl := MCtrl;
-
- LinkPtr^.DAlias := QueryField.DAlias;
- LinkPtr^.DField := QueryField.DField;
- LinkPtr^.DCtrl := DCtrl;
- End;
- FTableLink.Add (LinkPtr);
- CreateLine;
- Invalidate;
- End;
- Procedure TDQLinkCtrl.CreateLine;
- Var
- i: Integer;
- LinkPtr: RQueryLinkPtr;
- MiTop, DiTop: Integer;
- MQF, DQF: TQueryField;
- MRc, DRc: TRect;
- PPtr: PointPtr;
- iMax, iMin: Integer;
- x, y: Integer;
- Begin
- For i := 0 To FTableLink.Count - 1 Do
- Begin
- LinkPtr := RQueryLinkPtr (FTableLink.Items[i]);
- if (LinkPtr^.MCtrl <> nil) and (LinkPtr^.DCtrl <> nil) Then
- Begin
- if LinkPtr^.LineList <> nil Then
- Begin
- DestroyPoint (LinkPtr^.LineList);
- LinkPtr^.LineList.Free;
- End;
- LinkPtr^.LineList := TList.Create;
- MQF := TQueryField (LinkPtr^.MCtrl);
- DQF := TQueryField (LinkPtr^.DCtrl);
-
- MRc := MQF.BoundsRect;
- Inc (MRc.Right, LINE_BOX);
- DRc := DQF.BoundsRect;
- Dec (DRc.Left, LINE_BOX);
- MiTop := MQF.GetPosition (LinkPtr^.MField);
- if MiTop > MRc.Bottom Then
- MiTop := MRc.Bottom - 2;
- DiTop := DQF.GetPosition (LinkPtr^.DField);
- if DiTop > DRc.Bottom Then
- DiTop := DRc.Bottom - 2;
-
- iMax := Max (MRc.Right, DRc.Left);
- iMin := Min (MRc.Right, DRc.Left);
- x := iMin + ((iMax - iMin) div 2);
- GetMem (Pointer (PPtr), Sizeof (TPoint));
- FillChar (PPtr^, Sizeof (TPoint), $0);
- PPtr^.x := MRc.Right;
- PPtr^.y := MiTop;
- LinkPtr^.LineList.Add (PPtr);
-
- GetMem (Pointer (PPtr), Sizeof (TPoint));
- FillChar (PPtr^, Sizeof (TPoint), $0);
- PPtr^.x := x;
- PPtr^.y := MiTop;
- LinkPtr^.LineList.Add (PPtr);
-
- GetMem (Pointer (PPtr), Sizeof (TPoint));
- FillChar (PPtr^, Sizeof (TPoint), $0);
- PPtr^.x := x;
- PPtr^.y := DiTop;
- LinkPtr^.LineList.Add (PPtr);
-
- GetMem (Pointer (PPtr), Sizeof (TPoint));
- FillChar (PPtr^, Sizeof (TPoint), $0);
- PPtr^.x := DRc.Left;
- PPtr^.y := DiTop;
- LinkPtr^.LineList.Add (PPtr);
- End;
- End;
- End;
- Procedure TDQLinkCtrl.WMPaint(var Message: TWMPaint);
- Begin
- PaintHandler(Message);
- End;
- Procedure TDQLinkCtrl.PaintWindow(DC: HDC);
- Begin
- {$IFDEF WIN32}
- FCanvas.Lock;
- {$ENDIF}
- try
- FCanvas.Handle := DC;
- try
- Paint;
- finally
- FCanvas.Handle := 0;
- End;
- finally
- {$IFDEF WIN32}
- FCanvas.Unlock;
- {$ENDIF}
- End;
- End;
- Procedure TDQLinkCtrl.Paint;
- Var
- i: Integer;
- LinkPtr: RQueryLinkPtr;
- Begin
- For i := 0 To FTableLink.Count - 1 Do
- Begin
- LinkPtr := RQueryLinkPtr (FTableLink.Items[i]);
- PaintLineLink (LinkPtr);
- End;
- End;
- Procedure TDQLinkCtrl.PaintLineLink (LinkPtr: RQueryLinkPtr);
- Var
- j: Integer;
- PPtr1: PointPtr;
- PPtr2: PointPtr;
- Rc: TRect;
- x, y: Integer;
- Begin
- if LinkPtr^.LineList = nil Then Exit;
- y := VertScrollBar.Position;
- x := HorzScrollBar.Position;
- if LinkPtr^.bSelect Then
- Begin
- Canvas.Brush.Color := FLineSelectColor;
- Canvas.Pen.Color := FLineSelectColor;
- End
- Else
- Begin
- Canvas.Brush.Color := FLineColor;
- Canvas.Pen.Color := FLineColor;
- End;
- For j := 1 To LinkPtr^.LineList.Count - 1 Do
- Begin
- PPtr1 := PointPtr (LinkPtr^.LineList.Items[j - 1]);
- PPtr2 := PointPtr (LinkPtr^.LineList.Items[j]);
- With Canvas Do
- Begin
- if j = 1 Then
- Begin
- SetRect (Rc, PPtr1^.x - LINE_BOX,
- PPtr1^.y - (LINE_BOX div 2),
- PPtr1^.x, PPtr1^.y + (LINE_BOX div 2) + 1);
- Inc (Rc.Left);
- Dec (Rc.right);
- Rc := Rect (Rc.Left - x, Rc.Top - y,
- Rc.Right - x, Rc.Bottom - y);
- FillRect (Rc);
- End;
- if j = (LinkPtr^.LineList.Count - 1) Then
- Begin
- SetRect (Rc, PPtr2^.x,
- PPtr2^.y - (LINE_BOX div 2),
- PPtr2^.x + LINE_BOX,
- PPtr2^.y + (LINE_BOX div 2) + 1);
- Inc (Rc.Left); Dec (Rc.Top); Inc (Rc.Bottom);
- MoveTo (Rc.Left - x, Rc.Top - y);
- LineTo (Rc.Left - x, Rc.Bottom - y);
- MoveTo (Rc.Left - x + 1, Rc.Top - y + 1);
- LineTo (Rc.Left - x + 1, Rc.Bottom - y - 1);
-
- MoveTo (Rc.Left - x + 2, Rc.Top - y + 2);
- LineTo (Rc.Left - x + 2, Rc.Bottom - y - 2);
-
- MoveTo (Rc.Left - x + 3, Rc.Top - y + 3);
- LineTo (Rc.Left - x + 3, Rc.Top - y + 4);
- End;
- MoveTo (PPtr1^.x - x, PPtr1^.y - y);
- LineTo (PPtr2^.x - x, PPtr2^.y - y);
- End;
- End;
- End;
- Procedure TDQLinkCtrl.MouseDown (Button: TMouseButton; Shift: TShiftState;
- X, Y: Integer);
- Var
- j, i: Integer;
- LinkPtr: RQueryLinkPtr;
- SelectLinkPtr: RQueryLinkPtr;
- PPtr1: PointPtr;
- PPtr2: PointPtr;
- Rc: TRect;
- iTemp: Integer;
- bFound: Boolean;
- iFind: Integer;
- Begin
- iTemp := (LINE_BOX div 2);
- bFound := FALSE;
- SelectLinkPtr := nil;
- For i := 0 To FTableLink.Count - 1 Do
- Begin
- LinkPtr := RQueryLinkPtr (FTableLink.Items[i]);
- if LinkPtr^.LineList = nil Then Continue;
- For j := 1 To LinkPtr^.LineList.Count - 1 Do
- Begin
- PPtr1 := PointPtr (LinkPtr^.LineList.Items[j - 1]);
- PPtr2 := PointPtr (LinkPtr^.LineList.Items[j]);
- if j = 1 Then
- Begin
- SetRect (Rc, PPtr1^.x - LINE_BOX,
- PPtr1^.y - iTemp,
- PPtr2^.x, PPtr1^.y + iTemp + 1);
- Inc (Rc.Left);
- End
- Else
- if j = LinkPtr^.LineList.Count - 1 Then
- Begin
- SetRect (Rc, PPtr1^.x,
- PPtr1^.y - iTemp,
- PPtr2^.x + LINE_BOX, PPtr1^.y + iTemp + 1);
- End
- Else
- Begin
- SetRect (Rc, PPtr1^.x - iTemp,
- PPtr1^.y, PPtr1^.x + iTemp + 1, PPtr2^.y);
- End;
- if PointInRect (x, y, Rc) Then
- Begin
- iFind := FindLinkSelect;
- if iFind >= 0 Then
- SelectLinkPtr := RQueryLinkPtr (FTableLink.Items[iFind])
- Else
- SelectLinkPtr := nil;
- if (SelectLinkPtr <> nil) and
- (SelectLinkPtr <> LinkPtr) Then
- Begin
- SelectLinkPtr^.bSelect := FALSE;
- PaintLineLink (SelectLinkPtr);
- End;
- if (ssDouble in Shift) and (LinkPtr^.bSelect = TRUE) Then
- Begin
- DBlClickLink (iFind);
- Exit;
- End;
- LinkPtr^.bSelect := not LinkPtr^.bSelect;
- PaintLineLink (LinkPtr);
- bFound := TRUE;
- End;
- End;
- End;
- if not bFound Then
- Begin
- if SelectLinkPtr <> nil Then
- Begin
- SelectLinkPtr^.bSelect := FALSE;
- PaintLineLink (SelectLinkPtr);
- End;
- End
- Else
- if Assigned (FOnNewLink) Then
- FOnNewLink (Self);
- if Assigned (FOnSelectLinkEvent) Then
- FOnSelectLinkEvent (Self, bFound);
- End;
- Function TDQLinkCtrl.FindLinkSelect: Integer;
- Var
- i: Integer;
- LinkPtr: RQueryLinkPtr;
- Begin
- Result := -1;
- For i := 0 To FTableLink.Count - 1 Do
- Begin
- LinkPtr := RQueryLinkPtr (FTableLink.Items[i]);
- if LinkPtr^.bSelect Then
- Begin
- Result := i;
- Break;
- End;
- End;
- End;
- Procedure TDQLinkCtrl.DeleteLineActive;
- Var
- LinkPtr: RQueryLinkPtr;
- iFind: Integer;
- QueryField: TQueryField;
- Begin
- iFind := FindLinkSelect;
- if iFind >= 0 Then
- LinkPtr := RQueryLinkPtr (FTableLink.Items[iFind])
- Else
- LinkPtr := nil;
- if LinkPtr = nil Then Exit;
-
- if LinkPtr^.MCtrl <> nil Then
- Begin
- QueryField := TQueryField (LinkPtr^.MCtrl);
- QueryField.ListBox.SetSelectIndex (QueryField.ListBox.Items.IndexOf (LinkPtr^.MField), FALSE);
- End;
- if LinkPtr^.DCtrl <> nil Then
- Begin
- QueryField := TQueryField (LinkPtr^.DCtrl);
- QueryField.ListBox.SetSelectIndex (QueryField.ListBox.Items.IndexOf (LinkPtr^.DField), FALSE);
- End;
-
- iFind := FTableLink.IndexOf (LinkPtr);
- if iFind < 0 Then Exit;
- FreeMem (LinkPtr, Sizeof (RQueryLink));
- FTableLink.Delete (iFind);
- Invalidate;
- if Assigned (FOnSelectLinkEvent) Then
- FOnSelectLinkEvent (Self, FALSE);
- End;
- Procedure TDQLinkCtrl.DBlClickLink (iNo: Integer);
- Begin
- if Assigned (FOnSelectLinkEvent) Then
- FOnSelectLinkEvent (Self, TRUE);
- FormDQLinkOption := TFormDQLinkOption.Create (Self);
- FormDQLinkOption.TableLink := FTableLink;
- FormDQLinkOption.LBLink.ItemIndex := iNo;
- FormDQLinkOption.LBLinkClick (nil);
- FormDQLinkOption.ShowModal;
- FormDQLinkOption.Free;
- End;
- Procedure TDQLinkCtrl.OptionLineActive;
- Var
- iFind: Integer;
- Begin
- iFind := FindLinkSelect;
- DBlClickLink (iFind);
- End;
- Procedure TDQLinkCtrl.ClearAllCtrl;
- Var
- i: Integer;
- LinkPtr: RQueryLinkPtr;
- Begin
- For i := ControlCount - 1 DownTo 0 Do
- Begin
- if Controls[i] is TQueryField Then
- Controls[i].Free;
- End;
- For i := 0 To FTableLink.Count - 1 Do
- Begin
- LinkPtr := RQueryLinkPtr (FTableLink.Items[i]);
- LinkPtr^.MCtrl := nil;
- LinkPtr^.DCtrl := nil;
- if LinkPtr^.LineList <> nil Then
- DestroyPoint (LinkPtr^.LineList);
- LinkPtr^.LineList := nil;
- End;
- End;
- Procedure TDQLinkCtrl.GetFieldWithAlias (StAlias: String; Items: TStrings);
- Var
- QueryField: TQueryField;
- Begin
- QueryField := FindQueryField (StAlias);
- Items.Clear;
- if QueryField = nil then Exit;
- QueryField.GetField (Items);
- End;
- Procedure TDQLinkCtrl.DeleteControl (StAlias: String);
- Var
- i: Integer;
- LinkPtr: RQueryLinkPtr;
- QueryField: TQueryField;
- Begin
- For i := ControlCount - 1 DownTo 0 Do
- Begin
- if Controls[i] is TQueryField Then
- Begin
- QueryField := TQueryField (Controls[i]);
- if QueryField.Caption = StAlias Then
- Begin
- QueryField.Free;
- Break;
- End;
- End;
- End;
- i := 0;
- While i < FTableLink.Count Do
- Begin
- LinkPtr := RQueryLinkPtr (FTableLink.Items[i]);
- if (LinkPtr^.MAlias = StAlias) or
- (LinkPtr^.DAlias = StAlias) Then
- Begin
- if LinkPtr^.MCtrl <> nil Then
- Begin
- QueryField := TQueryField (LinkPtr^.MCtrl);
- QueryField.ListBox.SetSelectIndex (QueryField.ListBox.Items.IndexOf (LinkPtr^.MField), FALSE);
- End;
- if LinkPtr^.DCtrl <> nil Then
- Begin
- QueryField := TQueryField (LinkPtr^.DCtrl);
- QueryField.ListBox.SetSelectIndex (QueryField.ListBox.Items.IndexOf (LinkPtr^.DField), FALSE);
- End;
-
- DestroyPoint (LinkPtr^.LineList);
- LinkPtr^.LineList := nil;
- FreeMem (LinkPtr);
- FTableLink.Delete (i);
- End
- Else
- Inc (i);
- End;
- End;
- Procedure TDQLinkCtrl.Arrange;
- Var
- RcParent: TRect;
- QField: TQueryField;
- x, y: Integer;
- i: Integer;
- Begin
- x := 0;
- y := iSpaceY;
- RcParent := ClientRect;
- VertScrollBar.Range := 0;
- VertScrollBar.Position := 0;
- HorzScrollBar.Range := 0;
- HorzScrollBar.Position := 0;
- RcParent := ClientRect;
-
- For i := 0 To ControlCount - 1 Do
- Begin
- if Controls[i] is TQueryField Then
- Begin
- QField := TQueryField (Controls[i]);
- QField.StartMove := FALSE;
- QField.Visible := FALSE;
- QField.Height := FFieldHeight;
- QField.Width := FFieldWidth;
- if (x + iSpaceX + FFieldWidth) > RcParent.Right Then
- Begin
- x := 0;
- y := y + iSpaceY + FFieldHeight;
- End;
-
- QField.Top := y;
- QField.Left := x + iSpaceX;
- QField.Visible := TRUE;
- QField.StartMove := TRUE;
- QField.SetListBoxSize;
-
- x := QField.Left + FFieldWidth;
- End;
- End;
- VertScrollBar.Range := y + iSpaceY + FFieldHeight;
- CreateLine;
- Invalidate;
- End;
- Function TDQLinkCtrl.GetLink (iCount: Integer; Var QueryLink: RQueryLink): Boolean;
- Var
- LinkPtr: RQueryLinkPtr;
- Begin
- Result := FALSE;
- if iCount >= FTableLink.Count Then Exit;
- LinkPtr := RQueryLinkPtr (FTableLink.Items[iCount]);
- QueryLink.MAlias := LinkPtr^.MAlias;
- QueryLink.MField := LinkPtr^.MField;
- QueryLink.QueryLinkType := LinkPtr^.QueryLinkType;
- QueryLink.DAlias := LinkPtr^.DAlias;
- QueryLink.DField := LinkPtr^.DField;
-
- Result := TRUE;
- End;
- Procedure TDQLinkCtrl.AddLink (QueryLink: RQueryLink);
- Var
- LinkPtr: RQueryLinkPtr;
- QField: TQueryField;
- i: Integer;
- Begin
- GetMem (Pointer (LinkPtr), Sizeof (RQueryLink));
- FillChar (LinkPtr^, Sizeof (RQueryLink), $0);
- LinkPtr^.MAlias := QueryLink.MAlias;
- LinkPtr^.MField := QueryLink.MField;
- LinkPtr^.DAlias := QueryLink.DAlias;
- LinkPtr^.DField := QueryLink.DField;
- LinkPtr^.QueryLinkType := QueryLink.QueryLinkType;
-
- For i := 0 To ControlCount - 1 Do
- Begin
- if Controls[i] is TQueryField Then
- Begin
- QField := TQueryField (Controls[i]);
- if LinkPtr^.MAlias = QField.Caption Then
- LinkPtr^.MCtrl := Controls[i];
- if LinkPtr^.DAlias = QField.Caption Then
- LinkPtr^.DCtrl := Controls[i];
- End;
- End;
- FTableLink.Add (LinkPtr);
- End;
- Procedure TDQLinkCtrl.ReInitTableLink;
- Var
- i: Integer;
- LinkPtr: RQueryLinkPtr;
- QueryField: TQueryField;
- Begin
- CreateLine;
- For i := 0 To FTableLink.Count - 1 Do
- Begin
- LinkPtr := RQueryLinkPtr (FTableLink.Items[i]);
- if LinkPtr^.MCtrl <> nil Then
- Begin
- QueryField := TQueryField (LinkPtr^.MCtrl);
- QueryField.ListBox.SetSelectIndex (QueryField.ListBox.Items.IndexOf (LinkPtr^.MField), TRUE);
- End;
- if LinkPtr^.DCtrl <> nil Then
- Begin
- QueryField := TQueryField (LinkPtr^.DCtrl);
- QueryField.ListBox.SetSelectIndex (QueryField.ListBox.Items.IndexOf (LinkPtr^.DField), TRUE);
- End;
- End;
- Invalidate;
- End;
- End.
-
-