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í.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
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… nový
pme 26.06.2013 20:34
pme
Uzivatelskym vykreslovanim dat. Misto Canvas.TextOut() lze pouzit DrawText(), ktera uz zama o sobe u… nový
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ěží… nový
Marek.H 27.06.2013 05:59
Marek.H
Opravdu ta cisla vykreslujes v nejake udalosti pro kresleni? Nezapomel jsi na radek: StringGrid.Canv… nový
Jan Fiala 27.06.2013 07:36
Jan Fiala
a) Vykreslují v StringGridDrawCell b) Nezapomněl. procedure TForm1.StringGrid1DrawCell(Sender: TObj… nový
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… nový
pme 27.06.2013 08:11
pme
Promin, ale StringGrid.Invalidate; nema v OnDrawCell co delat! To nedela nic jineho, nez ze to zase… nový
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… nový
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 *.… nový
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… nový
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 ř… nový
Marek.H 28.06.2013 07:17
Marek.H
Uloz nekam zdrojak at se na to muzeme podivat. Jinak to opravdu nikam nepovede. nový
Jan Fiala 28.06.2013 07:39
Jan Fiala
321923867 nový
Marek.H 28.06.2013 08:09
Marek.H
V D7 uplne bez problemu Zkus ve FormCreate zrusit radek: StringGrid1.DoubleBuffered := True; nový
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… nový
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… nový
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… nový
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… nový
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… nový
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… nový
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.… nový
pme 29.06.2013 13:58
pme
Děkují moc.Vyzkoušim. poslední
Marek.H 29.06.2013 16:35
Marek.H
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