begin process at 2012 02 09 02:37:32
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Composants

 > LISTVIEW TRIÉE QUAND ON CLIQUE SUR L'ENTÊTE, COULEUR DIFFÉRENTE UNE LIGNE/COLONNE SUR DEUX

LISTVIEW TRIÉE QUAND ON CLIQUE SUR L'ENTÊTE, COULEUR DIFFÉRENTE UNE LIGNE/COLONNE SUR DEUX


 Information sur la source

Note :
Aucune note
Catégorie :Composants Classé sous :ListView, AdvancedListView, Color ListView Niveau :Initié Date de création :14/01/2008 Date de mise à jour :16/01/2008 14:50:10 Vu / téléchargé :5 262 / 428

Auteur : bubulemaster

Ecrire un message privé
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 Description

AdvancedListView est hérité de TListViex mais ajoute le trie lorsqu'on clique sur l'entête de colonne.
De plus, on a le choix des couleurs, une ligne ou colonne sur deux.
Posssibilité d'afficher une flèche (ou n'importe quelle image) dans l'entête ainsi qu'une image de fond.
J'ai ajouté aussi 2 méthodes OnClickColumnBeforeSort et OnClickColumnAfterSort

Source

  • {*******************************************************************************
  • * TAdvancedListView
  • * Component of WinEssential project (http://php4php.free.fr/winessential/)
  • *
  • * This program is free software; you can redistribute it and/or modify it under
  • * the terms of the GNU General Public License as published by the Free Software
  • * Foundation; either version 2 of the License, or (at your option) any later
  • * version.
  • *
  • * This program is distributed in the hope that it will be useful, but WITHOUT
  • * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  • * FOR A PARTICULAR PURPOSE.See the GNU General Public License for more details.
  • *
  • * You should have received a copy of the GNU General Public License along with
  • * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  • * Place, Suite 330, Boston, MA 02111-1307 USA
  • *
  • * See http://www.delphidabbler.com/articles?article=16 for more detail
  • *
  • *******************************************************************************
  • * Version 1.1 by MARTINEAU Emeric (php4php.free.fr) - 16/01/2008
  • * - support de l'alignement du texte dans les colonnes,
  • * - ajout de la methode OnColumnClickBeforeSort et OnColumnClickAfterSort,
  • * - concatenation de ColumColor et LineColor en ColorXXXX,
  • * - coloration du texte suivant la ligne/colonne,
  • * - ajout image de le header,
  • *
  • * Version 1.0 by MARTINEAU Emeric (php4php.free.fr) - 14/01/2008
  • ******************************************************************************}
  • unit AdvancedListView;
  • interface
  • uses
  • Windows, Messages, SysUtils, Classes, Controls, ComCtrls, Graphics, CommCtrl,
  • ExtCtrls, Registry ;
  • const
  • cShade = $F7F7F7;
  • { for display arrow }
  • HDF_SORTUP = $0400;
  • HDF_SORTDOWN = $0200;
  • type
  • { DLLVERSIONINFO structure }
  • PDLLVerInfo = ^TDLLVersionInfo ;
  • TDLLVersionInfo=Record
  • cbSize, { Size of the structure, in bytes. }
  • dwMajorVersion, { Major version of the DLL }
  • dwMinorVersion, { Minor version of the DLL }
  • dwBuildNumber, { Build number of the DLL }
  • dwPlatformID: DWord; { Identifies the platform for which the DLL was built }
  • end;
  • TCustomType = (ctNone, ctColum, ctLine, ctFixedImageBackGround, ctRepeatImageBackGround) ;
  • TArrowDisplayPosition = (adRight, adLeft) ;
  • TLVColumnClickAfterSortEvent = procedure(Sender: TObject; Column: TListColumn; var CanSort : Boolean; var ChangeHeaderImage : Boolean) of object;
  • TAdvancedListView = class(TListView)
  • private
  • { Déclarations privées }
  • protected
  • { Déclarations protégées }
  • { color of impair line }
  • FColor1 : TColor ;
  • { color of pair line }
  • FColor2 : TColor ;
  • { color of text impair line }
  • FTextColor1 : TColor ;
  • { color of text pair line }
  • FTextColor2 : TColor ;
  • { type of advanced }
  • FCustom : TCustomType ;
  • { Numéro de la colone dernièrement cliquée }
  • Colonne : Integer ;
  • { Odre croissant }
  • OrdreCroissant : Boolean ;
  • { Indique si on trie automatiquement lorsqu'on clique sur l'entête }
  • FASOHC : Boolean ;
  • { Image de fond }
  • FBackGroundImage : TImage ;
  • { Offset X of picture }
  • FPictureOffsetX : Integer ;
  • { Offset Y of picture }
  • FPictureOffsetY : Integer ;
  • { Display arrow ? }
  • FDisplayArrow : boolean ;
  • { position of arrow }
  • FDisplayArrowPosition : TArrowDisplayPosition ;
  • { Déclarations publiques }
  • { Rectangle de l'image de la flèche 16x16}
  • Rectangle : TRect ;
  • { Flèche par défaut vers le bas }
  • BitmapArrowDown : TBitmap ;
  • { Flèche par défaut vers le haut }
  • BitmapArrowUp : TBitmap ;
  • { Fleche haute utilisateur }
  • FImageArrowDown : TBitmap ;
  • { Fleche basse utilisateur }
  • FImageArrowUp : TBitmap ;
  • { Colonne par défaut de trié }
  • FDefaultSortColumn : Integer ;
  • FOnColumnClickBeforeSort : TLVColumnClickAfterSortEvent;
  • FOnColumnClickAfterSort : TLVColumnClickEvent ;
  • procedure AdvancedListViewCustomDrawItem(Sender: TCustomListView;
  • Item: TListItem; State: TCustomDrawState;
  • var DefaultDraw: Boolean);
  • procedure AdvancedListViewCustomDrawSubItem(Sender: TCustomListView;
  • Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  • var DefaultDraw: Boolean);
  • procedure AdvancedListViewColumnClick(Sender: TObject;
  • Column: TListColumn);
  • procedure SetColor1(couleur : TColor) ;
  • procedure SetColor2(couleur : TColor) ;
  • procedure SetCustomStyle(Style : TCustomType) ;
  • procedure SetASOHC(status : boolean) ;
  • procedure SetTextColor1(couleur : TColor) ;
  • procedure SetTextColor2(couleur : TColor) ;
  • procedure WndProc(var Message: TMessage); override;
  • procedure ListViewBackGroundImage;
  • procedure ListViewBackGroundImageClear;
  • procedure WMLButtonDown(var msg: TWMLButtonDown); message WM_LBUTTONDOWN;
  • procedure WMRButtonDown(var msg: TWMRButtonDown); message WM_RBUTTONDOWN;
  • procedure SetImageWindowStyle(Index: Integer);
  • procedure RemoveImage(Index: Integer);
  • procedure SetColumnImage(Colonne: Integer; Down: Boolean);
  • procedure SetDisplayArrowPosition(Position : TArrowDisplayPosition) ;
  • procedure SetDisplayArrow(Display : boolean) ;
  • function CheckCommonControlVersion6OrAbove : boolean ;
  • procedure SetImageWindowWithoutStyle(Index: Integer);
  • procedure DrawArrowDown ;
  • procedure DrawArrowUp ;
  • procedure SetBitmapUserArrowDown(value:TBitmap);
  • procedure SetBitmapUserArrowUp(value:TBitmap);
  • procedure SetDefaultSortColumn(index:Integer) ;
  • public
  • constructor Create(Owner:TComponent); override;
  • destructor Destroy; override;
  • published
  • { Déclarations publiées }
  • published
  • property Action;
  • property Align;
  • property AllocBy;
  • property Anchors;
  • property BevelEdges;
  • property BevelInner;
  • property BevelOuter;
  • property BevelKind default bkNone;
  • property BevelWidth;
  • property BiDiMode;
  • property BorderStyle;
  • property BorderWidth;
  • property Checkboxes;
  • property Color;
  • property Columns;
  • property ColumnClick;
  • property Constraints;
  • property Ctl3D;
  • property DragCursor;
  • property DragKind;
  • property DragMode;
  • property Enabled;
  • property Font;
  • property FlatScrollBars;
  • property FullDrag;
  • property GridLines;
  • property HideSelection;
  • property HotTrack;
  • property HotTrackStyles;
  • property HoverTime;
  • property IconOptions;
  • property Items;
  • property LargeImages;
  • property MultiSelect;
  • property OwnerData;
  • property OwnerDraw;
  • property ReadOnly default False;
  • property RowSelect;
  • property ParentBiDiMode;
  • property ParentColor default False;
  • property ParentFont;
  • property ParentShowHint;
  • property PopupMenu;
  • property ShowColumnHeaders;
  • property ShowWorkAreas;
  • property ShowHint;
  • property SmallImages;
  • property SortType;
  • property StateImages;
  • property TabOrder;
  • property TabStop default True;
  • property ViewStyle;
  • property Visible;
  • property OnAdvancedCustomDraw;
  • property OnAdvancedCustomDrawItem;
  • property OnAdvancedCustomDrawSubItem;
  • property OnChange;
  • property OnChanging;
  • property OnClick;
  • property OnColumnClick;
  • property OnColumnDragged;
  • property OnColumnRightClick;
  • property OnCompare;
  • property OnContextPopup;
  • property OnCustomDraw;
  • property OnCustomDrawItem;
  • property OnCustomDrawSubItem;
  • property OnData;
  • property OnDataFind;
  • property OnDataHint;
  • property OnDataStateChange;
  • property OnDblClick;
  • property OnDeletion;
  • property OnDrawItem;
  • property OnEdited;
  • property OnEditing;
  • property OnEndDock;
  • property OnEndDrag;
  • property OnEnter;
  • property OnExit;
  • property OnGetImageIndex;
  • property OnGetSubItemImage;
  • property OnDragDrop;
  • property OnDragOver;
  • property OnInfoTip;
  • property OnInsert;
  • property OnKeyDown;
  • property OnKeyPress;
  • property OnKeyUp;
  • property OnMouseDown;
  • property OnMouseMove;
  • property OnMouseUp;
  • property OnResize;
  • property OnSelectItem;
  • property OnStartDock;
  • property OnStartDrag;
  • { AdvancedListView property }
  • property ColorImpair : TColor read FColor1 write SetColor1 default clWindow ;
  • property ColorPair : TColor read FColor2 write SetColor2 default cShade ;
  • property CustomStyle : TCustomType read FCustom write SetCustomStyle default ctLine ;
  • property AutoSortOnHeaderClick : Boolean read FASOHC write SetASOHC default true ;
  • property TextColorImpair : TColor read FTextColor1 write SetTextColor1 default clWindowText ;
  • property TextColorPair : TColor read FTextColor2 write SetTextColor2 default clWindowText ;
  • property BackgroundPicture : TImage read FBackGroundImage write FBackGroundImage ;
  • property PictureOffsetX : Integer read FPictureOffsetX write FPictureOffsetX ;
  • property PictureOffsetY : Integer read FPictureOffsetY write FPictureOffsetY ;
  • property DisplayArrow : boolean read FDisplayArrow write SetDisplayArrow default true ;
  • property DisplayArrowPosition : TArrowDisplayPosition read FDisplayArrowPosition write SetDisplayArrowPosition default adRight ;
  • property UserArrowUp : TBitmap read FImageArrowUp write SetBitmapUserArrowUp ;
  • property UserArrowDown : TBitmap read FImageArrowDown write SetBitmapUserArrowDown ;
  • property DefaultSortColumn : Integer read FDefaultSortColumn write SetDefaultSortColumn default 0 ;
  • property OnColumnClickBeforeSort : TLVColumnClickAfterSortEvent read FOnColumnClickBeforeSort write FOnColumnClickBeforeSort ;
  • property OnColumnClickAfterSort : TLVColumnClickEvent read FOnColumnClickAfterSort write FOnColumnClickAfterSort ;
  • end;
  • procedure Register;
  • implementation
  • {*******************************************************************************
  • * Constructeur
  • ******************************************************************************}
  • constructor TAdvancedListView.Create(Owner:TComponent);
  • begin
  • inherited ;
  • Self.OnCustomDrawItem := AdvancedListViewCustomDrawItem ;
  • Self.OnCustomDrawSubItem := AdvancedListViewCustomDrawSubItem ;
  • Self.OnColumnClick := AdvancedListViewColumnClick ;
  • Self.ViewStyle := vsReport ;
  • FColor1 := clWindow ;
  • FColor2 := cShade ;
  • FCustom := ctLine ;
  • Colonne := - 1;
  • OrdreCroissant := True ;
  • FASOHC := True ;
  • FBackGroundImage := TImage.Create(Self) ;
  • FDisplayArrow := True ;
  • FDisplayArrowPosition := adRight ;
  • Rectangle.Left := 0 ;
  • Rectangle.Top := 0 ;
  • Rectangle.Right := 16 ;
  • Rectangle.Bottom := 16 ;
  • FImageArrowDown := TBitmap.Create ;
  • FImageArrowUp := TBitmap.Create ;
  • DrawArrowDown ;
  • DrawArrowUp ;
  • DefaultSortColumn := 0 ;
  • end ;
  • {*******************************************************************************
  • * Destructeur
  • ******************************************************************************}
  • destructor TAdvancedListView.Destroy;
  • begin
  • FBackGroundImage.free;
  • FImageArrowDown.Free ;
  • FImageArrowUp.Free ;
  • if Assigned(BitmapArrowDown)
  • then
  • BitmapArrowDown.Free ;
  • if Assigned(BitmapArrowUp)
  • then
  • BitmapArrowUp.Free ;
  • inherited;
  • end;
  • {*******************************************************************************
  • * Affecte la couleur 1 et redessine le composant
  • ******************************************************************************}
  • procedure TAdvancedListView.SetColor1(couleur : TColor) ;
  • begin
  • FColor1 := Couleur ;
  • Refresh ;
  • end ;
  • {*******************************************************************************
  • * Affecte la couleur 2 et redessine le composant
  • ******************************************************************************}
  • procedure TAdvancedListView.SetColor2(couleur : TColor) ;
  • begin
  • FColor2 := Couleur ;
  • Refresh ;
  • end ;
  • {*******************************************************************************
  • * Configure le style de composant et redessine le composant
  • ******************************************************************************}
  • procedure TAdvancedListView.SetCustomStyle(Style : TCustomType) ;
  • begin
  • FCustom := Style ;
  • if ((Style = ctFixedImageBackGround) or (Style = ctRepeatImageBackGround)) and Assigned(Self.Parent) and (not FBackGroundImage.Picture.Bitmap.Empty)
  • then begin
  • if CheckCommonControlVersion6OrAbove
  • then ListViewBackGroundImage
  • end
  • else begin
  • if CheckCommonControlVersion6OrAbove
  • then ListViewBackGroundImageClear ;
  • end ;
  • Refresh ;
  • end ;
  • {*******************************************************************************
  • * Indique si la liste est auto-trié
  • ******************************************************************************}
  • procedure TAdvancedListView.SetASOHC(status : boolean) ;
  • begin
  • FASOHC := Status ;
  • if Status = True
  • then
  • Self.OnColumnClick := AdvancedListViewColumnClick
  • else
  • Self.OnColumnClick := nil ;
  • end ;
  • {*******************************************************************************
  • * Affecte couleur 1 du text
  • ******************************************************************************}
  • procedure TAdvancedListView.SetTextColor1(couleur : TColor) ;
  • begin
  • FTextColor1 := Couleur ;
  • Refresh ;
  • end ;
  • {*******************************************************************************
  • * Affecte couleur 1 du text
  • ******************************************************************************}
  • procedure TAdvancedListView.SetTextColor2(couleur : TColor) ;
  • begin
  • FTextColor2 := Couleur ;
  • Refresh ;
  • end ;
  • {*******************************************************************************
  • * Dessine un élément de la liste (première colone)
  • ******************************************************************************}
  • procedure TAdvancedListView.AdvancedListViewCustomDrawItem(Sender: TCustomListView;
  • Item: TListItem; State: TCustomDrawState;
  • var DefaultDraw: Boolean);
  • begin
  • if FCustom = ctLine
  • then begin
  • if Odd(Item.Index)
  • then begin
  • TAdvancedListView(Sender).Canvas.Brush.Color := FColor2 ;
  • TAdvancedListView(Sender).Canvas.Font.Color := FTextColor2 ;
  • end
  • else begin
  • TAdvancedListView(Sender).Canvas.Brush.Color := FColor1 ;
  • TAdvancedListView(Sender).Canvas.Font.Color := FTextColor1 ;
  • end ;
  • end
  • else if FCustom = ctColum
  • then begin
  • TAdvancedListView(Sender).Canvas.Brush.Color := FColor1 ;
  • end ;
  • end;
  • {*******************************************************************************
  • * Dessine un sous-élément colone 1 à N
  • ******************************************************************************}
  • procedure TAdvancedListView.AdvancedListViewCustomDrawSubItem(Sender: TCustomListView;
  • Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  • var DefaultDraw: Boolean);
  • begin
  • { Pour delphi 4 }
  • if SubItem >= 1
  • then begin
  • if FCustom = ctColum
  • then begin
  • if Odd(SubItem)
  • then begin
  • TAdvancedListView(Sender).Canvas.Brush.Color := FColor2 ;
  • TAdvancedListView(Sender).Canvas.Font.Color := FTextColor2 ;
  • end
  • else begin
  • TAdvancedListView(Sender).Canvas.Brush.Color := FColor1 ;
  • TAdvancedListView(Sender).Canvas.Font.Color := FTextColor1 ;
  • end ;
  • end ;
  • end ;
  • end;
  • {*******************************************************************************
  • * Appelé lorsqu'on clique sur une entête de colone
  • ******************************************************************************}
  • procedure TAdvancedListView.AdvancedListViewColumnClick(Sender: TObject;
  • Column: TListColumn);
  • var i, j, NumSubItem : Integer ;
  • temp : TListItems ;
  • ListItem: TListItem;
  • NewListView : TListView ;
  • Found : Boolean ;
  • Condition : Boolean ;
  • CanSort : Boolean ;
  • ChangeHeaderImage : Boolean ;
  • { Recopie tous les sous-items et leurs propriétés }
  • procedure CopieSubItem(Sender : TListView; ListItem: TListItem; i : Integer) ;
  • Var k : Integer ;
  • begin
  • { Copie les sous items }
  • For k := 0 to Sender.Items.Item[i].SubItems.Count - 1 do
  • begin
  • with Sender.Items.Item[i] do
  • begin
  • { Copie tout les élements de configurations }
  • ListItem.SubItems.Add(SubItems[k]);
  • ListItem.Cut := Cut ;
  • ListItem.Data := Data ;
  • ListItem.DropTarget := DropTarget ;
  • ListItem.Focused := Focused ;
  • ListItem.Indent := Indent ;
  • ListItem.Left := Left ;
  • ListItem.OverlayIndex := OverlayIndex ;
  • ListItem.Selected := Selected ;
  • ListItem.StateIndex := StateIndex ;
  • ListItem.Top := Top ;
  • end ;
  • end ;
  • end ;
  • begin
  • CanSort := True ;
  • ChangeHeaderImage := True ;
  • if Assigned(FOnColumnClickBeforeSort)
  • then
  • FOnColumnClickBeforeSort(Sender, Column, CanSort, ChangeHeaderImage) ;
  • if not CanSort
  • then
  • exit ;
  • Condition := False ;
  • { Si on clique sur la même colone, on inverse l'ordre }
  • if Colonne = Column.ID
  • then
  • OrdreCroissant := not OrdreCroissant
  • else
  • OrdreCroissant := True ;
  • { Mémorise la colone }
  • //Colonne := Column.ID - 6 ;
  • Colonne := Column.ID ;
  • { Affiche la flèche de trie }
  • if FDisplayArrow and ChangeHeaderImage
  • then
  • SetColumnImage(Colonne, OrdreCroissant) ;
  • { Créer une liste view }
  • NewListView := TListView.Create(Self) ;
  • NewListView.Visible := False ;
  • { L'affecte à la feuille courante }
  • NewListView.Parent := Self;
  • { On mémorise s'il y a les case à cocher car lors de la recopie elles
  • apparaissent sans qu'on leur demande quelque chose }
  • NewListView.Checkboxes := (Sender as TListView).Checkboxes ;
  • { Créer une liste }
  • temp := TListItems.Create(NewListView) ;
  • {** On trie la première colone **}
  • if Column.ID = 0
  • then begin
  • { Pour chaque élement de la liste qu'on doit trier }
  • For i := 0 to (Sender as TListView).Items.Count - 1 do
  • begin
  • { Indique qu'on n'a pas trouver de position pour l'occurence en
  • cours }
  • Found := False ;
  • { On la trie par rapport à la nouvelle liste }
  • For j := 0 to temp.Count -1 do
  • begin
  • {** Si l'élément se situe avant **}
  • { Ci-dessous la condition quand on est en ordre croissant }
  • Condition := (Sender as TListView).Items.Item[i].Caption < temp.Item[j].Caption ;
  • { Si on veut l'ordre décroissant, on inverse la condition }
  • if OrdreCroissant = False
  • then
  • Condition := not Condition ;
  • if Condition
  • then begin
  • { Copie l'item principale }
  • ListItem := temp.Insert(j) ;
  • ListItem.Caption := (Sender as TListView).Items.Item[i].Caption ;
  • CopieSubItem((Sender as TListView), ListItem, i) ;
  • Found := True ;
  • { On sort de la boucle pour ne pas répéter l'élément }
  • Break ;
  • end ;
  • end ;
  • if Found = False
  • { Sinon on le copie après }
  • then begin
  • { Copie l'item principale }
  • ListItem := temp.Add ;
  • ListItem.Caption := (Sender as TListView).Items.Item[i].Caption ;
  • CopieSubItem((Sender as TListView), ListItem, i) ;
  • end ;
  • end ;
  • end
  • else begin
  • { Mémorise la colone dans une variable évitant ainsi de recalculer a
  • chaque fois et gagnant donc du temps en exécution }
  • //NumSubItem := Column.ID - 6 ;
  • { -1 car c'est les sous-item or le premier item est 0 alors que son
  • numéro Column est 1 }
  • NumSubItem := Column.ID - 1 ;
  • { Pour chaque élement de la liste qu'on doit trier }
  • For i := 0 to (Sender as TListView).Items.Count - 1 do
  • begin
  • { Indique qu'on n'a pas trouver de position pour l'occurence en
  • cours }
  • Found := False ;
  • { On la trie par rapport à la nouvelle liste }
  • For j := 0 to temp.Count -1 do
  • begin
  • if (NumSubItem < temp.Item[j].SubItems.Count) and ((Sender as TListView).Items.Item[i].SubItems.Count > NumSubItem)
  • then
  • Condition := (Sender as TListView).Items.Item[i].SubItems.Strings[NumSubItem] < temp.Item[j].SubItems.Strings[NumSubItem] ;
  • { Si on veut l'ordre décroissant, on inverse la condition }
  • if OrdreCroissant = False
  • then
  • Condition := not Condition ;
  • if Condition
  • then begin
  • { Copie l'item principale }
  • ListItem := temp.Insert(j) ;
  • ListItem.Caption := (Sender as TListView).Items.Item[i].Caption ;
  • CopieSubItem((Sender as TListView), ListItem, i) ;
  • Found := True ;
  • { On sort de la boucle pour ne pas répéter l'élément }
  • Break ;
  • end ;
  • end ;
  • if Found = False
  • { Sinon on le copie après }
  • then begin
  • { Copie l'item principale }
  • ListItem := temp.Add ;
  • ListItem.Caption := (Sender as TListView).Items.Item[i].Caption ;
  • CopieSubItem((Sender as TListView), ListItem, i) ;
  • end ;
  • end ;
  • end ;
  • (Sender as TListView).Items.BeginUpdate ;
  • (Sender as TListView).Items := NewListView.Items ;
  • (Sender as TListView).Checkboxes := NewListView.Checkboxes ;
  • (Sender as TListView).Items.EndUpdate ;
  • if Assigned(FOnColumnClickAfterSort)
  • then
  • FOnColumnClickAfterSort(Sender, Column) ;
  • end;
  • {*******************************************************************************
  • * Procedure pour gérer l'image de fond
  • ******************************************************************************}
  • procedure TAdvancedListView.WndProc(var Message: TMessage);
  • begin
  • if Message.Msg = WM_ERASEBKGND then
  • DefaultHandler(Message)
  • else
  • inherited WndProc(Message);
  • end;
  • {*******************************************************************************
  • * Affecte une image en fond
  • ******************************************************************************}
  • procedure TAdvancedListView.ListViewBackGroundImage;
  • var
  • LVBKImage : TLVBKIMAGE;
  • begin
  • FillChar(LVBKImage, SizeOf(LVBKImage), 0);
  • if FCustom = ctRepeatImageBackGround
  • then
  • LVBKImage.ulFlags := LVBKIF_SOURCE_HBITMAP or LVBKIF_STYLE_TILE
  • else
  • LVBKImage.ulFlags := LVBKIF_SOURCE_HBITMAP ;
  • LVBKImage.pszImage := nil ;
  • LVBKImage.hbm := FBackGroundImage.Picture.Bitmap.Handle ;
  • LVBKImage.xOffsetPercent := FPictureOffsetX;
  • LVBKImage.yOffsetPercent := FPictureOffsetX;
  • ListView_SetBkImage(Handle, @LVBKImage);
  • ListView_SetBKColor(Handle, CLR_NONE);
  • end;
  • {*******************************************************************************
  • * Efface l'image en fond
  • ******************************************************************************}
  • procedure TAdvancedListView.ListViewBackGroundImageClear;
  • var
  • LVBKImage : TLVBKIMAGE;
  • begin
  • FillChar(LVBKImage, SizeOf(LVBKImage), 0);
  • LVBKImage.ulFlags := LVBKIF_SOURCE_NONE ;
  • ListView_SetBkImage(Handle, @LVBKImage);
  • end;
  • { A cause d'un bug d'affichage, on est obligé de redessiner le composant }
  • procedure TAdvancedListView.WMLButtonDown(var msg: TWMLButtonDown);
  • begin
  • inherited;
  • repaint;
  • end;
  • { A cause d'un bug d'affichage, on est obligé de redessiner le composant }
  • procedure TAdvancedListView.WMRButtonDown(var msg: TWMRButtonDown);
  • begin
  • inherited;
  • repaint;
  • end;
  • {*******************************************************************************
  • * Supprime l'image de trie
  • ******************************************************************************}
  • procedure TAdvancedListView.RemoveImage(Index: Integer);
  • var Header : THandle;
  • HDItem : THDItem;
  • begin
  • { Get the ListView Header Handle }
  • Header := ListView_GetHeader(Self.Handle);
  • FillChar(HDItem, SizeOf(HDItem), 0);
  • HDItem.Mask := HDI_BITMAP or HDI_IMAGE or HDI_FORMAT;
  • { current status secure }
  • Header_GetItem(Header, Index, HDItem);
  • { delete arrow }
  • HDItem.fmt := HDItem.fmt and not HDF_SORTUP and not HDF_SORTDOWN
  • and not HDF_BITMAP_ON_RIGHT and not HDF_IMAGE and not HDF_BITMAP ;
  • if not CheckCommonControlVersion6OrAbove
  • then
  • DeleteObject(HDItem.hbm);
  • { New header }
  • Header_SetItem(Header, Index, HDItem);
  • end;
  • {*******************************************************************************
  • * Ajoute l'image de trie sous Windows XP et après avec le style
  • ******************************************************************************}
  • procedure TAdvancedListView.SetImageWindowStyle(Index: Integer);
  • var Header: THandle;
  • HDItem: THDItem;
  • begin
  • { Get the ListView Header Handle }
  • Header := ListView_GetHeader(Handle);
  • FillChar(HDItem, SizeOf(HDItem), 0);
  • HDItem.Mask := HDI_BITMAP or HDI_IMAGE or HDI_FORMAT;
  • Header_GetItem(Header, Index, HDItem);
  • { clear direction of arrow }
  • HDItem.fmt := HDItem.fmt and not HDF_SORTUP and not HDF_SORTDOWN and not HDF_IMAGE ;
  • case Columns[Index].Alignment of
  • taLeftJustify: Hditem.fmt := Hditem.fmt or HDF_LEFT;
  • taCenter: Hditem.fmt := Hditem.fmt or HDF_CENTER;
  • taRightJustify: Hditem.fmt := Hditem.fmt or HDF_RIGHT;
  • else
  • Hditem.fmt := Hditem.fmt or HDF_LEFT;
  • end;
  • if OrdreCroissant = true
  • then begin
  • HDItem.fmt := HDItem.fmt or HDF_SORTUP ;
  • end
  • else begin
  • HDItem.fmt := HDItem.fmt or HDF_SORTDOWN;
  • end ;
  • { Display arrow to left or right ? }
  • if FDisplayArrowPosition = adRight
  • then
  • HDItem.fmt := HDItem.fmt or HDF_BITMAP_ON_RIGHT
  • else
  • HDItem.fmt := HDItem.fmt and (not HDF_BITMAP_ON_RIGHT) ;
  • { New header }
  • Header_SetItem(Header, Index, HDItem);
  • end;
  • {*******************************************************************************
  • * Ajoute l'image de trie
  • ******************************************************************************}
  • procedure TAdvancedListView.SetImageWindowWithoutStyle(Index: Integer);
  • var Header: THandle;
  • HDItem: THDItem;
  • begin
  • { Get the ListView Header Handle }
  • Header := ListView_GetHeader(Handle);
  • FillChar(HDItem, SizeOf(HDItem), 0);
  • HDItem.Mask := HDI_FORMAT;
  • Header_GetItem(Header, Index, HDItem);
  • Hditem.Mask := Hditem.Mask or HDI_FORMAT or HDI_BITMAP ;
  • { clear direction of arrow }
  • HDItem.fmt := HDItem.fmt or HDF_BITMAP and not HDF_SORTUP and not HDF_SORTDOWN ;
  • case Columns[Index].Alignment of
  • taLeftJustify: Hditem.fmt := Hditem.fmt or HDF_LEFT;
  • taCenter: Hditem.fmt := Hditem.fmt or HDF_CENTER;
  • taRightJustify: Hditem.fmt := Hditem.fmt or HDF_RIGHT;
  • else
  • Hditem.fmt := Hditem.fmt or HDF_LEFT;
  • end;
  • if (HDItem.hbm <> 0)
  • then
  • DeleteObject(HDItem.hbm);
  • if OrdreCroissant = true
  • then begin
  • { Windows efface l'image au bout d'un moment }
  • DrawArrowUp ;
  • HDItem.hbm := BitmapArrowUp.Handle ;
  • end
  • else begin
  • DrawArrowDown ;
  • HDItem.hbm := BitmapArrowDown.Handle ;
  • end ;
  • { Display arrow to left or right ? }
  • if FDisplayArrowPosition = adRight
  • then
  • HDItem.fmt := HDItem.fmt or HDF_BITMAP_ON_RIGHT
  • else
  • HDItem.fmt := HDItem.fmt and (not HDF_BITMAP_ON_RIGHT) ;
  • { New header }
  • Header_SetItem(Header, Index, HDItem);
  • end;
  • {*******************************************************************************
  • * Ajoute l'image de trie à une colonne et efface celle des autres
  • ******************************************************************************}
  • procedure TAdvancedListView.SetColumnImage(Colonne: Integer; Down: Boolean);
  • var i : Integer;
  • begin
  • if (Colonne > - 1) and (Colonne < Self.Columns.Count)
  • then begin
  • { remove icons }
  • for i := 0 to Self.Columns.Count - 1 do
  • begin
  • RemoveImage(i) ;
  • end ;
  • if CheckCommonControlVersion6OrAbove and FImageArrowDown.Empty and FImageArrowUp.Empty
  • then
  • SetImageWindowStyle(Colonne)
  • else
  • SetImageWindowWithoutStyle(Colonne);
  • end ;
  • end;
  • {*******************************************************************************
  • * Fonction qui affecte la valeur d'affichage de l'indicateur de trie
  • ******************************************************************************}
  • procedure TAdvancedListView.SetDisplayArrow(Display : boolean) ;
  • begin
  • FDisplayArrow := Display ;
  • if Display = False
  • then
  • SetColumnImage(-1, true)
  • else
  • SetColumnImage(Colonne, OrdreCroissant) ;
  • end ;
  • {*******************************************************************************
  • * Fonction qui affecte la valeur de position d'affichage
  • ******************************************************************************}
  • procedure TAdvancedListView.SetDisplayArrowPosition(Position : TArrowDisplayPosition) ;
  • begin
  • FDisplayArrowPosition := Position ;
  • if FDisplayArrow
  • then
  • SetColumnImage(Colonne, OrdreCroissant) ;
  • end ;
  • {*******************************************************************************
  • * Vérifie qu'il s'agit des CommonControl version 6 ou supérieur
  • ******************************************************************************}
  • function TAdvancedListView.CheckCommonControlVersion6OrAbove ;
  • var HandleDll: THandle;
  • pDllVersionInfo: pDLLVerInfo;
  • DLLVersionInfo: TDLLVersionInfo ;
  • DllGetVersion: function(dvi: PDLLVerInfo): PDLLVerInfo; stdcall;
  • begin
  • Result := False ;
  • HandleDll := LoadLibrary('comctl32.dll') ;
  • if HandleDll <> 0
  • then begin
  • @DllGetVersion := GetProcAddress(HandleDll, 'DllGetVersion') ;
  • if (@DllGetVersion) <> nil
  • then begin
  • new(pDllVersionInfo);
  • try
  • ZeroMemory(pDllVersionInfo, SizeOf(pDllVersionInfo^));
  • pDllVersionInfo^.cbSize := SizeOf(pDllVersionInfo^);
  • DllGetVersion(pDllVersionInfo);
  • DLLVersionInfo.dwMajorVersion := pDllVersionInfo^.dwMajorVersion;
  • DLLVersionInfo.dwMinorVersion := pDllVersionInfo^.dwMinorVersion;
  • if DLLVersionInfo.dwMajorVersion > 5
  • then
  • Result := True ;
  • finally
  • dispose(pDllVersionInfo);
  • end;
  • end ;
  • FreeLibrary(HandleDll) ;
  • end ;
  • end ;
  • {*******************************************************************************
  • * Dessine L'image vers le bas
  • ******************************************************************************}
  • procedure TAdvancedListView.DrawArrowDown ;
  • begin
  • if Assigned(BitmapArrowDown)
  • then
  • BitmapArrowDown.Free ;
  • BitmapArrowDown := TBitmap.Create ;
  • if not FImageArrowDown.Empty
  • then begin
  • BitmapArrowDown.Assign(UserArrowDown);
  • end
  • else begin
  • BitmapArrowDown.Height := 10 ;
  • BitmapArrowDown.Width := 10 ;
  • { Crée un rectangle de couleur du header }
  • BitmapArrowDown.Canvas.Brush.Style := bsSolid ;
  • BitmapArrowDown.Canvas.Brush.Color := clBtnFace ;
  • BitmapArrowDown.Canvas.FillRect(Rectangle);
  • { Créer la flèche vers le bas }
  • { Ligne du dessus }
  • BitmapArrowDown.Canvas.Pen.Color := clBtnShadow ;
  • BitmapArrowDown.Canvas.MoveTo(0, 0) ;
  • BitmapArrowDown.Canvas.LineTo(9, 0) ;
  • { Côté droit }
  • BitmapArrowDown.Canvas.LineTo(5, 9) ;
  • { Côté gauche }
  • BitmapArrowDown.Canvas.Pen.Color := clWindow ;
  • BitmapArrowDown.Canvas.LineTo(0, 0) ;
  • end ;
  • end ;
  • {*******************************************************************************
  • * Dessine L'image vers le haut
  • ******************************************************************************}
  • procedure TAdvancedListView.DrawArrowUp ;
  • begin
  • if Assigned(BitmapArrowUp)
  • then
  • BitmapArrowUp.Free ;
  • BitmapArrowUp := TBitmap.Create ;
  • if not FImageArrowUp.Empty
  • then begin
  • BitmapArrowUp.Assign(UserArrowUp);
  • end
  • else begin
  • BitmapArrowUp.Height := 10 ;
  • BitmapArrowUp.Width := 10 ;
  • { Crée un rectangle de couleur du header }
  • BitmapArrowUp.Canvas.Brush.Style := bsSolid ;
  • BitmapArrowUp.Canvas.Brush.Color := clBtnFace ;
  • BitmapArrowUp.Canvas.FillRect(Rectangle);
  • { Créer la flèche }
  • { Ligne du dessus vers le haut}
  • BitmapArrowUp.Canvas.Pen.Color := clBtnShadow ;
  • BitmapArrowUp.Canvas.MoveTo(0, 9) ;
  • BitmapArrowUp.Canvas.LineTo(9, 9) ;
  • { Côté droit }
  • BitmapArrowUp.Canvas.LineTo(5, 0) ;
  • { Côté gauche }
  • BitmapArrowUp.Canvas.Pen.Color := clWindow ;
  • BitmapArrowUp.Canvas.LineTo(0, 9) ;
  • end ;
  • end ;
  • {*******************************************************************************
  • * Affecte l'image
  • ******************************************************************************}
  • procedure TAdvancedListView.SetBitmapUserArrowUp(value:TBitmap);
  • begin
  • FImageArrowUp.Assign(value) ;
  • if not FImageArrowUp.Empty
  • then
  • FImageArrowUp.Dormant ;
  • if FDisplayArrow
  • then
  • SetColumnImage(Colonne, OrdreCroissant) ;
  • end;
  • {*******************************************************************************
  • * Affecte l'image
  • ******************************************************************************}
  • procedure TAdvancedListView.SetBitmapUserArrowDown(value:TBitmap);
  • begin
  • FImageArrowDown.Assign(value) ;
  • if not FImageArrowDown.Empty
  • then
  • FImageArrowDown.Dormant ;
  • if FDisplayArrow
  • then
  • SetColumnImage(Colonne, OrdreCroissant) ;
  • end;
  • {*******************************************************************************
  • * Affecte la colonne de trie par défault
  • ******************************************************************************}
  • procedure TAdvancedListView.SetDefaultSortColumn(index:Integer) ;
  • begin
  • FDefaultSortColumn := Index ;
  • if (Index > -1) and (Index < Self.Columns.Count)
  • then
  • AdvancedListViewColumnClick(Self, Self.Column[Index]);
  • end ;
  • procedure Register;
  • begin
  • RegisterComponents('WinEssential', [TAdvancedListView]);
  • end;
  • end.
{*******************************************************************************
 * TAdvancedListView
 * Component of WinEssential project (http://php4php.free.fr/winessential/)
 *
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option) any later
 * version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330, Boston, MA 02111-1307 USA
 *
 * See http://www.delphidabbler.com/articles?article=16 for more detail
 *
 *******************************************************************************
 * Version 1.1 by MARTINEAU Emeric (php4php.free.fr) - 16/01/2008
 *  - support de l'alignement du texte dans les colonnes,
 *  - ajout de la methode OnColumnClickBeforeSort et OnColumnClickAfterSort,
 *  - concatenation de ColumColor et LineColor en ColorXXXX,
 *  - coloration du texte suivant la ligne/colonne,
 *  - ajout image de le header,
 *
 * Version 1.0 by MARTINEAU Emeric (php4php.free.fr) - 14/01/2008
 ******************************************************************************}
unit AdvancedListView;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, ComCtrls, Graphics, CommCtrl,
  ExtCtrls, Registry ;

const
  cShade = $F7F7F7;
  { for display arrow }
  HDF_SORTUP = $0400;
  HDF_SORTDOWN = $0200;

type
  { DLLVERSIONINFO structure }
  PDLLVerInfo = ^TDLLVersionInfo ;
  TDLLVersionInfo=Record
    cbSize,               { Size of the structure, in bytes. }
    dwMajorVersion,       { Major version of the DLL }
    dwMinorVersion,       { Minor version of the DLL }
    dwBuildNumber,        { Build number of the DLL }
    dwPlatformID: DWord;  { Identifies the platform for which the DLL was built }
  end;

  TCustomType = (ctNone, ctColum, ctLine, ctFixedImageBackGround, ctRepeatImageBackGround) ;
  TArrowDisplayPosition = (adRight, adLeft) ;

  TLVColumnClickAfterSortEvent = procedure(Sender: TObject; Column: TListColumn; var CanSort : Boolean; var ChangeHeaderImage : Boolean) of object;

  TAdvancedListView = class(TListView)
  private
    { Déclarations privées }
  protected
    { Déclarations protégées }
    { color of impair line }
    FColor1 : TColor ;
    { color of pair line }
    FColor2 : TColor ;
    { color of text impair line }
    FTextColor1 : TColor ;
    { color of text pair line }
    FTextColor2 : TColor ;
    { type of advanced }
    FCustom : TCustomType ;
    { Numéro de la colone dernièrement cliquée }
    Colonne : Integer ;
    { Odre croissant }
    OrdreCroissant : Boolean ;
    { Indique si on trie automatiquement lorsqu'on clique sur l'entête }
    FASOHC : Boolean ;
    { Image de fond }
    FBackGroundImage : TImage ;
    { Offset X of picture }
    FPictureOffsetX : Integer ;
    { Offset Y of picture }
    FPictureOffsetY : Integer ;
    { Display arrow ? }
    FDisplayArrow : boolean ;
    { position of arrow }
    FDisplayArrowPosition : TArrowDisplayPosition ;
    { Déclarations publiques }
    { Rectangle de l'image de la flèche 16x16}
    Rectangle : TRect ;
    { Flèche par défaut vers le bas }
    BitmapArrowDown : TBitmap ;
    { Flèche par défaut vers le haut }
    BitmapArrowUp : TBitmap ;
    { Fleche haute utilisateur }
    FImageArrowDown : TBitmap ;
    { Fleche basse utilisateur }
    FImageArrowUp : TBitmap ;
    { Colonne par défaut de trié }
    FDefaultSortColumn : Integer ;
    FOnColumnClickBeforeSort : TLVColumnClickAfterSortEvent;
    FOnColumnClickAfterSort : TLVColumnClickEvent ;

    procedure AdvancedListViewCustomDrawItem(Sender: TCustomListView;
                             Item: TListItem; State: TCustomDrawState;
                                            var DefaultDraw: Boolean);
    procedure AdvancedListViewCustomDrawSubItem(Sender: TCustomListView;
             Item: TListItem; SubItem: Integer; State: TCustomDrawState;
                                              var DefaultDraw: Boolean);
    procedure AdvancedListViewColumnClick(Sender: TObject;
              Column: TListColumn);
    procedure SetColor1(couleur : TColor) ;
    procedure SetColor2(couleur : TColor) ;
    procedure SetCustomStyle(Style : TCustomType) ;
    procedure SetASOHC(status : boolean) ;
    procedure SetTextColor1(couleur : TColor) ;
    procedure SetTextColor2(couleur : TColor) ;
    procedure WndProc(var Message: TMessage); override;
    procedure ListViewBackGroundImage;
    procedure ListViewBackGroundImageClear;
    procedure WMLButtonDown(var msg: TWMLButtonDown); message WM_LBUTTONDOWN;
    procedure WMRButtonDown(var msg: TWMRButtonDown); message WM_RBUTTONDOWN;
    procedure SetImageWindowStyle(Index: Integer);
    procedure RemoveImage(Index: Integer);
    procedure SetColumnImage(Colonne: Integer; Down: Boolean);
    procedure SetDisplayArrowPosition(Position : TArrowDisplayPosition) ;
    procedure SetDisplayArrow(Display : boolean) ;
    function  CheckCommonControlVersion6OrAbove : boolean ;
    procedure SetImageWindowWithoutStyle(Index: Integer);
    procedure DrawArrowDown ;
    procedure DrawArrowUp ;
    procedure SetBitmapUserArrowDown(value:TBitmap);
    procedure SetBitmapUserArrowUp(value:TBitmap);
    procedure SetDefaultSortColumn(index:Integer) ;
  public
    constructor Create(Owner:TComponent); override;
    destructor Destroy; override;
  published
    { Déclarations publiées }
  published
    property Action;
    property Align;
    property AllocBy;
    property Anchors;
    property BevelEdges;
    property BevelInner;
    property BevelOuter;
    property BevelKind default bkNone;
    property BevelWidth;
    property BiDiMode;
    property BorderStyle;
    property BorderWidth;
    property Checkboxes;
    property Color;
    property Columns;
    property ColumnClick;
    property Constraints;
    property Ctl3D;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property Font;
    property FlatScrollBars;
    property FullDrag;
    property GridLines;
    property HideSelection;
    property HotTrack;
    property HotTrackStyles;
    property HoverTime;
    property IconOptions;
    property Items;
    property LargeImages;
    property MultiSelect;
    property OwnerData;
    property OwnerDraw;
    property ReadOnly default False;
    property RowSelect;
    property ParentBiDiMode;
    property ParentColor default False;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property ShowColumnHeaders;
    property ShowWorkAreas;
    property ShowHint;
    property SmallImages;
    property SortType;
    property StateImages;
    property TabOrder;
    property TabStop default True;
    property ViewStyle;
    property Visible;
    property OnAdvancedCustomDraw;
    property OnAdvancedCustomDrawItem;
    property OnAdvancedCustomDrawSubItem;
    property OnChange;
    property OnChanging;
    property OnClick;
    property OnColumnClick;
    property OnColumnDragged;
    property OnColumnRightClick;
    property OnCompare;
    property OnContextPopup;
    property OnCustomDraw;
    property OnCustomDrawItem;
    property OnCustomDrawSubItem;
    property OnData;
    property OnDataFind;
    property OnDataHint;
    property OnDataStateChange;
    property OnDblClick;
    property OnDeletion;
    property OnDrawItem;
    property OnEdited;
    property OnEditing;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnGetImageIndex;
    property OnGetSubItemImage;
    property OnDragDrop;
    property OnDragOver;
    property OnInfoTip;
    property OnInsert;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnResize;
    property OnSelectItem;
    property OnStartDock;
    property OnStartDrag;
    { AdvancedListView property }
    property ColorImpair : TColor read FColor1 write SetColor1 default clWindow ;
    property ColorPair : TColor read FColor2 write SetColor2 default cShade ;
    property CustomStyle : TCustomType read FCustom write SetCustomStyle default ctLine ;
    property AutoSortOnHeaderClick : Boolean read FASOHC write SetASOHC default true ;
    property TextColorImpair : TColor read FTextColor1 write SetTextColor1 default clWindowText ;
    property TextColorPair : TColor read FTextColor2 write SetTextColor2 default clWindowText ;
    property BackgroundPicture : TImage read FBackGroundImage write FBackGroundImage ;
    property PictureOffsetX : Integer read FPictureOffsetX write FPictureOffsetX ;
    property PictureOffsetY : Integer read FPictureOffsetY write FPictureOffsetY ;
    property DisplayArrow : boolean read FDisplayArrow write SetDisplayArrow default true ;
    property DisplayArrowPosition : TArrowDisplayPosition read FDisplayArrowPosition write SetDisplayArrowPosition default adRight ;
    property UserArrowUp : TBitmap read FImageArrowUp write SetBitmapUserArrowUp ;
    property UserArrowDown : TBitmap read FImageArrowDown write SetBitmapUserArrowDown ;
    property DefaultSortColumn : Integer read FDefaultSortColumn write SetDefaultSortColumn default 0 ;
    property OnColumnClickBeforeSort : TLVColumnClickAfterSortEvent read FOnColumnClickBeforeSort write FOnColumnClickBeforeSort ;
    property OnColumnClickAfterSort : TLVColumnClickEvent read FOnColumnClickAfterSort write FOnColumnClickAfterSort ;
  end;

procedure Register;

implementation

{*******************************************************************************
 * Constructeur
 ******************************************************************************}
constructor TAdvancedListView.Create(Owner:TComponent);
begin
    inherited ;

    Self.OnCustomDrawItem := AdvancedListViewCustomDrawItem ;
    Self.OnCustomDrawSubItem := AdvancedListViewCustomDrawSubItem ;
    Self.OnColumnClick := AdvancedListViewColumnClick ;

    Self.ViewStyle := vsReport ;

    FColor1 := clWindow ;
    FColor2 := cShade ;

    FCustom := ctLine ;

    Colonne := - 1;
    OrdreCroissant := True ;

    FASOHC := True ;

    FBackGroundImage := TImage.Create(Self) ;

    FDisplayArrow := True ;

    FDisplayArrowPosition := adRight ;

    Rectangle.Left := 0 ;
    Rectangle.Top := 0 ;
    Rectangle.Right := 16 ;
    Rectangle.Bottom := 16 ;

    FImageArrowDown := TBitmap.Create ;
    FImageArrowUp := TBitmap.Create ;

    DrawArrowDown ;

    DrawArrowUp ;

    DefaultSortColumn := 0 ;
end ;

{*******************************************************************************
 * Destructeur
 ******************************************************************************}
destructor TAdvancedListView.Destroy;
begin
    FBackGroundImage.free;

    FImageArrowDown.Free ;
    FImageArrowUp.Free ;

    if Assigned(BitmapArrowDown)
    then
        BitmapArrowDown.Free ;

    if Assigned(BitmapArrowUp)
    then
        BitmapArrowUp.Free ;
    inherited;
end;

{*******************************************************************************
 * Affecte la couleur 1 et redessine le composant
 ******************************************************************************}
procedure TAdvancedListView.SetColor1(couleur : TColor) ;
begin
    FColor1 := Couleur ;
    Refresh ;
end ;

{*******************************************************************************
 * Affecte la couleur 2 et redessine le composant
 ******************************************************************************}
procedure TAdvancedListView.SetColor2(couleur : TColor) ;
begin
    FColor2 := Couleur ;
    Refresh ;
end ;

{*******************************************************************************
 * Configure le style de composant et redessine le composant
 ******************************************************************************}
procedure TAdvancedListView.SetCustomStyle(Style : TCustomType) ;
begin
    FCustom := Style ;

    if ((Style = ctFixedImageBackGround) or (Style = ctRepeatImageBackGround)) and Assigned(Self.Parent) and (not FBackGroundImage.Picture.Bitmap.Empty)
    then begin
        if CheckCommonControlVersion6OrAbove
        then ListViewBackGroundImage
    end
    else begin
        if CheckCommonControlVersion6OrAbove
        then ListViewBackGroundImageClear ;
    end ;

    Refresh ;
end ;

{*******************************************************************************
 * Indique si la liste est auto-trié
 ******************************************************************************}
procedure TAdvancedListView.SetASOHC(status : boolean) ;
begin
    FASOHC := Status ;

    if Status = True
    then
        Self.OnColumnClick := AdvancedListViewColumnClick
    else
        Self.OnColumnClick := nil ;

end ;

{*******************************************************************************
 * Affecte couleur 1 du text
 ******************************************************************************}
procedure TAdvancedListView.SetTextColor1(couleur : TColor) ;
begin
    FTextColor1 := Couleur ;
    Refresh ;
end ;

{*******************************************************************************
 * Affecte couleur 1 du text
 ******************************************************************************}
procedure TAdvancedListView.SetTextColor2(couleur : TColor) ;
begin
    FTextColor2 := Couleur ;
    Refresh ;
end ;


{*******************************************************************************
 * Dessine un élément de la liste (première colone)
 ******************************************************************************}
procedure TAdvancedListView.AdvancedListViewCustomDrawItem(Sender: TCustomListView;
                                   Item: TListItem; State: TCustomDrawState;
                                                  var DefaultDraw: Boolean);
begin
  if FCustom = ctLine
  then begin
      if Odd(Item.Index)
      then begin
          TAdvancedListView(Sender).Canvas.Brush.Color := FColor2 ;
          TAdvancedListView(Sender).Canvas.Font.Color := FTextColor2 ;
      end
      else begin
          TAdvancedListView(Sender).Canvas.Brush.Color := FColor1 ;
          TAdvancedListView(Sender).Canvas.Font.Color := FTextColor1 ;
      end ;
  end
  else if FCustom = ctColum
  then begin
      TAdvancedListView(Sender).Canvas.Brush.Color := FColor1 ;
  end ;
end;

{*******************************************************************************
 * Dessine un sous-élément colone 1 à N
 ******************************************************************************}
procedure TAdvancedListView.AdvancedListViewCustomDrawSubItem(Sender: TCustomListView;
                           Item: TListItem; SubItem: Integer; State: TCustomDrawState;
                                                            var DefaultDraw: Boolean);
begin
  { Pour delphi 4 }
  if SubItem >= 1
  then begin
      if FCustom = ctColum
      then begin
          if Odd(SubItem)
          then begin
              TAdvancedListView(Sender).Canvas.Brush.Color := FColor2 ;
              TAdvancedListView(Sender).Canvas.Font.Color := FTextColor2 ;
          end
          else begin
              TAdvancedListView(Sender).Canvas.Brush.Color := FColor1 ;
              TAdvancedListView(Sender).Canvas.Font.Color := FTextColor1 ;
          end ;
      end ;
  end ;
end;

{*******************************************************************************
 * Appelé lorsqu'on clique sur une entête de colone
 ******************************************************************************}
procedure TAdvancedListView.AdvancedListViewColumnClick(Sender: TObject;
  Column: TListColumn);
var i, j, NumSubItem : Integer ;
    temp : TListItems ;
    ListItem: TListItem;
    NewListView : TListView ;
    Found : Boolean ;
    Condition : Boolean ;
    CanSort : Boolean ;
    ChangeHeaderImage : Boolean ;

    { Recopie tous les sous-items et leurs propriétés }
    procedure CopieSubItem(Sender : TListView; ListItem: TListItem; i : Integer) ;
    Var k : Integer ;
    begin
        { Copie les sous items }
        For k := 0 to Sender.Items.Item[i].SubItems.Count - 1 do
        begin
            with Sender.Items.Item[i] do
            begin
                { Copie tout les élements de configurations }
                ListItem.SubItems.Add(SubItems[k]);

                ListItem.Cut := Cut ;
                ListItem.Data := Data ;
                ListItem.DropTarget := DropTarget ;
                ListItem.Focused := Focused ;
                ListItem.Indent := Indent ;
                ListItem.Left := Left ;
                ListItem.OverlayIndex := OverlayIndex ;
                ListItem.Selected := Selected ;
                ListItem.StateIndex := StateIndex ;
                ListItem.Top := Top ;
            end ;
        end ;
    end ;
begin
    CanSort := True ;
    ChangeHeaderImage := True ;

    if Assigned(FOnColumnClickBeforeSort)
    then
        FOnColumnClickBeforeSort(Sender, Column, CanSort, ChangeHeaderImage) ;

    if not CanSort
    then
        exit ;

    Condition := False ;

    { Si on clique sur la même colone, on inverse l'ordre }
    if Colonne = Column.ID
    then
        OrdreCroissant := not OrdreCroissant
    else
        OrdreCroissant := True ;

    { Mémorise la colone }
    //Colonne := Column.ID - 6 ;
    Colonne := Column.ID ;

    { Affiche la flèche de trie }
    if FDisplayArrow and ChangeHeaderImage
    then
        SetColumnImage(Colonne, OrdreCroissant) ;

    { Créer une liste view }
    NewListView := TListView.Create(Self) ;
    NewListView.Visible := False ;

    { L'affecte à la feuille courante }
    NewListView.Parent := Self;
    { On mémorise s'il y a les case à cocher car lors de la recopie elles
      apparaissent sans qu'on leur demande quelque chose }
    NewListView.Checkboxes := (Sender as TListView).Checkboxes ;

    { Créer une liste }
    temp := TListItems.Create(NewListView) ;

    {** On trie la première colone **}
    if Column.ID = 0
    then begin
        { Pour chaque élement de la liste qu'on doit trier }
        For i := 0 to (Sender as TListView).Items.Count - 1 do
        begin
            { Indique qu'on n'a pas trouver de position pour l'occurence en
              cours }
            Found := False ;

            { On la trie par rapport à la nouvelle liste }
            For j := 0 to temp.Count -1 do
            begin
                {** Si l'élément se situe avant **}

                { Ci-dessous la condition quand on est en ordre croissant }
                Condition := (Sender as TListView).Items.Item[i].Caption < temp.Item[j].Caption ;

                { Si on veut l'ordre décroissant, on inverse la condition }
                if OrdreCroissant = False
                then
                    Condition := not Condition ;

                if Condition
                then begin
                    { Copie l'item principale }
                    ListItem := temp.Insert(j) ;
                    ListItem.Caption := (Sender as TListView).Items.Item[i].Caption ;

                    CopieSubItem((Sender as TListView), ListItem, i) ;

                    Found := True ;
                    { On sort de la boucle pour ne pas répéter l'élément }
                    Break ;
                end ;
            end ;

            if Found = False
            { Sinon on le copie après }
            then begin
                { Copie l'item principale }
                ListItem := temp.Add ;
                ListItem.Caption := (Sender as TListView).Items.Item[i].Caption ;

                CopieSubItem((Sender as TListView), ListItem, i) ;
            end ;
        end ;
    end
    else begin
        { Mémorise la colone dans une variable évitant ainsi de recalculer a
          chaque fois et gagnant donc du temps en exécution }
        //NumSubItem := Column.ID - 6 ;
        { -1 car c'est les sous-item or le premier item est 0 alors que son
          numéro Column est 1 }
        NumSubItem := Column.ID - 1 ;

        { Pour chaque élement de la liste qu'on doit trier }
        For i := 0 to (Sender as TListView).Items.Count - 1 do
        begin
            { Indique qu'on n'a pas trouver de position pour l'occurence en
              cours }
            Found := False ;

            { On la trie par rapport à la nouvelle liste }
            For j := 0 to temp.Count -1 do
            begin
                if (NumSubItem < temp.Item[j].SubItems.Count) and ((Sender as TListView).Items.Item[i].SubItems.Count > NumSubItem)
                then
                    Condition := (Sender as TListView).Items.Item[i].SubItems.Strings[NumSubItem] < temp.Item[j].SubItems.Strings[NumSubItem] ;

                { Si on veut l'ordre décroissant, on inverse la condition }
                if OrdreCroissant = False
                then
                    Condition := not Condition ;

                if Condition
                then begin
                    { Copie l'item principale }
                    ListItem := temp.Insert(j) ;
                    ListItem.Caption := (Sender as TListView).Items.Item[i].Caption ;

                    CopieSubItem((Sender as TListView), ListItem, i) ;

                    Found := True ;
                    { On sort de la boucle pour ne pas répéter l'élément }
                    Break ;
                end ;
            end ;

            if Found = False
            { Sinon on le copie après }
            then begin
                { Copie l'item principale }
                ListItem := temp.Add ;
                ListItem.Caption := (Sender as TListView).Items.Item[i].Caption ;

                CopieSubItem((Sender as TListView), ListItem, i) ;
            end ;
        end ;
    end ;

    (Sender as TListView).Items.BeginUpdate ;

    (Sender as TListView).Items := NewListView.Items ;
    (Sender as TListView).Checkboxes := NewListView.Checkboxes ;

    (Sender as TListView).Items.EndUpdate ;

    if Assigned(FOnColumnClickAfterSort)
    then
        FOnColumnClickAfterSort(Sender, Column) ;
end;

{*******************************************************************************
 * Procedure pour gérer l'image de fond
 ******************************************************************************}
procedure TAdvancedListView.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_ERASEBKGND then
    DefaultHandler(Message)
  else
    inherited WndProc(Message);
end;

{*******************************************************************************
 * Affecte une image en fond
 ******************************************************************************}
procedure TAdvancedListView.ListViewBackGroundImage;
var
    LVBKImage : TLVBKIMAGE;
begin
    FillChar(LVBKImage, SizeOf(LVBKImage), 0);

    if FCustom = ctRepeatImageBackGround
    then
        LVBKImage.ulFlags := LVBKIF_SOURCE_HBITMAP or LVBKIF_STYLE_TILE
    else
        LVBKImage.ulFlags := LVBKIF_SOURCE_HBITMAP ;

    LVBKImage.pszImage := nil ;
    LVBKImage.hbm := FBackGroundImage.Picture.Bitmap.Handle ;
    LVBKImage.xOffsetPercent := FPictureOffsetX;
    LVBKImage.yOffsetPercent := FPictureOffsetX;
    ListView_SetBkImage(Handle, @LVBKImage);
    ListView_SetBKColor(Handle, CLR_NONE);
end;

{*******************************************************************************
 * Efface l'image en fond
 ******************************************************************************}
procedure TAdvancedListView.ListViewBackGroundImageClear;
var
  LVBKImage : TLVBKIMAGE;
begin
    FillChar(LVBKImage, SizeOf(LVBKImage), 0);

    LVBKImage.ulFlags := LVBKIF_SOURCE_NONE ;
    ListView_SetBkImage(Handle, @LVBKImage);
end;

{ A cause d'un bug d'affichage, on est obligé de redessiner le composant }
procedure TAdvancedListView.WMLButtonDown(var msg: TWMLButtonDown);
begin
     inherited;
     repaint;
end;

{ A cause d'un bug d'affichage, on est obligé de redessiner le composant }
procedure TAdvancedListView.WMRButtonDown(var msg: TWMRButtonDown);
begin
     inherited;
     repaint;
end;

{*******************************************************************************
 * Supprime l'image de trie
 ******************************************************************************}
procedure TAdvancedListView.RemoveImage(Index: Integer);
var Header : THandle;
    HDItem : THDItem;
begin
    { Get the ListView Header Handle }
    Header := ListView_GetHeader(Self.Handle);

    FillChar(HDItem, SizeOf(HDItem), 0);

    HDItem.Mask := HDI_BITMAP or HDI_IMAGE or HDI_FORMAT;

    { current status secure }
    Header_GetItem(Header, Index, HDItem);

    { delete arrow }
    HDItem.fmt := HDItem.fmt and not HDF_SORTUP and not HDF_SORTDOWN
                  and not HDF_BITMAP_ON_RIGHT and not HDF_IMAGE and not HDF_BITMAP ;


    if not CheckCommonControlVersion6OrAbove
    then
        DeleteObject(HDItem.hbm);

    { New header }
    Header_SetItem(Header, Index, HDItem);
end;

{*******************************************************************************
 * Ajoute l'image de trie sous Windows XP et après avec le style
 ******************************************************************************}
procedure TAdvancedListView.SetImageWindowStyle(Index: Integer);
var Header: THandle;
    HDItem: THDItem;
begin
    { Get the ListView Header Handle }
    Header := ListView_GetHeader(Handle);

    FillChar(HDItem, SizeOf(HDItem), 0);

    HDItem.Mask := HDI_BITMAP or HDI_IMAGE or HDI_FORMAT;

    Header_GetItem(Header, Index, HDItem);

    { clear direction of arrow }
    HDItem.fmt := HDItem.fmt and not HDF_SORTUP and not HDF_SORTDOWN and not HDF_IMAGE ;

    case Columns[Index].Alignment of
        taLeftJustify:  Hditem.fmt := Hditem.fmt or HDF_LEFT;
        taCenter:       Hditem.fmt := Hditem.fmt or HDF_CENTER;
        taRightJustify: Hditem.fmt := Hditem.fmt or HDF_RIGHT;
    else
        Hditem.fmt := Hditem.fmt or HDF_LEFT;
    end;
        
    if OrdreCroissant = true
    then begin
        HDItem.fmt := HDItem.fmt or HDF_SORTUP ;
    end
    else begin
        HDItem.fmt := HDItem.fmt or HDF_SORTDOWN;
    end ;

    { Display arrow to left or right ? }
    if FDisplayArrowPosition = adRight
    then
        HDItem.fmt := HDItem.fmt or HDF_BITMAP_ON_RIGHT
    else
        HDItem.fmt := HDItem.fmt and (not HDF_BITMAP_ON_RIGHT) ;            

    { New header }
    Header_SetItem(Header, Index, HDItem);
end;

{*******************************************************************************
 * Ajoute l'image de trie
 ******************************************************************************}
procedure TAdvancedListView.SetImageWindowWithoutStyle(Index: Integer);
var Header: THandle;
    HDItem: THDItem;
begin
    { Get the ListView Header Handle }
    Header := ListView_GetHeader(Handle);

    FillChar(HDItem, SizeOf(HDItem), 0);

    HDItem.Mask := HDI_FORMAT;

    Header_GetItem(Header, Index, HDItem);

    Hditem.Mask := Hditem.Mask or HDI_FORMAT or HDI_BITMAP ;

    { clear direction of arrow }
    HDItem.fmt := HDItem.fmt or HDF_BITMAP and not HDF_SORTUP and not HDF_SORTDOWN ;

    case Columns[Index].Alignment of
        taLeftJustify:  Hditem.fmt := Hditem.fmt or HDF_LEFT;
        taCenter:       Hditem.fmt := Hditem.fmt or HDF_CENTER;
        taRightJustify: Hditem.fmt := Hditem.fmt or HDF_RIGHT;
    else
        Hditem.fmt := Hditem.fmt or HDF_LEFT;
    end;

    if (HDItem.hbm <> 0)
    then
        DeleteObject(HDItem.hbm);

    if OrdreCroissant = true
    then begin
        { Windows efface l'image au bout d'un moment }
        DrawArrowUp ;
        HDItem.hbm := BitmapArrowUp.Handle ;
    end
    else begin
        DrawArrowDown ;
        HDItem.hbm := BitmapArrowDown.Handle ;
    end ;

    { Display arrow to left or right ? }
    if FDisplayArrowPosition = adRight
    then
        HDItem.fmt := HDItem.fmt or HDF_BITMAP_ON_RIGHT
    else
        HDItem.fmt := HDItem.fmt and (not HDF_BITMAP_ON_RIGHT) ;

    { New header }
    Header_SetItem(Header, Index, HDItem);
end;

{*******************************************************************************
 * Ajoute l'image de trie à une colonne et efface celle des autres
 ******************************************************************************}
procedure TAdvancedListView.SetColumnImage(Colonne: Integer; Down: Boolean);
var i : Integer;
begin
  if (Colonne > - 1) and (Colonne < Self.Columns.Count)
  then begin
      { remove icons }
      for i := 0 to Self.Columns.Count - 1 do
      begin
        RemoveImage(i) ;
      end ;

      if CheckCommonControlVersion6OrAbove and FImageArrowDown.Empty and FImageArrowUp.Empty
      then
          SetImageWindowStyle(Colonne)
      else
          SetImageWindowWithoutStyle(Colonne);
  end ;
end;

{*******************************************************************************
 * Fonction qui affecte la valeur d'affichage de l'indicateur de trie
 ******************************************************************************}
procedure TAdvancedListView.SetDisplayArrow(Display : boolean) ;
begin
    FDisplayArrow := Display ;

    if Display = False
    then
        SetColumnImage(-1, true)
    else
        SetColumnImage(Colonne, OrdreCroissant) ;
end ;

{*******************************************************************************
 * Fonction qui affecte la valeur de position d'affichage
 ******************************************************************************}
procedure TAdvancedListView.SetDisplayArrowPosition(Position : TArrowDisplayPosition) ;
begin
    FDisplayArrowPosition := Position ;

    if FDisplayArrow
    then
        SetColumnImage(Colonne, OrdreCroissant) ;
end ;

{*******************************************************************************
 * Vérifie qu'il s'agit des CommonControl version 6 ou supérieur
 ******************************************************************************}
function TAdvancedListView.CheckCommonControlVersion6OrAbove ;
var HandleDll: THandle;
    pDllVersionInfo: pDLLVerInfo;
    DLLVersionInfo: TDLLVersionInfo ;
    DllGetVersion: function(dvi: PDLLVerInfo): PDLLVerInfo; stdcall;
begin
    Result := False ;

    HandleDll := LoadLibrary('comctl32.dll') ;

    if HandleDll <> 0
    then begin
        @DllGetVersion := GetProcAddress(HandleDll, 'DllGetVersion') ;

        if (@DllGetVersion) <> nil
        then begin
            new(pDllVersionInfo);

            try
                ZeroMemory(pDllVersionInfo, SizeOf(pDllVersionInfo^));
                pDllVersionInfo^.cbSize := SizeOf(pDllVersionInfo^);

                DllGetVersion(pDllVersionInfo);
                DLLVersionInfo.dwMajorVersion := pDllVersionInfo^.dwMajorVersion;
                DLLVersionInfo.dwMinorVersion := pDllVersionInfo^.dwMinorVersion;
                
                if DLLVersionInfo.dwMajorVersion > 5
                then
                    Result := True ;

            finally
                dispose(pDllVersionInfo);
            end;
        end ;
        
        FreeLibrary(HandleDll) ;
    end ;
end ;

{*******************************************************************************
 * Dessine L'image vers le bas
 ******************************************************************************}
procedure TAdvancedListView.DrawArrowDown ;
begin
    if Assigned(BitmapArrowDown)
    then
        BitmapArrowDown.Free ;

    BitmapArrowDown := TBitmap.Create ;

    if not FImageArrowDown.Empty
    then begin
        BitmapArrowDown.Assign(UserArrowDown);
    end
    else begin
        BitmapArrowDown.Height := 10 ;
        BitmapArrowDown.Width := 10 ;

        { Crée un rectangle de couleur du header }
        BitmapArrowDown.Canvas.Brush.Style := bsSolid ;
        BitmapArrowDown.Canvas.Brush.Color := clBtnFace ;
        BitmapArrowDown.Canvas.FillRect(Rectangle);

        { Créer la flèche vers le bas }
        { Ligne du dessus }
        BitmapArrowDown.Canvas.Pen.Color := clBtnShadow ;
        BitmapArrowDown.Canvas.MoveTo(0, 0) ;
        BitmapArrowDown.Canvas.LineTo(9, 0) ;
        { Côté droit }
        BitmapArrowDown.Canvas.LineTo(5, 9) ;
        { Côté gauche }
        BitmapArrowDown.Canvas.Pen.Color := clWindow ;
        BitmapArrowDown.Canvas.LineTo(0, 0) ;
    end ;
end ;

{*******************************************************************************
 * Dessine L'image vers le haut
 ******************************************************************************}
procedure TAdvancedListView.DrawArrowUp ;
begin
    if Assigned(BitmapArrowUp)
    then
        BitmapArrowUp.Free ;

    BitmapArrowUp := TBitmap.Create ;

    if not FImageArrowUp.Empty
    then begin
        BitmapArrowUp.Assign(UserArrowUp);
    end
    else begin
        BitmapArrowUp.Height := 10 ;
        BitmapArrowUp.Width := 10 ;

        { Crée un rectangle de couleur du header }
        BitmapArrowUp.Canvas.Brush.Style := bsSolid ;
        BitmapArrowUp.Canvas.Brush.Color := clBtnFace ;
        BitmapArrowUp.Canvas.FillRect(Rectangle);

        { Créer la flèche }
        { Ligne du dessus vers le haut}
        BitmapArrowUp.Canvas.Pen.Color := clBtnShadow ;
        BitmapArrowUp.Canvas.MoveTo(0, 9) ;
        BitmapArrowUp.Canvas.LineTo(9, 9) ;
        { Côté droit }
        BitmapArrowUp.Canvas.LineTo(5, 0) ;
        { Côté gauche }
        BitmapArrowUp.Canvas.Pen.Color := clWindow ;
        BitmapArrowUp.Canvas.LineTo(0, 9) ;
    end ;
end ;

{*******************************************************************************
 * Affecte l'image
 ******************************************************************************}
procedure TAdvancedListView.SetBitmapUserArrowUp(value:TBitmap);
begin
     FImageArrowUp.Assign(value) ;

     if not FImageArrowUp.Empty
     then
          FImageArrowUp.Dormant ;

    if FDisplayArrow
    then
        SetColumnImage(Colonne, OrdreCroissant) ;
end;

{*******************************************************************************
 * Affecte l'image
 ******************************************************************************}
procedure TAdvancedListView.SetBitmapUserArrowDown(value:TBitmap);
begin
     FImageArrowDown.Assign(value) ;

     if not FImageArrowDown.Empty
     then
          FImageArrowDown.Dormant ;

    if FDisplayArrow
    then
        SetColumnImage(Colonne, OrdreCroissant) ;
end;

{*******************************************************************************
 * Affecte la colonne de trie par défault
 ******************************************************************************}
procedure TAdvancedListView.SetDefaultSortColumn(index:Integer) ;
begin
    FDefaultSortColumn := Index ;

    if (Index > -1) and (Index < Self.Columns.Count)
    then
        AdvancedListViewColumnClick(Self, Self.Column[Index]);
end ;

procedure Register;
begin
  RegisterComponents('WinEssential', [TAdvancedListView]);
end;

end.

 Conclusion

Il me fallait un composant qui fasse ça sans utiliser les composants JEDI.
J'espère que la source sera utile à quelqu'un

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

16 janvier 2008 12:05:21 :
support des image dans l'entête ainsi que l'image de fond
16 janvier 2008 14:50:10 :
J'avais mis le mauvais fichier

 Sources du même auteur

Source avec Zip Source avec une capture TEDIT À LE FAÇON D'INTERNET EXPLORER 7
Source avec Zip PROGRESS BAR IMAGE/3D/DÉGRADÉE/SIMPLE
Source avec Zip INFORMATION SUR LE PROCESSEUR
Source avec Zip PANEL DÉPLAÇABLE ET REDIMENSIONNABLE
Source avec Zip MINI SCRIPT (PHP-LIKE)

 Sources de la même categorie

Source avec Zip MOVCONTROL par abmed1963
Source avec Zip Source avec une capture PACKAGE DE COMPOSANTS CINDY V4.41 par MAURICIO
Source avec Zip Source avec une capture DBNAVIGATORPLUS par pascal1541
Source avec Zip Source avec une capture EVALUATION D' EXPRESSIONS MATHÉMATIQUE (MÉTHODE RPN) par MAURICIO
Source avec Zip Source avec une capture COMPOSANT TQPROGRESSBAR UNE BARRE DE PROGRESSION... par yanb

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture SIGNIFICATION DES CODES D'ERREUR DE L'API WIN32 - UTILISATIO... par japee
Source avec Zip ASTUCE: COMMENT CHANGER LA TAILLE DE NOS LIGNES DANS UN TLIS... par taye78

Commentaires et avis

Commentaire de japee le 14/01/2008 21:20:16 administrateur CS

Il manque le zip !

Commentaire de hill_piper le 01/04/2008 14:07:17

D'abord merci pour ce listview que j'ai déjà adopté.
Si je peux me permettre, j'aurais ajouter un ELSE dans la procedure :

TAdvancedListView.AdvancedListViewColumnClick(Sender: TObject; Column: TListColumn);

...
(ligne 602 si je ne me trompe pas)...
...

if (NumSubItem < temp.Item[j].SubItems.Count) and ((Sender as TListView).Items.Item[i].SubItems.Count > NumSubItem)

then
    Condition := (Sender as TListView).Items.Item[i].SubItems.Strings[NumSubItem] <
    temp.Item[j].SubItems.Strings[NumSubItem]
else
    if (NumSubItem < temp.Item[j].SubItems.Count) then Condition := True else Condition:= False;

ça permet de trier sur des colonnes du listview dont l'index dépasse le nombre de subitems de l'enregistrement en cours de tri. Les subitems manquant sont traités comme s'il s'agissait de chaines vides (tri croissant : les vides au début ; tri décroissant : les vides à la fin)

Commentaire de bubulemaster le 01/04/2008 16:52:00

Super idée merci.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

ListView [ par Francky ] salut, alors j'ai mis dans une TreeView le mot "Ouvrir" mais je veux que quand je clique sur le mot ouvrir ça m ouvre une autre forme!le mot ouvrir et Probleme ListView [ par Shadow ] Quand je mets ce code là et que je l execute il me dit erreur !code :varlist:TlistItem;beginif list.Caption = 'Quitter' then main.Close; ListView et MDI.... [ par PierreP ] voici mon problème : j'ai créé un ListView dans ma fenêtre principale, et je voudrais que lorsque l'on double-clique sur un élément de ce ListView cel ListView, TreeView ! INDEX! [ par rtfm ] Salut ma petit gang de delphinologue ;pJ'ai un petit probleme.. J'aurais besoin d'une manière de stocker la crée primaire de la string que j'ajoute a ListView-TreeView [ par Gysmo ] Salut,Ou puis-je trouver un exemple sur la sychro ListView-TreeView, a la maniere de ShellListView-ShellTreeView?Merci. PB ListView [ par Gysmo ] Voila j'ai un ListView sinchro avec un TreeView.Le prob est ke kan je suis en mode vsReport, j'ai des info type taille du fichier, ben si je change de listview :HELP!! [ par eedy31 ] salut g un chtit pbleme:j'amerai savoir comment on fait pour recuperer l'index d'une ligne d'un listview quand on click dessus.g vue le source de delp Popupmenu dans un listview [ par zorg63 ] Bonjour à tous.Je suis nouveau dans la programmation delphi et j'ai un probleme :Dans une form j'ai dispose un treeview et une listview et je voudrais ListView & ListItem [ par Bruto ] Voila encore une question sur ListView et ListItem. En fait, j'affiche 4 lignes dans ma listview. Quand je double-clic une de ces lignes, le listItem Application MDI et Drag and drop [ par zorg63 ] Bonjour,mon problème: J'ai créé une application MDI avec des form mdichild contenant un treeview et une listview. Je veux pouvoir faire du drag and dr


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,030 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales