Skocz do zawartości

kłopoty z ListView i DialogBox


Nightowl

Recommended Posts

1. Chcę znaleźć element w ListView, mam coś takiego:
GetCursorPos(&point);
ScreenToClient(hListView, &point);
LV_FINDINFO znajdz;
znajdz.flags= LVFI_NEARESTXY ;
znajdz.pt=point;
int ktory
ktory=ListView_FindItem(hListView,0, &znajdz);
Czy ktoś mi powie co mam w tym kodzie źle, bo cały czas funkcja zwraca mi -1. :(

2. Jeżeli już mam index elementu w ListView, to jak mam pobrać nazwy z sąsiednich kolumn :/

3.Użyłem w programie dwóch dialogbox. Pierwszy uruchamia się poprawnie. Jak wywołuje drugi to mie się pokazują tylko jego kontrolki( bez tła i ramki). Dla drugiego DialogBox'a mam drugą procedurę. Czy tak jest poprawnie, czy może powinienem oba dialogi obsługiwać w jednej procedurze :/

4.Jak dodać bitmapę do dialogbox'a :/

Dzięki za odpowiedzi :)

Link do komentarza
Udostępnij na innych stronach

Cuda niewidy 9_9

a nie mozna tak :/

int itemIndex;
itemIndex=ListView->ItemIndex;  // tu dziabnelem sobie numerek 

//pobieranie danych 

TListItem *item;
AnsiString TekstDane;
TekstDane=item->Caption;   //pierwsza kolumna

//druga podobnie, trzecia tez itd    "

TekstDane=list->SubItems->Text;  // albo sprawdz bo nie mam pewnosci

a co do 3 i 4 pytania to nie wiem co to DIalogBOx :?: 


Link do komentarza
Udostępnij na innych stronach

Witam
1. Czy napewno chcesz szukać item najbliższy od aktulnej pozycji kursora tak :/ Jeżeli tak to jak styl ma Twój ListView bo w MSDN piszą, że flaga LVFI_NEARESTXY działa tylko przy durzych i małych ikonach.
2. Nazwy z sąsiednich kolumn :/ Chodzi o nagłówki listy, czy o zawartość sąsiednich kolumn listy (SubItem)
3. Jak wywołujesz drugi dialog :/ Jeżeli np. po naciśnięciu na przycisk to powinno działać w ten sposób, że każdy dialog ma osobną procedurę z tym ,że w wywołaniu idrogiego dialogu za pomocą DialogBoxParam musisz ustawić trzeci parametr hWndParent (uchwyt rodzica) na uchwyt dialogu pierwszego.
4. O co chodzi z tą Bitmapą :/ Chcesz wyświetlić bitmapę na dialogu? Można by to zrobić w obsłudze komunikatu WM_PAINT ale to jest bardziej skomplikowane znacznie prościej jest utworzenie na dialogu kontrolki Static ze stylem SS_BITMAP i jeżeli bitmapa znajduje sie w zasobach to załadować ją za pomocą LoadBitmap, natomiast jeżeli bitmapa znajduje się w pliku to trzeba użyć LoadImage.
To wszystko co mogę teraz napisać, napisz bardziej szczegółowo pytania na, które nie dostałeś satysfakcionującej odpowiedzi.
Pozdro

Link do komentarza
Udostępnij na innych stronach

Nie wiem gesiek, ale twój kod jest chyba pod visuala, bo nie moge znaleźć w helpie danych, których użyłeś. Proszę o sprostowanie.

Do kAzka:
1.Nic mi nie wiadomo o ikonach- ja ich nie mam, bo w helpie nic o nich nie pisali. Moja kontrolka ma styl LVS_REPORT. Jeżeli wiesz jak to inaczej zrobić, to czekam.
2. Chodiz o zawartość sąsiednich kolumn.
3. Mi chodzi o wywołanie drugiego dialogu, który nie ma nic wspólnego z pierwszym. Więc oba okna dialogowe za rodzica mają okno główne. Wogule wywołuje dialogi za pomącą funkcji DialogBox, i z tego co mój kulawy angielski przeczytał, wynika że różni się ta funkcja od twojej parametrem LPARAM, który przekazuje początkową wartość przy wywołaniu. Jeśli sie mylę to proszę mnie poprawić.
4. Tak dokładnie to w zasobach mam coś takiego:
CONTROL "", ID, STATIC, SS_BITMAP | (dalsze parametry).
Chodzi mi o ten cudzysłów. Co ja mam do niego wpisać . Czy może to być ścieżka do bitmapy, a jak nie to czy ma on jakieś zastosowanie :/

Dzięki. pozdro :)

Link do komentarza
Udostępnij na innych stronach

