Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Vykreslovani ve StringGridDrawCell (Delphi)

Zdravím.
Proč mi strinGrid nechce sám překreslovat.
Je třeba něco v properties nastavit?

Když třeba ve StringGrid1DrawCell nechám do buňky vykreslit nějaký obrázek (třeba s ImageList)a spustím to, tak se to zobrazí až když kliknu na řádek,na který to vykreslují.

Předmět Autor Datum
Proč? Proč? Že by si sem dal celú udalosť onDrawCell, ako to vykresluješ?
pme 26.06.2013 19:36
pme
procedure TSubnetDirectHermanice.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRec…
Marek.H 26.06.2013 19:45
Marek.H
Protoze StringGrid vykresluje az pri potrebe - kdyz se zmeni obsah bunky. On nevi, ze mu tam kreslis…
Jan Fiala 26.06.2013 19:47
Jan Fiala
StringGrid.Invalidate pomohlo, dik. Ještě by byl dotaz. Chtěl bych ve 2 sloupci, aby se data zarovn…
Marek.H 26.06.2013 20:02
Marek.H
var TW, TL:Integer; begin ... if ACol = 2 then begin TW := StringGrid.Canvas.TextWidth(StringGrid.Ce…
pme 26.06.2013 20:34
pme
Uzivatelskym vykreslovanim dat. Misto Canvas.TextOut() lze pouzit DrawText(), ktera uz zama o sobe u…
Jan Fiala 26.06.2013 20:35
Jan Fiala
Tak jsem vyzkoušel těch par řádku od pme a funguje to,dik. Je však jeden problem. V programu mi běží…
Marek.H 27.06.2013 05:59
Marek.H
Opravdu ta cisla vykreslujes v nejake udalosti pro kresleni? Nezapomel jsi na radek: StringGrid.Canv…
Jan Fiala 27.06.2013 07:36
Jan Fiala
a) Vykreslují v StringGridDrawCell b) Nezapomněl. procedure TForm1.StringGrid1DrawCell(Sender: TObj…
Marek.H 27.06.2013 08:05
Marek.H
Načo máš deklarovanú premennú var R: Trect; keď ju nikde nepoužívaš? Skús dať StringGrid.Invalida…
pme 27.06.2013 08:11
pme
Promin, ale StringGrid.Invalidate; nema v OnDrawCell co delat! To nedela nic jineho, nez ze to zase…
Jan Fiala 27.06.2013 09:13
Jan Fiala
R: Trect tam asi zustal s nějakeho pokusu, smazan. To StringGrid.Invalidate jsem tam přidal kvuli to…
Marek.H 27.06.2013 17:24
Marek.H
JaFi má pravdu: StringGrid.Invalidate; nema v OnDrawCell co delat! Skús zabaliť celý projekt do *.…
pme 27.06.2013 18:29
pme
Tak jsem dnes ráno vytvořil úplně novy projekt a hledal problem. Pokud je StringGrid v projektu v de…
Marek.H 28.06.2013 05:04
Marek.H
A blbne to i v tom default stavu pokud kliknete myši na bunku před a chcete označit vice buněk v 1 ř…
Marek.H 28.06.2013 07:17
Marek.H
Uloz nekam zdrojak at se na to muzeme podivat. Jinak to opravdu nikam nepovede.
Jan Fiala 28.06.2013 07:39
Jan Fiala
321923867
Marek.H 28.06.2013 08:09
Marek.H
V D7 uplne bez problemu Zkus ve FormCreate zrusit radek: StringGrid1.DoubleBuffered := True;
Jan Fiala 28.06.2013 08:40
Jan Fiala
Počkám ještě zda se ozve pme. Dělám to na XE2 a on je ma. StringGrid1.DoubleBuffered := True je tam…
Marek.H 28.06.2013 15:20
Marek.H
Pozrel som ten Tvoj výtvor... Nepochopil som o čo Ti v tom programe ide... Snažíš sa niečoho dosiahn…
pme 28.06.2013 19:33
pme
Toto byl jen tak na rychlovku splácaný novy projekt, který nedává žádny smysl, do kterého jsem dal t…
Marek.H 29.06.2013 06:06
Marek.H
pro pme Tak jsem dal na Vaše rady. Stahnul a nainstaloval Delphi 7 Vytvořil novy projekt a do něj da…
Marek.H 29.06.2013 06:51
Marek.H
Síce netuším prečo si si zvolil TStringGrid... Ale ak Ťa už omrzí sa trápiť s touto "nepodarenou" ko…
pme 29.06.2013 11:25
pme
Asi jo ale začali prázdniny, tak to budu muset odložit. Nerad bych je proseděl u PC. Tak teda dík mo…
Marek.H 29.06.2013 12:33
Marek.H
Tie komponenty sú do D2007... Bez menšej úpravy to nepôjde, ale dá sa... Takto: docwiki.embarcadero.…
pme 29.06.2013 13:58
pme
Děkují moc.Vyzkoušim. poslední
Marek.H 29.06.2013 16:35
Marek.H
procedure TSubnetDirectHermanice.StringGridDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
R: TRect;
begin
if (Acol = 0) and (ARow > -1) then
      if StringGrid.Cells[3,ARow] = '1' then
      ImageList1.Draw(StringGrid.Canvas, Rect.Left-2 , Rect.Top +4 , 1)
      else
      ImageList1.Draw(StringGrid.Canvas, Rect.Left-2 , Rect.Top +4 , 2);
end;

Sloupec 3 je pomocny(pracovní).
Vykresluje se do sloupce 0.
Pokud bude na řadku ve 3 sloupci 1 vykresli obrazek s komponenty ImageList1 s pozice 1

Protoze StringGrid vykresluje az pri potrebe - kdyz se zmeni obsah bunky.
On nevi, ze mu tam kreslis obrazek, ale vi, ze tam ma hodnotu 1 a ta se zmenila na 2, tak zavola vykresleni bunky. Podobne, jako kdyz na bunku kliknes - pak se opet bunka vykresluje.

Na tobe je, abys bud zmenil obsah bunky - pokud je to hra, muzes si klidne v bunce drzet stav nebo proste zavolas prekresleni gridu, napr. StringGrid.Invalidate

P.S.
Ve tvem pripade tu jednicku nezapisuj do pomocneho tretiho sloupce, ale primo do slupce, kde vykreslujes.

var
  TW, TL:Integer;
begin
  ...
  if ACol = 2 then
   begin
     TW := StringGrid.Canvas.TextWidth(StringGrid.Cells[ACol, ARow]);
     TL := Rect.Right - TW - 4;
     StringGrid.Canvas.FillRect(Rect);
     StringGrid.Canvas.TextOut(TL, Rect.Top + 4, StringGrid.Cells[ACol, ARow]);
   end;
end;

Tak jsem vyzkoušel těch par řádku od pme a funguje to,dik.
Je však jeden problem.
V programu mi běží vlákno, které do toho sloupce ukrádá furt nova data (čísla).
Ve Stringridu mám zaply RowSelect.
Když kliknu na nějaký řádek tak v tom sloupci, na tom vybraném řádku jsou ty čísla vidět 2 X.
Zarovnaně v vlevo i v právo.
Řešení by bylo ukládat ty data s vlákna do nějakého pomocného sloupce s hodnotou -1 a pak je v DrawCell překreslovat do toho 2 sloupce.
Nebo je i jiné řešení?

a) Vykreslují v StringGridDrawCell
b) Nezapomněl.

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol,
ARow: Integer;Rect: TRect; State: TGridDrawState);
var
R: TRect;
TW, TL:Integer;
begin
if (Acol = 0) and (ARow > -1) then
if StringGrid.Cells[3,ARow] = '-1' then
ImageList1.Draw(StringGrid.Canvas, Rect.Left-2 , Rect.Top +4 , 1)
else
ImageList1.Draw(StringGrid.Canvas, Rect.Left-2 , Rect.Top +4 , 2);
StringGrid.Invalidate;

if ACol = 3 then
begin
TW := StringGrid.Canvas.TextWidth(StringGrid.Cells[ACol, ARow]);
TL := Rect.Right - TW - 4;
StringGrid.Canvas.FillRect(Rect);
StringGrid.Canvas.TextOut(TL, Rect.Top + 4, StringGrid.Cells[ACol, ARow]);
end;
end;

Promin, ale StringGrid.Invalidate; nema v OnDrawCell co delat! To nedela nic jineho, nez ze to zase zavola vykresleni.
Invalidate si zavolej nekde, kde menis obsah StringGridu. Ale urcite ne ve vlakne. K tomu slouzi napr. metoda Synchronize.

Počkám ještě zda se ozve pme.
Dělám to na XE2 a on je ma.

StringGrid1.DoubleBuffered := True je tam schválně.
Když začne vlákno do StringGridu zapisovat, tak StringGrid nepříjemně problikává.

Jinak si nevím rady.
Kdyby vlákno ty výsledky zapisovalo do pomocného sloupce (třeba sloupce 4).
Jak to udělat ve StringGridDrawCell, aby si ten text načetlo se 4 sloupce a uložilo do 3 zarovnaně k pravému okrají.

Pozrel som ten Tvoj výtvor... Nepochopil som o čo Ti v tom programe ide...
Snažíš sa niečoho dosiahnuť a pletieš tam veci, ktoré tam byť nemajú/nemusia.
Načo tam máš vlákno? K čomu? Absolútne zle !!! Takto sa s vláknom nepracuje, ak nevieš ako na to, radšej to vlákno nechaj na iné pokusy...

