1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
|
//------------------------------------------------------------------------------
procedure TFrmEasySearchSejourModule.DBGridSearchSejourTitleClick(
Column: TColumn);
var
iegf: TEnumGridField;
IndexEGF: Integer;
ic: Integer;
IndexName: String;
begin
if FlagColumnMoved then begin
FlagColumnMoved := False;
Exit;
end;
// Recherche d'une Colonne déjà en Cours de Tri
IndexEGF := -1;
for iegf := Low(TEnumGridField) to High(TEnumGridField) do begin
if GRID_FIELD_TRI[iegf] <> ettNone then begin
IndexEGF := Ord(iegf);
Break;
end;
end;
// Est-ce qu'une Colonne est déjà en Cours ?
if IndexEGF >= Ord(Low(TEnumGridField)) then begin
iegf := TEnumGridField(IndexEGF);
// Une est déjà en cours, mais est-ce la même que celle du Click
if Column.FieldName <> GRID_FIELD_NAME[iegf] then begin
// Une Colonne est déjà en Cours mais ce n'est pas celle du Click donc RAZ
GRID_FIELD_TRI[iegf] := ettNone;
for ic := 0 to DBGridSearchSejour.Columns.Count - 1 do begin
if DBGridSearchSejour.Columns.Items[ic].FieldName = GRID_FIELD_NAME[iegf] then begin
DBGridSearchSejour.Columns.Items[ic].Title.Caption := GRID_FIELD_LIB[iegf]; // Plus de Tri
DrawDBGridArrowSort(DBGridSearchSejour, DBGridSearchSejour.Columns.Items[ic], ettNone);
Break;
end;
end;
// C'est une Nouvelle Colonne pour le Tri donc il faut la chercher
IndexEGF := -1;
for iegf := Low(TEnumGridField) to High(TEnumGridField) do begin
if Column.FieldName = GRID_FIELD_NAME[iegf] then begin
IndexEGF := Ord(iegf);
Break;
end;
end;
end;
end else begin
// C'est la première colonne à être Triée
IndexEGF := -1;
for iegf := Low(TEnumGridField) to High(TEnumGridField) do begin
if Column.FieldName = GRID_FIELD_NAME[iegf] then begin
IndexEGF := Ord(iegf);
Break;
end;
end;
end;
MDSSearchSejour.IndexDefs.Clear();
// Est-ce bien une Colonne Triable
if IndexEGF >= Ord(Low(TEnumGridField)) then begin
iegf := TEnumGridField(IndexEGF);
// Changement du Tri selon le Statut en Cours
case GRID_FIELD_TRI[iegf] of
ettNone, ettDescending : begin
GRID_FIELD_TRI[iegf] := ettAscending;
Column.Title.Caption := GRID_FIELD_LIB[iegf] + ' ^ ';
DrawDBGridArrowSort(DBGridSearchSejour, Column, ettAscending);
IndexName := 'ASC_' + GRID_FIELD_NAME[iegf];
// MDSSearchSejour.IndexDefs.Add(IndexName, GRID_FIELD_NAME[iegf], [ixCaseInsensitive]);
MDSSearchSejour.AddIndex(IndexName, GRID_FIELD_NAME[iegf], [ixCaseInsensitive]);
end;
ettAscending : begin
GRID_FIELD_TRI[iegf] := ettDescending;
Column.Title.Caption := GRID_FIELD_LIB[iegf] + ' v ';
DrawDBGridArrowSort(DBGridSearchSejour, Column, ettDescending);
IndexName := 'DESC_' + GRID_FIELD_NAME[iegf];
// MDSSearchSejour.IndexDefs.Add(IndexName, GRID_FIELD_NAME[iegf], [ixDescending, ixCaseInsensitive]);
MDSSearchSejour.AddIndex(IndexName, GRID_FIELD_NAME[iegf], [ixDescending, ixCaseInsensitive]);
end;
end;
end;
MDSSearchSejour.IndexDefs.Update();
MDSSearchSejour.IndexName := IndexName;
// MDSSearchSejour.IndexFieldNames := GRID_FIELD_NAME[TEnumGridField(IndexEGF)];
end;
//------------------------------------------------------------------------------
procedure TFrmEasySearchSejourModule.DrawDBGridArrowSort(const DBGrid: TDBGrid; const Column: TColumn; const Direction: TEnumTypeTri);
// Fonction Interne
function Min(A,B: Integer): Integer;
begin
if A < B then
Result := A
else
Result := B;
end;
var
X, Y: Integer;
ic: Integer;
TmpBitMap: TBitMap;
TextWidth, FinalWidth, FinalHeight: Integer;
FlagVisible: Boolean;
begin
// Exit;
FlagVisible := False;
FinalWidth := ImageListGrid.Width;
FinalHeight := ImageListGrid.Height;
X := 0;
for ic := 0 to DBGrid.Columns.Count - 1 do begin
if DBGrid.Columns.Items[ic].ID = Column.ID then begin
TmpBitMap:= TBitMap.Create();
try
TmpBitMap.Width := Screen.Width;
TmpBitMap.Canvas.Font := DBGrid.Columns.Items[ic].Title.Font;
TextWidth := TmpBitMap.Canvas.TextWidth(Trim(DBGrid.Columns.Items[ic].Title.Caption));
FinalWidth := Min(ImageListGrid.Width, DBGrid.Columns.Items[ic].Width - TextWidth + TmpBitMap.Canvas.TextWidth(' ')); // - '12' + '1234' Espace
FinalHeight := Min(ImageListGrid.Height, FArrow.Parent.Height);
FlagVisible := True;
Inc(X, TextWidth + TmpBitMap.Canvas.TextWidth(' '));
if DBGrid.Ctl3D then begin
Dec(X, 1);
end;
Break;
finally
TmpBitMap.Free();
end;
end else begin
Inc(X, DBGrid.Columns.Items[ic].Width);
if dgColLines in DBGrid.Options then begin
Inc(X, 1);
end;
end;
end;
Y := 0;
if DBGrid.BorderStyle = bsSingle then begin
Inc(Y, 1);
end;
if DBGrid.Ctl3D then begin
Inc(Y, 1);
end;
case Direction of
ettNone : begin
FArrow.Visible := False;
end;
ettAscending : begin
FArrow.Clear();
ImageListGrid.Draw(FArrow.Canvas, 0, 0, 0);
FArrow.Left := X;
FArrow.Top := Y;
FArrow.Width := FinalWidth;
FArrow.Height := FinalHeight;
FArrow.Visible := FlagVisible;
if FArrow.Visible then FArrow.BringToFront();
end;
ettDescending : begin
FArrow.Clear();
ImageListGrid.Draw(FArrow.Canvas, 0, 0, 1);
FArrow.Left := X;
FArrow.Top := Y;
FArrow.Width := FinalWidth;
FArrow.Width := FinalHeight;
FArrow.Visible := FlagVisible;
if FArrow.Visible then FArrow.BringToFront();
end;
end;
end; |
Partager