Wizualny defekt z kolorowaniem StringGrid

Wizualny defekt z kolorowaniem StringGrid
ET
  • Rejestracja:około 11 lat
  • Ostatnio:około 11 lat
  • Postów:9
0

Witam

Poczytałem trochę na temat kolorowania pół string grid i wybrałem moim zdaniem najprostszy sposób do mojego celu, ale pojawił się problem.
Wpisałem sobie taki kod:

Kopiuj
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
const nr : array [0..22] of Boolean = (false, false, false, true, true, false, false, true, true, false, false, true, true, false, false, true, true, false, false, true, true, false, false);
begin
  if nr[ARow] then begin
    StringGrid1.Canvas.Brush.Color:= $00FDECD7;
    StringGrid1.Canvas.Rectangle(aRect);
    StringGrid1.Canvas.TextOut(aRect.Left,aRect.Top,StringGrid1.Cells[ACol,ARow] );
  end;
end;

Kod ten koloruje całe wiersze w STringGrid ustawionym kolorem w Canvas.Brush.Color.
Posłużyłem się tablicą stałych bo koloruje sobie wybrane wiersze w efekcie mam 2 wiersze białe kolejne 2 pokolorowane i tak na zmianę.
Ale jest jeden wizualny problem. Jeśli koloruję w ten sposób to przesuwa mi się tekst w tych wierszach które pokolorowałem i dodatkowo pojawiają się wygryzione linie efekt nakładania się pola z tekstem na linie dzielącą komórki ale tu ta linia robi się grubsza.
Dołączam screena:

user image

Jak to coś naprawić, żeby tekst nie przesuwał się tak jak w tych wierszach, które nie kolorowałem???

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1
Kopiuj
StringGrid1.Canvas.TextOut(aRect.Left+3,aRect.Top+3,StringGrid1.Cells[ACol,ARow] );

Poza tym, jak narysujesz wszystkie to wszystkie będą wyglądać podobnie.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
flowCRANE
Byłeś szybszy ;)
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Tuchów
  • Postów:12168
0
Kopiuj
StringGrid1.Canvas.TextOut(aRect.Left,aRect.Top,StringGrid1.Cells[ACol,ARow] );

W tej metodzie musisz dodać offsety od lewej i górnej krawędzi, bo inaczej tekst będzie dosunięty;

Kopiuj
StringGrid1.Canvas.TextOut(ARect.Left + 2, ARect.Top + 2, StringGrid1.Cells[ACol, ARow]);

Ta linijka spowoduje narysowanie tekstu z dwupikselowym marginesem (od lewej i od góry); Jeśli chcesz większe marginesy to zwiększ offsety;

Dobra rada - jak już zabierasz się za własne malowanie komponentu, to maluj każdy wiersz; Dzięki temu będziesz miał jednakowo malowane i te białe, i te niebieskie; Wszystko możesz załatwić za pomocą jednego zestawu metod rysujących - reszta to tylko ustawienie koloru tła;

Poza tym wykorzystana macierz jest zbędna, dlatego że nie wiesz ile pozycji będzie w komponencie; Możesz to przecież obliczyć, np. tak:

Kopiuj
with TStringGrid(Sender).Canvas do
begin
  Font.Color := clBlack;

  if (ARow - 1) mod 4 < 2 then
  begin
    Pen.Color := clWhite;
    Brush.Color := clWhite;
  end
  else
  begin
    Pen.Color := $00FDECD7;
    Brush.Color := $00FDECD7;
  end;

  Rectangle(ARect);
  TextOut(ARect.Left + 2, ARect.Top + 2, TStringGrid(Sender).Cells[ACol, ARow]);
end;

Dzięki temu tekst w każdym wierszu będzie miał taki sam odstęp od krawędzi komórki, no i wykluczysz konieczność stosowania macierzy wartości logicznych.


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 3x, ostatnio: flowCRANE
_13th_Dragon
if ((ARow-1) mod 4) &lt; 2 then
flowCRANE
A no racja - nie zauważyłem, że są komórki nagłowkowe;
LU
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 11 lat
0

Zamiast Canvas.Rectangle i Canvas.TextOut spróbuj Canvas.FillRect i Canvas.TextRect. W tym ostatnim X i Y daj na 0.

Zobacz pozostałe 11 komentarzy
LU
To teraz porównaj sobie twoje rozwiązanie z moim. Moje ogranicza się do użycia innych funkcji (od biedy można było rzeczywiście użyć TextOut, ale, dla mnie, o wiele bardziej intuicyjne jest użycie metod uszczegółowionych) i zero dodatkowych linii kodu. A twoje?
flowCRANE
Jedno przypisanie więcej (Pen), jeden parametr mniej (jeden problem z głowy), całkowite pozbycie się macierzy wartości logicznych (drugi problem z głowy), jednakowe rysowanie tekstu we wszystkich wierszach (kolejny problem wyrównania tekstu z głowy); Źle?
LU
Zero przypisań więcej, zero linii więcej, zero ingerencji w oryginalny algorytm problemu, podany sposób rozwiązuje problem w całości prostymi środkami i jednocześnie wskazuje źródło błędu. Gorzej? Nic nie wnosi do tematu?
flowCRANE
FillRect poniekąd, bo przysporzył kolejnego problemu, TextRect nic;
LU
I znowu się mylisz, bo FillRect rozwiązał problem pojawiającej się ramki i nie miał nic wspólnego z rozsypywaniem się tekstu.
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

Jak Ci to zacznie działać w zadowalający sposób to podaj rozwiązanie, ciekaw jestem efektu.

ET
  • Rejestracja:około 11 lat
  • Ostatnio:około 11 lat
  • Postów:9
0

Dodanie po 2 piksele nie do końca pomaga , na to już wcześniej wpadłem w tych wierszach kolorowanych są pogrubione szare linie i tekst nadal jest bliżej lewej krawędzi, a dodawanie większej ilości jeszcze pogarsza efekt.

Malowanie całości też nie bardzo się sprawdzi bo tekst poprzesuwa się we wszystkich komórkach.

Spróbuje użyć tej innej funkcji zamiast texxtout.

A korzystam z macierzy bo zamierzałem kolorować niesymetrycznie więc nie da się tego zapisać w postaci IF, a tak sobie ustawie najprościej jak się da w macierzy true lub false.

edytowany 1x, ostatnio: elTwardy
_13th_Dragon
Przecież powiedziałem - 3 piksele. Albo użyj przed tym InflateRect(Arect,-1,-1);
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
1

przed StringGrid1.Canvas.TextOut dodaj StringGrid1.Canvas.Brush.Style := bsClear


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
_13th_Dragon
Wtedy źle będzie wyglądać tekst.
abrakadaber
abrakadaber
a niby dlaczego?
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0
abrakadaber napisał(a):

a niby dlaczego?

eadf2145e2.png
Zgadnij z dwóch raz które zrobione z bsClear.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
_13th_Dragon
Oczywiście przy jasnym tle nie będzie to aż tak wyraźnie widoczne, ale niektórzy ludzi mają dobry wzrok.
MI
  • Rejestracja:ponad 15 lat
  • Ostatnio:prawie 9 lat
0

zamiast

Kopiuj
Rectangle(ARect);

daj

Kopiuj
FillRect(ARect);

wtedy nie będzie dodatkowych pogrubionych linii.

edytowany 1x, ostatnio: misiakufal
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
0

no popatrz a mi całkiem coś innego wyszło...
kod:

Kopiuj
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    img1: TImage;
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
  with img1.Canvas do
  begin
    Brush.Style := bsSolid;
    Brush.Color := clRed;
    FillRect(img1.ClientRect);
    Font.Color := clBlack;TextOut(2, 10, 'Test');
    Brush.Style := bsClear;
    Font.Color := clBlack;TextOut(2, 30, 'Test');
  end;
end;

end.

user image

A tu masz Microsoft Sans Serif rozmiar 20

user image

Kopiuj
    Font.Size := 20;
    Font.Name := 'Times New Roman';
    Font.Color := clBlack;TextOut(2, 10, 'Test');
    Brush.Style := bsClear;
    Font.Color := clBlack;TextOut(2, 35, 'Test');

user image


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
edytowany 3x, ostatnio: abrakadaber
Zobacz pozostałe 5 komentarzy
flowCRANE
Dokładnie; Choć nie wiem po co ustawiać BrushStyle, skoro przy zwykłym Brush.Color i TextOut poprawnie rysuje - z tłem i wygładzaniem; Chyba, że na nowszych systemach jest problem to rozumiem;
_13th_Dragon
Nie zawsze tło jest jednolite. W tym przypadku napis najeżdżał na ramkę rysowaną przez Rectangle i częściowo ją zamazywał, na co @abrakadaber zaproponował Brush.Style:=bsClear; (ja też myślałem że autor postu chce tej dodatkowej ramki). Ja myślałem że w tym przypadku nie działa wygładzanie (nigdy), ale okazuje się że nie działa tylko pod niektórymi windowsami.
flowCRANE
Wiem, wiem - tutaj jednak jest plus, bo jest jednolite; Jakoś to wygładzanie działa - trzeba by sprawdzić różne warianty;
_13th_Dragon
Dopóki była ramka - nie było jednolite.
flowCRANE
Było - ta ramka była niechciana, pytacz wspomniał o tym; No i z jego kodu to wynikało ;)
ET
  • Rejestracja:około 11 lat
  • Ostatnio:około 11 lat
  • Postów:9
