Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ListView Item Text herausfinden (https://www.delphipraxis.net/106978-listview-item-text-herausfinden.html)

Luckie 20. Jan 2008 13:08

Re: ListView Item Text herausfinden
 
Auch als normales Fenster benutze ich die Dialog-Nachrichten, dann muss ich mir nicht die Handles merken, sondenr kann die vergebenen IDs verwenden. Bzw. ich muss mir das Handle nicht erst wieder über GetDlgItem holen:
Delphi-Quellcode:
SendMessage(GetDlgItem(handle, IDC_LISTVIEW1), ..., ..., ...)
ist gleichbedeutend mit
Delphi-Quellcode:
SendDlgItemMessage(Handle, ID, ..., ..., ...);

sirius 20. Jan 2008 13:58

Re: ListView Item Text herausfinden
 
Ja Luckie. Das gab keinen bestimmten Grund. Es war ja auch eine Frage meinerseits und eine auf Grund dessen, dass ich nicht ständig nonVCL programmiere, ein etwas unglücklicher weiterführender Hinweis. Falsch war er ja nicht. (es gäbe ja auch noch so einen Listview_Getitem Makro....)
Und der OP kann sich selber raussuchen wir er mit den Hinweisen weiter umgeht.

TonyMontana 20. Jan 2008 16:23

Re: ListView Item Text herausfinden
 
Also ich habs finally doch schon bereits Gestern hinbekommen, evtl. findet der ein oder andere ja noch nen Fehler:

Delphi-Quellcode:
var
lvc: TLVColumn;
///////////////////////////////////
                   ImageListSm := ImageList_Create(16,16,ILC_COLOR32,0,1);
                   ImageList_AddIcon(ImageListSm,LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON2)));
                   SendDlgItemMessage(handle, IDC_LISTVIEW1, LVM_SETIMAGELIST, LVSIL_SMALL, ImageListSm);
                   ImageListNo := ImageList_Create(32,32,ILC_COLOR32,0,1);
                   ImageList_AddIcon(ImageListNo,LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON2)));
                   SendDlgItemMessage(handle, IDC_LISTVIEW1, LVM_SETIMAGELIST, LVSIL_NORMAL, ImageListNo);
                   lvc.mask := LVCF_TEXT or LVCF_WIDTH;
                   lvc.pszText := 'Datei';
                   lvc.cx := 250;
                   SendMessage(GetDlgItem(handle, IDC_LISTVIEW1), LVM_INSERTCOLUMN, 0, Integer(@lvc));
                   lvc.pszText := 'Size';
                   lvc.cx := 180;
                   SendMessage(GetDlgItem(handle, IDC_LISTVIEW1), LVM_INSERTCOLUMN, 1, Integer(@lvc));
                   SetView(GetDlgItem(handle, IDC_LISTVIEW1), LVS_REPORT);
und

Delphi-Quellcode:
var
i: integer;
lvitem: TLVItem;
iItem: Integer;
///////////////////////
  i := filesize;
  lvitem.mask := LVIF_TEXT or LVIF_IMAGE;
  lvitem.iImage := 0;
  lvitem.pszText := 'bla';
  lvitem.cchTextMax := MAX_PATH;
  iItem := SendDlgItemMessage(dialoghandle, IDC_LISTVIEW1, LVM_INSERTITEM, 0, Integer(@lvitem));
  ListView_SetItemText(GetDlgItem(dialoghandle, IDC_LISTVIEW1), iItem, 1, pchar(inttostr(i div 1024)+'K'));
Noch ne Frage am Rande...

Ich habe folgendes:
Delphi-Quellcode:
var
pc: pchar;
///////////////////////////////////
                             getmem(pc, MAX_PATH);
                             lvitem.cchTextMax := MAX_PATH;
                             lvitem.pszText := pc;
                             ...
                             freemem(pc);
Ist das so korrekt? ODER soll ich getmem(pc, MAX_PATH + 1); reservieren (weil ja die variable pc ja null-terminiert ist und deshalb nen byte mehr braucht als in cchTextMax angegeben!)? und muss man für die Klassen TLVItem und TLVColumn jetzt Speicher reservieren oder nicht? Und ist es ratsam, zeromemory(@lvitem, SizeOf(lvitem)); zu benutzen? Das initialisiert ja sozusagen nur die klasseninstanz reserviert aber keinen Speicher, ODER? Jedenfalls läuft es fehlerfrei... Soll aber auch bei anderen Fehlerfrei laufen.

An dieser Stelle schon mal Danke an Luckie!!!!

Mir hat das WinAPI Tut hier durchaus etwas geholfen.

BTW: Die MSDN macht mich fertig, sau unübersichtlich und dann muss ich auch noch von c nach delphi umdenken ... :wall:

----------
EDIT:
Ok also ich habe mir jetzt auch mal angesehen, was ihr so gepostet hattet. Gehe ich richtig in der Annahme, dass GetMem hier 255 Bytes für die Zeichen reserviert und AUTOMATISCH noch ein extra Byte für das #0-Byte? Muss man sich also um das #0-Byte speichertechnisch keine Sorgen machen??? Jedenfalls versth ich gerade nicht, warum da 255 Bytes alloziert (heißt das so?) werden und dann die cchTextMax Variable auf 256 gesetzt wird... Oder bezieht sich cchTextMax auf die Länge in Bytes PLUS das #0-Byte???
Delphi-Quellcode:
    GetMem(Buffer, 255);
    ...
      lvi.cchTextMax := 256;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:26 Uhr.
Seite 2 von 2     12   

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