Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



ListView v cizí aplikaci

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: ListView v cizí aplikaci

Autor: xyz3

1:41:35 16.09.2010

> Tak už alespoň víme pravý důvod, proč jim tak trvá vydat 64bit delphi.

Nezapomeň že D7 je z roku 2002 a v té době se to takhle prasilo všude, trvalo potom hodně dlouho než lidi začali psát místo int třeba size_t. A jako na potvoru to tím není, stojí to na neexistenci 64-bit kompilátoru Delphi, je sice slíbený letos ale víme jak to chodí.

Citovat příspěvek

 

Re: ListView v cizí aplikaci

Autor: Jaroslav Šmíd

0:50:29 16.09.2010

pleytwak: tenhle kód je přímo od výrobce -> ze zdrojáků D7

Tak už alespoň víme pravý důvod, proč jim tak trvá vydat 64bit delphi. Např. 64bit Lazarus už s námi pár let existuje (bohužel má ale zase další chyby, např. typu registrace komponent, kdy je nutné překompilovat celé IDE).

Citovat příspěvek

 

Re: ListView v cizí aplikaci

Autor: pleytwak

10:29:38 14.09.2010

to jaroslav Šmíd: tenhle kód je přímo od výrobce -> ze zdrojáků D7 - unita CommCtrl. Dívám se, že i v D2006 je to pořád stejně, ale ne všude, některý zprávy přetypovávají na LPARAM.
[quote]To jest podivuhodná libovůle, což nelze stanoviti typu jednou a navždy?[/quote] ;-)

Citovat příspěvek

 

Re: ListView v cizí aplikaci

Autor: Jaroslav Šmíd

17:25:48 13.09.2010

Longint(@Item) - fůj, tohle nepoužívej. Takhle si poděláš aplikaci a až se jednou rozhodnou vydat 64bit Delphi a ty tam budeš chtít aplikaci zkompilovat, tak ti to nepůjde. Je potřeba správně to WinAPI použít, když už ho musíš volat. Je tedy potřeba ten ukazatel přetypovat na LPARAM a né na LongInt, i když je třeba v 32bit delphi definován jako stejný typ. Toto jsou takové blbé chyby, kvůli kterým pak vývojáři (ať už použíjí jakýkoliv jazyk) nechtějí vytvářet 64bit binárky - napsali to špatně a nechce se jim to opravovat. Lepší je to napsat správně hned, předejde se problémům.

Citovat příspěvek

 

Re: ListView v cizí aplikaci

Autor: pleytwak

13:29:10 08.09.2010

napadá mě, jestli to neudělat obráceně a namísto subclassu posílat listview zprávu WM_NOTIFY s LVN_GETDISPINFO - samozřejmě s korektně inicializovanou strukturou LV_ITEM

Citovat příspěvek

 

Re: ListView v cizí aplikaci

Autor: designerrr

12:24:09 08.09.2010

Tak jsem subclassnul proceduru okna, které ma ten listview jako rodiče a posíla mu zprávu VM_NOTIFY. Zkoušel jsem nejdřív zachytávat notifikační zprávu LVN_GETDISPINFO, ale ta informuje o potřebě vyplnit item informacemi, takže v době příchodu zprávy do procedury ještě struktura LVITEM, na kterou se odkazuje skrz LVN_GETDISPINFO , neobsahuje žádné informace a je právě na proceduře, aby ji informacemi naplnila.Volání originální procedury okna a následný výpis textu daného prvku sice fungoval, ale knihovna visual studia plyvala v průběhu programu errory. Tak jsem zkusil druhou možnost, zachytávat zprávu NM_CUSTOMDRAW, informující o nutnosti vykreslení určitého řádku v listviewu a vždycky v handleru na tuto zprávu jsem volal ListView_GetItemText pro všechny subitemy daného řádku a zapisoval je do souboru a to fungovalo konečně ok a jak bych chtěl.Akorát si budu muset nějak ošetřit, aby se do souboru obsah listviewu nezapisoval vždy při příchodu zprávy NM_CUSTOMDRAW, ale jen když bude informovat o potřebě vykreslení itemu, který ještě v listviewu není. Vidím to asi na použití třídy vector ze STL C++ a vždycky nový item do něj přidat a zárověň hlídat, jestli tam už není, snad to nebude moc zdžovat tu aplikaci.