0

OK problem rozwiązany i wyszło w miarę idealnie, musiałem tylko dodać 3 do X bo tekst w kolorowanym wierszu przesunął się do lewej krawędzi:

Kopiuj
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
const nr : array [0..22] of Boolean = (false, false, false, true, true, false, false, true, true, false, false, true, true, false, false, true, true, false, false, true, true, false, false);
begin
  if nr[ARow] then begin
    StringGrid1.Canvas.Brush.Color:= $00FDECD7;
    StringGrid1.Canvas.FillRect(aRect);
    StringGrid1.Canvas.TextRect(aRect,3,0,StringGrid1.Cells[ACol,ARow]);
  end;
end; 

Nie jednak jeszcze nie jest idealnie. Pojawił się nowy problem znika mi tekst w kolejnych kolumnach ale w pierwszej kolumnie jest ok :D
Ki diabeł ?!?!

edytowany 1x, ostatnio: elTwardy
LU
@elTwardy, to ja jeszcze podpowiem (o czym zapomniałem wcześniej), że jeśli zamierzasz zmieniać rozmiar okna, albo przewijać tabelkę w poziomie, lepiej zamiast stałych marginesów X i Y dać aRect.Left + coś i aRect.Top + coś tam. Unikniesz problemu, który właśnie się pojawił.
LU
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 11 lat
0
Kopiuj
 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);

const nr : array [0..22] of Boolean = (false, false, false, true, true, false, false, true, true, false, false, true, true, false, false, true, true, false, false, true, true, false, false);

begin
   if nr[ARow] then begin
    StringGrid1.Canvas.Brush.Color:= $00FDECD7;
    StringGrid1.Canvas.FillRect(aRect);
    StringGrid1.Canvas.TextRect(aRect, aRect.Left+3, aRect.Top+3, StringGrid1.Cells[aCol, aRow]);
  end;
end;       

Powinno śmigać. Efekt w załączniku

edytowany 1x, ostatnio: Luc
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Tuchów
  • Postów:12168
0

1.

elTwardy napisał(a)

Ale jest jeden wizualny problem. Jeśli koloruję w ten sposób to przesuwa mi się tekst w tych wierszach które pokolorowałem

_13th_Dragon napisał(a)
Kopiuj
StringGrid1.Canvas.TextOut(aRect.Left+3,aRect.Top+3,StringGrid1.Cells[ACol,ARow] );
Furious Programming napisał(a)
Kopiuj
StringGrid1.Canvas.TextOut(ARect.Left + 2, ARect.Top + 2, StringGrid1.Cells[ACol, ARow]);

2.

elTwardy napisał(a)

i dodatkowo pojawiają się wygryzione linie efekt nakładania się pola z tekstem na linie dzielącą komórki ale tu ta linia robi się grubsza.

Kopiuj
  if (ARow - 1) mod 4 < 2 then
  begin
    Pen.Color := clWhite; // <-
    {...}
    Pen.Color := $00FDECD7; // <-

Rozwiązania problemu @elTwardy są zawarte w pierwszych dwóch postach odpowiedzi; Trzeba tylko je przetestować zamiast kombinować, bo pytacz miał dobry kod, tyle że podawał nie do końca poprawne parametry aby rysowanie przebiegało prawidłowo, tak jak sobie tego życzył.


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.
ET
  • Rejestracja:około 11 lat
  • Ostatnio:około 11 lat
  • Postów:9
0
Luc napisał(a):
Kopiuj
 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);

const nr : array [0..22] of Boolean = (false, false, false, true, true, false, false, true, true, false, false, true, true, false, false, true, true, false, false, true, true, false, false);

begin
   if nr[ARow] then begin
    StringGrid1.Canvas.Brush.Color:= $00FDECD7;
    StringGrid1.Canvas.FillRect(aRect);
    StringGrid1.Canvas.TextRect(aRect, aRect.Left+3, aRect.Top+3, StringGrid1.Cells[aCol, aRow]);
  end;
end;       

Powinno śmigać. Efekt w załączniku

OK, ta wersja wygląda już prawidłowo.
Dzięki za pomoc.

flowCRANE
Zaznacz więc post @Luc jako rozwiązanie i rozdaj plusiki pomocnym postom - pamiętaj o tym na przyszłość, że w ten sposób kończy się tutaj dyskusję;
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)