Stanov si cieľ a potom vymýšľaj, ako sa k nemu dopracovať. Ty možno máš cieľ, ale v jednom projekte si "skúšaš" prácu so StringGridom - nevieš ako sa s ním pracuje...
A navyše tam chceš mať vlákno, ktoré beží dookola neustále - bez zastavenia...]:(

Program si rozlož na malé úlohy:
1. Načítať dáta do bunky
2. Prekresliť bunky podľa nejakého kritéria
3. Zarovnať bunku
atď.

Ty tam chceš mať snáď všetko a jediné čo máš je "myšmaš"...

Ak sa učíš, potom sa uč postupne. Ak už tvoríš niečo zmysluplné - potom tam nepleť vlákno, s ktorým nevieš...

Toto byl jen tak na rychlovku splácaný novy projekt, který nedává žádny smysl, do kterého jsem dal to co mi blbne.

Smysl celého programu je že si do sloupce 1 načte se souboru IP adresy.
Vlákna si na ip adresy pingají a výsledky zapisuje do sloupce 2.
A to vykreslovaní.
Pokud se vrátí pong -1, pc není zaplé a vykresli červenou, při funkčním zelenou.

No budu se muset smiřit s tim že text nebude zarovnan k pravemu okrají.

pro pme
Tak jsem dal na Vaše rady.
Stahnul a nainstaloval Delphi 7
Vytvořil novy projekt a do něj dal jen.

procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Cells[1,1]:='10';
StringGrid1.Cells[1,2]:='20';
StringGrid1.Cells[1,3]:='10';
StringGrid1.Cells[1,4]:='20';
StringGrid1.Cells[1,5]:='10';
StringGrid1.Cells[1,6]:='20';
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
TW, TL:Integer;
begin
if ACol = 1 then
begin
TW := StringGrid1.Canvas.TextWidth(StringGrid1.Cells[ACo l, ARow]);
StringGrid1.Canvas.FillRect(Rect);
TL := Rect.Right - TW - 4;
StringGrid1.Canvas.TextOut(TL, Rect.Top + 4, StringGrid1.Cells[ACol, ARow]);
end;
end;

Vyzkoušel jsem i toto http://stackoverflow.com/questions/4720255/ondrawc ell-center-text-stringgrid-delphi

Vše nadherně funguje.
Pokud to uložím a pak otevřu v XE2 tak je to posmolene.
eeeeejuj.jpg

Síce netuším prečo si si zvolil TStringGrid... Ale ak Ťa už omrzí sa trápiť s touto "nepodarenou" komponentou, potom sa pozri na TListView. ;-)
Ušetríš si veľa námahy a ručného písania kódu s užívateľským vykresľovaním.

TListView má mnoho vlastností, ktoré Ti ušetria čas a námahu:

ViewStyle nastaviť na vsReport, vytvoriť Columns - Aligment, AutoSize, ImageIndex... Všetko si naklikáš... :-)

Asi jo ale začali prázdniny, tak to budu muset odložit.
Nerad bych je proseděl u PC.
Tak teda dík moc za ochotu.

PS:jelikož jsou ty prázdniny, tak ve škole žádnou pomoc nenajdu.
Ještě jsem nikdy neinstaloval v delphi žádné komponenty.
Když mate ty XE2.
Neprozradil by jste zda tam dostanu komponentu TPubStrGrid - TPubSortStrGrid
A jak na to.
http://www.slunecnice.cz/sw/tpubstrgrid-tpubsortst rgrid/
Stahl jsem jí tady delphi

Tie komponenty sú do D2007... Bez menšej úpravy to nepôjde, ale dá sa...
Takto: docwiki.embarcadero.com.

V skratke:
1. Vytvoríš priečinok, kde nakopíruješ súbor s komponentou
2. Otvoríš Delphi a vytvoríš balíček
3. Pridáš unit súbor, v ktorom sa nachádza komponenta
4. Uložíš projekt do adresára, ktorý si vytvoril vyššie
5. Pravý klik na balíček - Compile, Install
6. Ak je potrebné zadáš cestu pre knižnice v nastaveniach Delphi - Library

Zpět do poradny Odpovědět na původní otázku Nahoru