Witam
1. No właśnie chodziło mi o to, że flaga LVFI_NEARESTXY dziala tylko przy stylach LVS_SMALLICON i LVS_ICON. Więc dlatego zwraca Ci -1. Aby szukać pozycji najbliższej kursora musisz napisać własną procedurę jednak ja tego nigdy nie robiłem (nie miałem potrzeby) więc Ci nie podpowiem jak. Natomiast jeżeli chcesz znaleźć tylko pozycję zawierającą określony ciąg znaków (string) to jest proste trzeba tylko ustawić pola struktury LV_FINDINFO .flags na LVFI_STRING lub LVFI_PARTIAL i .psz na adres szukanego ciagu znaków (przy LVFI_STRING musisz podać cały natomiast przy LVFI_PARTIAL wystarszy tylko początek) Póżniej wystarczy tylko wywołać:

ktory=ListView_FindItem(hListView,-1, &znajdz);

2. Kiedyś w MASM na swoje potrzeby napisałem taką funkcję. Jeżeli nie bedziesz umiał tego przetłumaczyć na C++ to gdzieś poczytaj o LVM_GETITEM
Parametry:
hListView: HWND - uchwyt ListView
iItemNo: DWORD - Numer Item (czyli wiersza)
iSubItemNo: DWORD - Numer SubItem (czyli kolumny)
lpText: LPSTR - Adres buforka w którym będzie zwrócony tekst
MaxLen: DWORD - Maksymalna długość zwracenego tekstu (naie więcej niż długosć bufora)
Uwaga: Wiersze i kolumny numerowane są od 0

GetListViewText proc hListView: HWND, iItemNo: DWORD, iSubItemNo: DWORD, lpText: LPSTR, MaxLen: DWORD
    LOCAL lvi:LV_ITEM       
        
        push iItemNo
        pop  lvi.iItem
        push iSubItemNo
        pop  lvi.iSubItem
        mov  lvi.imask, LVIF_TEXT
        push lpText
        pop  lvi.pszText
        push MaxLen
        pop  lvi.cchTextMax
        invoke SendMessage, hListView, LVM_GETITEM, 0, addr lvi 
        ret

GetListViewText endp

3. Niestety tu jest problem ponieważ wywołanie Dialogu za pomocą DialogBoxParam lub makra DialogBox tworzy modalne okno dialogowe, co uniemożliwia wywołnie drugiego dialogu spróbuj użyć CreateDialogParam albo makra CreateDialog (parametry bez zmian). Powinno działać :P
4.
Składnia:
CONTROL text, id, class, style, x, y, width, height [, extended-style]
text - tekst kontrolki
id - identyfikator
class - klasa
x, y - pozycja kontrolki względem głownego okna
width - szerokość
height - wysokość
extended-style - styl rozszerzony (parametr opcjonalny)

Jak z tego wynika pole text pozostawiasz bez zmian (przecież kontrolka nie ma wyświetlać tekstu tylko bitmapę). Aby wyświetlić bitmapę trzeba za pomocą funkcji LoadBitmap załadowąc bitmapę z zasobów a następnie trzeba wysłać komunikat STM_SETIMAGE do kontrolki którego wParam to IMAGE_BITMAP (chcemy załadować bitmapę) a lParam to uchwyt bitmapy. W MASM można to zrobić tak:

        invoke LoadBitmap, hInstance, ID_BITMAPY
        invoke SendDlgItemMessage, hWnd, ID_KONTROLKI, STM_SETIMAGE, IMAGE_BITMAP, eax 

Ale się rozpisałem :) Mam nadzieję, że przynajmniej trochę pomogłem.
Uwaga Post został zmodyfikowany (dokładnie 3 punkt) bo tam wcześniej napisałem takie bzdury, że wstyd się przyznawać... :$
Pozdro

Link do komentarza
Udostępnij na innych stronach

lukasz_all napisał:
Nie wiem gesiek, ale twój kod jest chyba pod visuala, bo nie moge znaleźć w helpie danych, których użyłeś. Proszę o sprostowanie.

Troche nasciemniałem :)
ja kozystam z C++ Builder 6
A wiec:
1) na formatke 2 TBUtton, 1 TMemo, 1 ListView (dodaj 4 kolumny)

i umiesc nastepujacy kod :)

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TListItem *item;
ListView1->Items->BeginUpdate();
ListView1->Clear();
for(int i=1;i<10;i++)
{
item=ListView1->Items->Add();
item->Caption="Zamiykanie";
item->SubItems->Add("Exit");
item->SubItems->Add("Zamykanie programu");
item->SubItems->Add(i);
}
ListView1->Items->EndUpdate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
AnsiString tekst;
tekst=ListView1->Items->Item[0]->Caption + " " + ListView1->Items->Item[0]->SubItems->Text; // + " " + ListView1->Items->Item[0]->SubItems->Text + " " + ListView1->Items->Item[0]->SubItems->Text);
Memo1->Lines->Text=tekst;
}
//---------------------------------------------------------------------------
Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...