Stringgrid i przewijanie Scrolla zamiast focusa

Stringgrid i przewijanie Scrolla zamiast focusa
maxiu1989
  • Rejestracja:około 13 lat
  • Ostatnio:ponad rok
  • Postów:84
0

Witam

Tym razem chciałbym zrobić tak żeby scroll w myszce przesuwał pozycje scrollbara a nie focusa na stringgridzie.
Jest to bardzo nie naturalne.

Czy to bedzie trzeba robić "StringGrid1MouseWheelDown" i "toprow" ? Czy odblokuje to jakos inaczej?


MaX (PC) DamaGe
edytowany 2x, ostatnio: olesio
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:43 minuty
  • Lokalizacja:Tuchów
  • Postów:12168
2

Raczej tego nie odblokujesz, choć nie wiem jakie właściwości i metody są w klasie TStringGrid w nowszych środowiskach, niż Delphi7; Google też wiele nie wyjaśnia w tej sprawie - najprawdopodobniej nie można tego włączyć/wyłączyć za pomocą jakiejś właściwości, jednak można obsłużyć odpowiednie zdarzenia;

EDIT: Udało się napisać algorytm, który bez względu na wysokość poszczególnych wierszy będzie działał poprawnie (a przynajmniej tak wynika z testów); Stary usunąłem z posta;

Działające rozwiązanie:

Kopiuj
procedure TForm1.StringGrid1MouseWheelDown(Sender: TObject;
  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
var
  intRowsHeightSum, I: Integer;
begin
  Handled := True;

  with (Sender as TStringGrid) do
  begin
    intRowsHeightSum := 0;
    I := TopRow;

    while (I <= RowCount) and (intRowsHeightSum < Height) do
    begin
      Inc(intRowsHeightSum, RowHeights[I]);
      Inc(I);
    end;

    if intRowsHeightSum > Height then
      TopRow := TopRow + 1;
  end;
end;

procedure TForm1.StringGrid1MouseWheelUp(Sender: TObject;
  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
  Handled := True;

  with (Sender as TStringGrid) do
    if TopRow > FixedRows then
      TopRow := TopRow - 1;
end;

Mam nadzieję, że nie tylko u mnie działa bez zarzutu.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 4x, ostatnio: flowCRANE
maxiu1989
Twój dużo lepszy, czasami przycina lekko ostatni wiersz, ale to nic takiego :)
maxiu1989
  • Rejestracja:około 13 lat
  • Ostatnio:ponad rok
  • Postów:84
0

Także zrobiłem podobnie.
Źródło : http://www.delphipages.com/forum/showthread.php?t=175685

Zrobiłem coś takiego, załozyłem że 5 wierszy będzie zawsze widoczne.
Wsume wystarczające, ale jeszcze Twój przetestuje :P

Kopiuj
procedure TForm1.StringGrid1MouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
  var
  toprow : integer;
begin
 
if (Shift = [ssShift])  then
Handled := false else //StringGrid1.LeftCol := StringGrid1.LeftCol -1;
begin
Handled := true; //scrolls the grid, not the selection
toprow :=  StringGrid1.topRow;
if StringGrid1.topRow < StringGrid1.RowCount -5 then StringGrid1.topRow := toprow + 1;
end;
end;
 
procedure TForm1.StringGrid1MouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
  var
  toprow : integer;
begin
 
if (Shift = [ssShift]) then
Handled := false else 
begin
Handled := true;
toprow :=  StringGrid1.topRow;
if toprow > 1 then StringGrid1.topRow := toprow - 1;
 
 
end;
end;

MaX (PC) DamaGe
flowCRANE
Przy pisaniu swojej wersji algorytmu posłużyłem się m.in. tym samym artykułem, co podałeś w linku ;)
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:43 minuty
  • Lokalizacja:Tuchów
  • Postów:12168
1

Twój dużo lepszy, czasami przycina lekko ostatni wiersz, ale to nic takiego :)

Napisz w jakim przypadku się przycina to postaram się poprawić;


Edit: Do powyższego algorytmu należy dodać także sumowanie wysokości wszystkich FixedRows oraz za każdym razem GridLineWidth żeby obliczenia były dokładniejsze; Żeby nie było żadnych pikselowych wątpliwości i niedociągnięć trzeba znać grubość obwódki kontrolki, którą niestety narzuca system; Poprawiona wersja algorytmu poniżej:

Kopiuj
procedure TForm1.StringGrid1MouseWheelDown(Sender: TObject;
  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
var
  intRowsHeightSum, I: Integer;
begin
  Handled := True;

  with (Sender as TStringGrid) do
  begin
    intRowsHeightSum := 0;

    for I := 0 to FixedRows - 1 do
      Inc(intRowsHeightSum, RowHeights[I] + GridLineWidth);

    I := TopRow;

    while (I < RowCount) and (intRowsHeightSum <= ClientHeight) do
    begin
      Inc(intRowsHeightSum, RowHeights[I] + GridLineWidth);
      Inc(I);
    end;
 
    if intRowsHeightSum >= ClientHeight then
      TopRow := TopRow + 1;
  end;
end;

Algorytm działa niemalże bezbłędnie ale tylko wtedy, gdy BorderStyle ustawiony jest na bsNone; Jeśli kontrolka będzie miała jakąś obwódkę, to trzeba jej podwójną wartość (jako ramka górna i dolna) wpisać do zmiennej intRowsHeightSum przed pętlą sumującą - wtedy nie będzie pomyłek.

EDIT2: @maxiu1989 - algorytm poprawiłem jeszcze raz - nie trzeba znać grubości obwódki kontrolki, bo jest do dyspozycji właściwość ClientHeight, dzięki której dokładnie wiadomo jaka jest powierzchnia robocza kontrolki; Nie tylko pomijamy grubość ramki kontrolki, ale także grubość poziomego paska przesuwu (Horizontal Scrollbar), który także mieszałby w obliczeniach; Tak więc po raz ostatni modyfikuję algorytm; No chyba, że trzeba go będzie wyposażyć w obsługę jeszcze innych "przeszkadzających" elementów.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 8x, ostatnio: flowCRANE
maxiu1989
Tak, teraz działa w każdych warunkach. Kawał dobrego gotowca :) Serdeczne dziękuję.
flowCRANE
W każdych będzie działał, jeśli mając BorderStyle na bsSingle znasz szerokość linii obwódki kontrolki - wtedy powinien działać bezbłędnie; Jeśli zaś BorderStyle jest na bsNone - powyższy będzie działał bezbłędnie (a przynajmniej tak wynika z testów); Nie ma sprawy :>
maxiu1989
Wow :D to dogłębnie zbadałeś sprawę, nawet bym o wielu rzeczach nie pomyślał... Hmm
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)