
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í.
Proč? Proč? Že by si sem dal celú udalosť onDrawCell, ako to vykresluješ?
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.
StringGrid.Invalidate pomohlo, dik.
Ještě by byl dotaz.
Chtěl bych ve 2 sloupci, aby se data zarovnavali k pravemu okrají.
Jde to nějak vyřešit?
Upozornují že jsem lama
Uzivatelskym vykreslovanim dat.
Misto Canvas.TextOut() lze pouzit DrawText(), ktera uz zama o sobe umi zarovnat text kam potrebujes.
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í?
Opravdu ta cisla vykreslujes v nejake udalosti pro kresleni?
Nezapomel jsi na radek:
StringGrid.Canvas.FillRect(Rect); - ten totiz maze obsah bunky
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;
Načo máš deklarovanú premennú
keď ju nikde nepoužívaš?
Skús dať StringGrid.Invalidate; úplne na koniec procedúry...
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.
R: Trect tam asi zustal s nějakeho pokusu, smazan.
To StringGrid.Invalidate jsem tam přidal kvuli tomu že to nechtělo překreslovat ty obrazky v 0 sloupci.
I když Invalidate odstranim uplně tak ten text je furt 2X
1 zarovnan k leve straně a 2 k prave.
eeeeepep.jpg
JaFi má pravdu:
Skús zabaliť celý projekt do *.zip, *rar a pod. a niekam ho daj, nech sa na to dá pozrieť v čom máš chybu...
Mne to na Delphi XE2 chodí normálne...
Tak jsem dnes ráno vytvořil úplně novy projekt a hledal problem.
Pokud je StringGrid v projektu v default stavu tak je to OK.
Pokut však zapnu DrawFocusSelected tak to blbne.
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 řadku.
eeeeendn.jpg
Uloz nekam zdrojak at se na to muzeme podivat. Jinak to opravdu nikam nepovede.
321923867
V D7 uplne bez problemu
Zkus ve FormCreate zrusit radek:
StringGrid1.DoubleBuffered := True;
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...![]:(](https://static.poradna.net/images/smiley/evilworry.gif)
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.
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
Děkují moc.Vyzkoušim.