Citovat příspěvek

 

Re: ListView v cizí aplikaci

Autor: pleytwak

9:56:58 08.09.2010

Díval jsem se jak se nastavuje text položky TListview v D7 a je tam volání ListView_SetItemText(Handle, Index, 0, LPSTR_TEXTCALLBACK); a text se pak vrací v obsluze WM_Notify kde NMHdr.code = LVN_GETDISPINFO

Ještě mě napadá, jestli ten ListView není virtuální -> LVS_OWNERDRAWFIXED | LVS_OWNERDATA, pak by asi funkce getitemtext nemusela vracet to, co je v listview vidět.

Jinak jsem v D7 ještě zkoušel fci ListView_GetItemText a vypadá to, že normálně funguje. Vypadá takto:

[code]
function ListView_GetItemText(hwndLV: HWND; i, iSubItem: Integer;
pszText: PChar; cchTextMax: Integer): Integer;
var
Item: TLVItem;
begin
Item.iSubItem := iSubItem;
Item.cchTextMax := cchTextMax;
Item.pszText := pszText;
Result := SendMessage(hwndLV, LVM_GETITEMTEXT, i, Longint(@Item));
end;
[/code]

Citovat příspěvek

 

Re: ListView v cizí aplikaci

Autor: 0xenon

19:55:46 07.09.2010

borland si dela hodne veci sam, to muze bejt problem, nainstaluj si delphi, stahni DeDe, napis si simple app a debuguj, co se tam deje.

Citovat příspěvek

 

Re: ListView v cizí aplikaci

Autor: designerrr

18:14:16 07.09.2010

Jinak aplikace, ze které potřebuju obsah listviewu, je psaná v DELPHI, tak možná je problém někde v tom, že komponenta je TListView a já se do ní snažím dostat skrz Win32 API, i když i ten Tlistview by měl být ve výsledku založenej na listviewu z winapi.

Citovat příspěvek

 

Re: ListView v cizí aplikaci

Autor: designerrr

18:10:32 07.09.2010

Sry, že sem nereagoval, nešel mi dva dny net.
[bold]TO 0xenon :[/bold] ten tvůj nápad se chová stějně, jako ten můj :S .
[bold]TO pleytwak : [/bold] mám to v dll, která je součástí adresového prostoru té aplikace

Citovat příspěvek

 

Re: ListView v cizí aplikaci

Autor: pleytwak

10:41:51 06.09.2010

Problém může být i v tom, že se snažíš přistupovat do paměťového prostoru mimo tvou aplikaci (proces). Pak některé funkce vrací správné hodnoty, ale někdy dostaneš neočekávané výsledky. Řešilo se to třeba tady: [url]http://www.vbforums.com/showthread.php?t=184384[/url]
Kód je ve VB, ale vcelku se to dá pochopit.

Citovat příspěvek

 

Re: ListView v cizí aplikaci

Autor: 0xenon

10:27:45 06.09.2010

[code]
char buf[64];
LVITEM lvi;
lvi.mask = LVIF_TEXT;
lvi.cchTextMax = sizeof szBuf;
lvi.pszText = szBuf;
lvi.iItem = iRow;
lvi.iSubItem = iCol;
ListView_GetItem(hListView, &lvi);
[/code]

Citovat příspěvek

 

ListView v cizí aplikaci

Autor: designerrr

21:37:47 05.09.2010

Zdravím,
chtěl bych se zeptat, jestli někdo netuší, proč mi volání makra [bold]ListView_GetItemText [/bold] funguje ok, pokuď požaduji pouze text z prvního sloupce ListViewu, tzn. za subitem dosazuju 0. A když chci text z druhého sloupce, čili např. pro první řádek a druhý sloupec volám s parametry O a 1, tak mi to vyhodí obsah první buňky druhého sloupce, kterou jakoby nevidím? Listbox ma pevné rozměry, čili je tam nějaký scrollbar a v tomto případě, pokaď by se do boxu vešlo 10 řádků, tak by to vrátilo obsah druhého sloupce na 11ctém řádku.Jde o to, že potřebuji uložit obsah listboxu cizí aplikace do souboru. Díky

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: