TListView i OwnerDraw - Galeria

TListView i OwnerDraw - Galeria
BZ
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 13 lat
  • Postów:64
0

Witam wszystkich, mam mały problem z komponentem TListView i OwnerDraw.

W tym komponencie będzie dokładnie 10 itemów (stale i niezmiennie). Chciałbym je narysować samemu w dwóch wierszach po 5 itemów.

Niestety nie wiem w jaki ma być styl widoku komponentu (vsIcon itd...) i w którym zdarzeniu odbywać się ma malowanie.

Próbowałem na wszystkich ViewStyle, ale nawet gdy miałem ustawioną właściwość OwnerDraw na True, nie mogłem samemu malować itemów.

Każdy item ma mieć wymiary przykładowo 100x100 pikseli (czyli całość ma mieć wysokość 200 pikseli i szerokość 500 pikseli).

Grafika do każdego itemu będzie wczytywana ze specjalnie przygotowanej tablicy przechowującej obrazy typu bmp.

Co do samego rysowania nie mam żadnych pytań, wszystko co mi jest potrzebne do tego wiem. Sprawa tyczy się tylko ustawienia szerokości i wysokości każdego itemu oraz pozbycia się ewentualnie pokazującego się pola z napisem (czyli Caption w każdym itemie).

Sprawdzałem jak to wygląda w widoku vsIcon, ale tak jak to jest w systemie, pokazuje się pod grafiką napis (tak jak w systemie nazwa pliku). Chcę się jej pozbyć i samodzielnie namalować calutki item tak, jak to można zrobić w zwykłym TListBox.

Wie ktoś jak to zrobić? Bardzo proszę o pomoc.
Dziękuję z góry i pozdrawiam.

EDIT: Na szybkiego narysowałem w Paint jak to by miało wyglądać (z XPManifest na formie - niebieska ramka to ramka komponentu TListView):

http://imageshack.us/photo/my-images/854/tlistview.png/

edytowany 1x, ostatnio: BoZzDoG
olesio
  • Rejestracja:około 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Nie bardzo wiem co chcesz osiągnąć, ale to co narysowałeś sam bardziej pasuje mi do StringGrida, zobacz sobie kod z załacznika do tego posta jak koloruje komórki kalendarza, ale mogąć operowac na Canvasie możesz narysować w okolicach tych komórek dowolną grafikę wczytaną na przykład z odpowiednich rozmiarów bitmapy.


Pozdrawiam.
cimak
na dobra sprawe to i PaintBox by wystarczal
BZ
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 13 lat
  • Postów:64
0
Olesio napisał(a)

ale to co narysowałeś sam bardziej pasuje mi do StringGrida

Wiem, że to najlepiej nie wygląda, ale nie chodzi mi o TStringGrid, tylko o TListView. Na tym rysunku czarne linie określają granice każdego z itemów. To jest tylko przykład, w programie nie będzie tych linii. Chciałbym zrobić tak, by w komponencie TListView itemy były w pięciu kolumnach i dwóch wierszach. Granice każdego itemu określają czarne linie na rysunku. To tak jak w TListBox, powierzchnia itemu (nie wiem jak to określić - chodzi mi o parametr Rect) jest na całą szerokość komponentu, chyba, że jest więcej niż jedna kolumna.

Koniecznie ma to być komponent TListView. Mógłbym to zrobić w TListBox, ale w nim jak jest zaznaczony item system rysuje wiejską ramkę taką, jak w MS Paint podczas zaznaczania regionu.

Niestety nie wiem, czy w TListView da się ustawiać itemy w kilku kolumnach (w TListBox chyba jest właściwość Columns). O taką rzecz mi chodzi.

Jeżeli mam na formie TListView, ustawię mu ViewStyle na vsIcon i dodam kilka itemów, dorzucam na formę TImageList i w nim ustawiam rozmiar przechowywanej grafiki na 100x100 pikseli, po czym w TListView ustawiam właściwość LargeImages na ww. TImageList. Teraz rozmiar grafiki w każdym TListView ma rozmiar 100x100 pikseli, ale rozmiar itemu jest większy. Pod grafiką o rozmiarach 100x100 pikseli jest jeszcze rysowany tekst itemu (to jest dokładnie to samo, gdy w dowolnym folderze mamy pliki i ustawimy widok na kafelki - jest grafika (czyli ikona) i tekst poniżej (czyli nazwa pliku)). Ja chcę się pozbyć tej nazwy, chcę tylko obszar grafiki dokładnie tak, jak jest to w TListBox.

Niestety nie potrafię tego opisać tak, żebyście zrozumieli dokładnie o co mi chodzi...

Najprościej mówiąc, chcę zaprogramować TListView tak, by wyglądał jak TListBox z pięcioma kolumnami.

EDIT: Dorzucam przykład w załączniku. Chcę, aby TListView wyglądał tak jak TListBox w tym przykładzie (tyle że w nim jest trzy kolumny dla przykładu, ja potrzebuję pięć).

edytowany 2x, ostatnio: BoZzDoG
cimak
ta "wiejska ramke" z listboxa sie da usunac - drawfocusrect :)
BZ
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 13 lat
  • Postów:64
0

Wiem cimak :)

Ale bardzo mi zależy, żeby to zrobić w TListView.

EDIT: Ewentualnie napiszcie, w jaki sposób rozróżnić, czy w miejscu kliknięcia jest jakiś item czy nie (Tak jak ma to miejsce w TListView - jeżeli jest item - zaznacza go, jeżeli nie ma itemu - odznacza wszystkie).

edytowany 2x, ostatnio: BoZzDoG
olesio
  • Rejestracja:około 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Nie pamiętam czy i jak da się ustawić TListView aby można było podświetlić tylko element w danej kolumnie, a nie tylko pierwszą kolumnę lub cały wiersz (przy własności RowSelect ustawionej na True), ale najpewniej w OnClick wystarczy poniższy kod, o ile to o takie coś Tobie chodzi.

Kopiuj
var
  LI : TListitem;
begin
  LI := ListView1.Items[ListView1.ItemIndex];
  if LI <> nil then
  begin
    ShowMessage('Wybrano element.');
  end
  else
  begin
    ShowMessage('Nie wybrano żadnego elementu!');
  end;
end;

Pozdrawiam.
SZ
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 6 lat
  • Postów:107
0
BoZzDoG napisał(a)

Koniecznie ma to być komponent TListView. Mógłbym to zrobić w TListBox, ale w nim jak jest zaznaczony item system rysuje wiejską ramkę taką, jak w MS Paint podczas zaznaczania regionu.

Chodzi o to? http://4programmers.net/Forum/Delphi_Pascal/155506-Listbox_canvas_mrówki

Edit: Nie zauważyłem dopiski cimak'a.

edytowany 1x, ostatnio: Szymonss
BZ
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 13 lat
  • Postów:64
0

olesio, w TListView wiem jak się to robi, ale w TListBox nie...

Skupmy się teraz na TListBox. Chcę go tak przerobić, żeby przypominał wyglądem TListView, czyli usunąć systemową ramkę itemu gdy jest zaznaczony (to już mam) i rozróżnić, czy kliknięto w puste miejsce komponentu (tam gdzie nie ma żadnego itemu) czy w jakiś item.

Jeżeli chodzi o TListView, tam jest zaprogramowane, jak kliknie się w jakikolwiek item, czy jest zaznaczony czy nie, automatycznie go zaznacza, a resztę odznacza. A jeżeli klinie się w puste miejsce komponentu (tam gdzie żadnego wiersza nie ma), zostają odznaczone wszystkie, także automatyczne. To samo chciałbym uczynić z TListBox, bo on obsługuje itemy w dowolnej liczbie kolumn.

Jeżeli dalej nie rozumiecie, postaram się jeszcze jaśniej wytłumaczyć o co mi chodzi.

EDIT: olesio, jeżeli miałbym w TListView podświetlać wybraną kolumnę, musiałbym w OnMouseDown i w OnMouseUp sprawdzać w którym miejscu itemu dokładnie kliknięto. Zdarzenie OnDrawItem prawdopodobnie zostało by automatycznie wygenerowane (jak to zwykłe kliknięcie), ale musiałbym je jakoś powiązać z OnMouseDown, żeby gdzieś przechował numer kolumny którą kliknięto. W samym zdarzeniu mam w parametrze podany Item, z niego wyciągnę ItemIndex, ale numer kolumny ww muszę gdzieś mieć przechowany, żeby wiedzieć podczas rysowania wiersza, gdzie namalować ramkę zaznaczenia (którą kolumnę). Muszę przetestować kilka pomysłów. Dam znać co mi z tego wyszło. A tymczasem proszę, zastanówcie się nad tym:

Ja napisał(a)

Skupmy się teraz na TListBox. Chcę go tak przerobić, żeby przypominał wyglądem TListView, czyli usunąć systemową ramkę itemu gdy jest zaznaczony (to już mam) i rozróżnić, czy kliknięto w puste miejsce komponentu (tam gdzie nie ma żadnego itemu) czy w jakiś item.

edytowany 2x, ostatnio: BoZzDoG
cimak
  • Rejestracja:ponad 22 lata
  • Ostatnio:ponad 9 lat
  • Postów:1668
0
BoZzDoG napisał(a)

[...] rozróżnić, czy kliknięto w puste miejsce komponentu (tam gdzie nie ma żadnego itemu) czy w jakiś item.

listbox powinien miec cos takiego jak ItemAtPos(x,y).

edytowany 1x, ostatnio: cimak
BZ
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 13 lat
  • Postów:64
0

Już wszystko wiem. Poeksperymentowałem trochę i mam rozwiązanie.

W załączniku przykładowy program. Dziękuję za zainteresowanie. Pozdrawiam.

edytowany 1x, ostatnio: BoZzDoG
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)