![]() |
AW: ListView mit OwnerData schneller machen?
Siehe hier...
Delphi-Quellcode:
MediaListView.Items.BeginUpdate;
try MediaListView.Items.Clear; .. finally MediaListView.Items.EndUpdate; end; Zitat:
Zitat:
|
AW: ListView mit OwnerData schneller machen?
ich habe jetzt nach einiger zeit eine funktionierende und gute lösung die system-images zu nutzen: (wir holen nur kleine icons)
man braucht ein TListView und ein TImageList.im OI keine änderungen treffen. für ListView Data wird deklariert:
Delphi-Quellcode:
folgendes wird z.b. private in der unit wo die listview deklariert:
type
TMeineDaten = class aFilename: String; bIsUpdated: Boolean; end;
Delphi-Quellcode:
folgendes wird im OnCreate der unit geschrieben:
hImgSm: HIMAGELIST; // uses CommCtrl
aFileIcon: TSHFileInfo; // uses ShellAPI
Delphi-Quellcode:
und folgendes im CustomDrawSubItem der ListView:
hImgSm := HIMAGELIST(SHGetFileInfo('', 0, aFileIcon, SizeOf(aFileIcon), SHGFI_SYSICONINDEX or SHGFI_SMALLICON));
if (hImgSm <> 0) then ImageList1.Handle := hImgSm; ImageList1.ShareImages := True; ListView1.SmallImages := ImageList1;
Delphi-Quellcode:
Item zur ListView hinzufügen:
if (Item = nil) then
Exit; if not TMeineDaten(Item.Data).bIsUpdated then begin ZeroMemory(@aFileIcon, SizeOf(aFileIcon)); SHGetFileInfo(PChar(TMeineDaten(Item.Data).aFilename), 0, aFileIcon, SizeOf(aFileIcon), SHGFI_SYSICONINDEX or SHGFI_SMALLICON); Item.ImageIndex := aFileIcon.iIcon; TMeineDaten(Item.Data).bIsUpdated := True; end;
Delphi-Quellcode:
var
aIem: TListItem; aMeineDaten: TMeineDaten; begin aMeineDaten:= TMeineDaten.Create; aMeineDaten.aFilename := 'C:\meineDatei.exe'; aMeineDaten.bIsUpdated := False; aItem := ListView1.Items.Add; aItem.Caption := 'meineDatei.exe'; aItem.SubItems.Add('meineDatei SubItem'); aItem.Data := aMeineDaten; |
AW: ListView mit OwnerData schneller machen?
Zitat:
Damit aber mein Beispiel damit funktioniert (aber wie gesagt, ohne Gewähr) muss es so geändert werden:
Delphi-Quellcode:
Ob es richtig ist, weiß ich noch nicht, es funktioniert aber.
implementation
... var sfiTest: TSHFILEINFO; //***NEU procedure TForm1.FormCreate(Sender: TObject); ... begin ... SmallImages := ImageList1; ImageList1.Handle := SHGetFileInfo('C:\', 0, sfiTest, SizeOf(sfiTest), SHGFI_SYSICONINDEX or SHGFI_SMALLICON); //***NEU ... end; function GetFileTypeNameAndIcon3(const FileName: String; //***Andere Funktion out FileTypeName: String; out IconIndex: Integer): Boolean; var sfi: TSHFILEINFO; begin Result := SHGetFileInfo(PChar(FileName), 0, sfi, SizeOf(sfi), SHGFI_TYPENAME or SHGFI_ICON or SHGFI_SMALLICON) <> 0; if Result then begin FileTypeName := sfi.szTypeName; IconIndex := sfi.iIcon; //iIcon und nicht hIcon end; end; procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView; Item: TListItem; SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean); var ... FileIconIndex: Integer; ... begin ... if not FileInfoEx2.IsUpToDate then //***Änderung begin with FileInfoEx2 do GetFileTypeNameAndIcon3(Path + Name, FileTypeName, FileIconIndex); Item.SubItems[1] := FileTypeName; Item.ImageIndex := FileIconIndex; FileInfoEx2.IsUpToDate := True; end; ... end; |
AW: ListView mit OwnerData schneller machen?
Zitat:
Du kannst eine Komponente verwenden die genau für die Aufgabe entwickelt wurde (DBGrid). Du kannst aber auch eine nicht-datensentive Komponente (ListView) verwenden und durch zusätzlichen Code an das Dataset anbinden. Man sollte aber dabei nie das ![]() Ein DBGrid ist innerhalb von 15 Sekunden Programmierzeit an ein Dataset angebunden. Um ein (virtuelles) ListView an ein Dataset anzubinden benötigt man ca einen Tag Programmierzeit. Lohnt sich das? |
AW: ListView mit OwnerData schneller machen?
Zitat:
|
AW: ListView mit OwnerData schneller machen?
Guck mal dbExpress an.
Edit: Evtl. erst ab Delphi XE3. |
AW: ListView mit OwnerData schneller machen?
Zitat:
Eine TDatasource Komponente auf das Formular platzieren und im
Delphi-Quellcode:
deine SQLite-Komponente auswählen.
Property Dataset
Dann ein DBGrid auf's Formular und das
Delphi-Quellcode:
setzen.
Property DataSource
Du brauchst keine einzige Zeile Sourcecode sondern kannst alles über den Objektinspektor einstellen. Man kann sogar die Tabelle oder Query zur Entwicklungszeit aktiv schalten und sieht dann im DBGrid die Daten. |
AW: ListView mit OwnerData schneller machen?
Zitat:
|
AW: ListView mit OwnerData schneller machen?
Zitat:
|
AW: ListView mit OwnerData schneller machen?
Zitat:
Damit können die datensensitiven Komponenten nicht angebunden werden. Für kleine Projekte kann man sich auch so behelfen aber wenn's etwas mehr wird (> 3 Tabellen) braucht man "richtige" Komponenten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz