Virtual TreeView, kolorowanie, komórki wiecznie w edycji i button

0

Jeśli któryś z was korzystał z tego komponentu to prosiłbym o jakąś pomoc (niekoniecznie gotowiec, ale w którym zdarzeniu coś pisać i czego poszukać w PDFie tego komponentu konkretnie [czyli nazwy jakieś, nazwa funkcji lub czegoś innego] etc. Wtedy sobie do pdfa zajrzę lub w google spróbuję znaleźć czegoś na podstawie słówka, które podacie)

Dla zobrazowania opis wyglądu, na czym chcę działać:

  • dwie kolumny
  • na liście będzie np. 10 rzeczy wpisanych
  1. Jak pokolorować co drugą "linię", tak by miała np. szare tło? (pisząc "linia", mam na myśli pokolorowane całe komórki dwie [bo dwie kolumny są to 2 komórki pomalowane będą], a że lista ma 10 elementów dodanych to 5 będzie szara). Oczywiście tło ma być pod tekstem, bo chcę by w komórce tekst był widoczny.

  2. Chcę by każda komórka w tej tabeli była w formie "edycji", bo normalnie to muszę klikać dwa razy na komórkę by wlazła w tryb edycji, wolę by komórki wszystkie działały identycznie tak jak na forum jakimś lub w gmailu przy logowaniu klikacie w pole loginu, hasła i od razu jest w "edycji" bez zbędnego dodatkowego klikania.

  3. Jak wspomniałem, lista ma 10 pozycji i dwie kolumny, chcę by w drugiej kolumnie był button wszędzie z góry do dołu, czyli 10 buttonów łącznie, obok buttonów nie chcę żadnego tekstu. Czy to będzie proste do zrobienia? Chciałbym by dało radę zrobić coś w stylu (pseudokod)

  • <wstawiaj w="w" kolumnie="kolumnie" drugiej="drugiej" button="Button">

i wstawia button wszystkim 10 pozycjom na liście (a jeśli dodam nowy element do listy, jedenasty, to program sam doda kolejny button w drugiej kolumnie).

Pewnie miałbym problem z użyciem przycisków więc od razu zapytam, gdy kliknę w taki przycisk np. na pozycji numer 8, to da radę łatwo sprawdzić, w którą pozycję kliknąłem? I gdzie programować funkcję przycisków? Taki przycisk w moim przypadku wykonywałby działanie na komórce obok więc gdybym znał pozycję np. nr 8, to po prostu kazałbym buttonowi wykonać coś w komórce ósmej w kolumnie pierwszej (bo w drugiej kolumnie jest button).

I tym, którym chciało się to wszystko czytać dziękuję i przepraszam, że nie umiałem tego bardziej streścić.

2

Ad.1.

procedure Form1.VListBeforeCellPaint(Sender:TBaseVirtualTree;TargetCanvas:TCanvas;Node:PVirtualNode;Column:TColumnIndex;CellRect:TRect);
begin
  if ((Node.Index)and(1))=0 then Canvas.Brush.Color:=$F0F0F0;
  Canvas.FillRect(CellRect);
end;

Ad.2.

Na mouseDown -> VList.EditNode(...

Ad.3. Z przyciskiem będzie trudno, ale masz możliwość dodania checkbox'a w dowolnej kolumnie, oraz możliwość rysowania go tak jak sobie zażyczysz.

0

w Ad. 1 zapomniałeś o TargetCanvas zamiast Canvas, które pewnie odwoływało się do Formy, a nie do komponentu (no chyba, że to celowe? :D).
TargetCanvas.Brush.Color
itd

i działa świetnie, bardzo dziękuję. btw. ciekawie wymyśliłeś z tym operatorem AND

Ad. 2 sprawdzę za chwilę, a co do trzeciego punktu, to nie wiem, czy checkbox to dobry pomysł, bo chodziło mi o coś klikalnego jak Button, by kliknąć raz i by wykonała się moja funkcja obliczająca coś z komórki obok. Hmm, a może rysowanie obrazka wyglądającego trochę jak przycisk/ikona byłoby rozwiązaniem? wtedy miałbym zrobiony "button" jako ikonka klikalna, a już w innym miejscu bawiłbym się w oprogramowanie pojedynczego kliknięcia w każdą komórkę z kolumny drugiej i uzyskałbym to co chcę, pod warunkiem, że nie dałoby rady wpisywać nic w komórce z obrazkiem/ikoną, musiałaby ta komórka być zablokowana na treść. Rozwiązanie lamerskie? :D

0

co do Ad. 2, zrobiłem chyba tak jak pisałeś:

var
  Wskaznik: PVirtualNode;
  Kolumna: Integer;
begin
  Wskaznik := VirtualStringTree1.FocusedNode;
  Kolumna := VirtualStringTree1.FocusedColumn;

  VirtualStringTree1.EditNode(Wskaznik, Kolumna);

Niestety pod OnMouseDown wyskakiwał błąd przy klikaniu na dowolnej komórce, w błędzie było info, że node nie może być NIL. Wyciąłem ten kod i wkleiłem do OnMouseUP i tam działa świetnie.
W czym więc tkwić może problem? Próbowałem dopisać:

  if Assigned(Wskaznik) then
  begin
    Form1.Caption := 'tak';
    VirtualStringTree1.EditNode(Wskaznik, Kolumna);
  end;

ale tutaj wygląda jakby kod się nie wykonywał lub wykonywał bez efektu żadnego, mimo, że Caption formy zmieni się po kliknięciu w komórkę (choć dopiero po drugim zaznaczeniu komórki, bo wygląda jakby pierwsze kliknięcie w komórkę dopiero jakiś focus ustawiało i drugie dopiero wyświetla "tak"). Dziwna sprawa, że w OnMouseUP wszystko śmiga bez zabawy, a pod Down nie.

btw. mówisz, że chceckboxa mogę sam rysować po swojemu? myślałem, że mogę tylko wybrać jednego z paru gotowych, bo w necie podejrzałem checkboxy to były z krzyżykiem i jakieś jeszcze i myślałem, że o to rysowanie ci chodzi.

0

W OnMouseDown rzeczywiście może dopiero ustawiać focus, więc jak ci tak zależy na OnMouseDown to daj przez timer.
Tak, możesz rysować po swojemu.

0

dzięki, zostanę przy OnMouseUP, odpowiada mi. Tylko teraz chciałbym by kliknięcie w komórkę nie zaznaczało mi tekstu w komórce (tak jak to robi pasek adresu w przeglądarce), wolałbym by ta migająca przy pisaniu kreska była na końcu wyrazu/zdania w komórce, czyli dokładnie tak jak przy logowaniu na gmail.com, masz wpisany login tam, przejdziesz do pola z hasłem i klikniesz znowu na login, to nie zaznaczy ci loginu, tylko ustawi tę kreskę (focus) na końcu loginu i właśnie też tak chcę. Czy mam to zrobić w banalny sposób jak symulacja naciśnięcia prawej strzałki jeden raz, czy może są lepsze sposoby na to? :)

0

SelStart - dla każdego Editora

0

Źle szukam, albo nie widzę SelStart przy tym komponencie, w ebooku komponentu w wyszukiwarce także nie znajduje mi SelStart. Czy ten komponent na pewno ma tę funkcję? Wiem, że memo, richedit i inne mają

0

EditLink, zwraca ci interface z niego pobierasz TWinControl który rzutujesz na TEdit dla którego wykonujesz SelStart:=maxint;

0

A słówko więcej? Bo nie bardzo rozumiem. Mam coś rzutować w stylu TEdit(tutaj coś).SelStart? Czy jak? Jeśli tak to co dokładniej w tym nawiasie? Wiem, że mogę cię irytować takimi pytaniami, mam marną wiedzę na razie, nie zajmowałem się nigdy takim rzutowaniem, bo nie było mi to potrzebne.
btw. i dziękuję za dotychczasową pomoc

0

btw. z tą edycją komórki kliknięciem to trzeba kod umieścić w OnColumnClick, po to żeby nie było problemu z zakończeniem edycji po kliknięciu w cokolwiek poza komórką

A teraz ponownie mam prośbę, czy mógłbyś mi napisać coś więcej o tym rzutowaniu? Nie udało mi się tego wykonać, próbowałem w google szukać informacji i bezskutecznie

1 użytkowników online, w tym zalogowanych: 0, gości: 1