| | |
| Stránka: 1 z 1
| [ Príspevkov: 10 ] | |
Autor | Správa |
---|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | Napísal ha2: 15.11.2009 17:04 | |
|
zrejme low ale ako dosiahnem zavolanie tejto procedury napr. pri button onclick?
Kód: procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin if Index = 2 then begin (Control as TListbox).Canvas.Brush.Color := clWhite; (Control as TListbox).Canvas.Font.Color := clBlack; end else begin (Control as TListbox).Canvas.Brush.Color := clBlack; (Control as TListbox).Canvas.Font.Color := clWhite; end; (Control as TListbox).Canvas.FillRect(Rect); (Control as TListbox).Canvas.TextOut(Rect.Left+2,Rect.Top+2, (Control as TListbox).Items[Index]); end;
|
|
Registrovaný: 11.01.09 Prihlásený: 29.03.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 15.11.2009 21:50 | |
|
Pochopil som správne, aby sa po stlačení buttonu vykreslil ListBox (teda zavolala vykresľovacia procedúra) ?
Ak áno, dá sa to takto, ale podľa mňa to je trocha neprofesionálne, keďže hneď po kliknutí na iné miesto, sa ListBox zobrazí ako predtým:
Kód: procedure TForm1.FormCreate(Sender: TObject); begin
ListBox1.Style:= lbOwnerDrawFixed;
end;
procedure TForm1.Button1Click(Sender: TObject); begin
ListBox1DrawItem(ListBox1, ListBox1.ItemIndex, ListBox1.ItemRect(ListBox1.ItemIndex), [odFocused]);
end;
Na forme je jeden ListBox, jeden Button a procedúra ListBox1DrawItem v mojom kóde je hore uvedená procedúra.
|
|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | Napísal autor témy ha2: 16.11.2009 1:13 | |
|
No asi som to zle zadefinoval. Chcel by som to tak ze mam listbox (naplni sa pri behu programu) a teraz ked kliknem na button1 tak sa tretia polozka sfarbi na cerveno (iba text nie pozadie), pricom to zostane tak. Cize pri kliku na listbox sa to nezmeni. V podstate chcem vysviecovat a zhasinat urcite zaznamy pri urcitej akcii.
|
|
Registrovaný: 11.01.09 Prihlásený: 29.03.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 16.11.2009 13:20 | |
|
OK, ešte jedna otázka: Keďže po kliku na button má ostať ListBox nezmenený, čo sa farieb týka, z toho mi vyplýva, že buď sa na ten button počas programu môže kliknúť iba raz (tzn od kliknutia na button sa začne ListBox vyfarbovať podľa potrieb až do ukončenia programu) alebo sú buttony dva, pričom jeden zapína vykresľovanie ListBoxu a druhý ho vypína.
Prvý spôsob by vezeral takto:
Kód: var access: boolean = false;
// ...
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin
(Control as TListbox).Canvas.Brush.Color := clWhite; (Control as TListbox).Canvas.Font.Color := clBlack;
if (access) then begin
if ( (State = [odFocused, odSelected]) or (State = [odSelected]) or (State = [odFocused])) then (Control as TListbox).Canvas.Font.Color:= clRed else (Control as TListbox).Canvas.Font.Color:= clBlack;
end;
(Control as TListbox).Canvas.FillRect(Rect); (Control as TListbox).Canvas.TextOut(Rect.Left+2,Rect.Top, (Control as TListbox).Items[Index]);
end;
procedure TForm1.FormCreate(Sender: TObject); begin ListBox1.Style:= lbOwnerDrawFixed; end;
procedure TForm1.Button1Click(Sender: TObject); begin access:= true; ListBox1DrawItem(ListBox1, ListBox1.ItemIndex, ListBox1.ItemRect(ListBox1.ItemIndex), [odSelected]); end;
(* V ObjectInspectore treba vybrať pre ListBox udalosť onDrawItem a pastnuť tam tento kód a tak isto aj pre OnCreate a OnClick, pretože len skopíraovním tohto kódu do editora to nepôjde, keďže nie sú procedúry priradené udalostiam komponentov - píšem to, pretože niektorí uživatelia píšu, že im kód nefunguje, lebo ich iba surovo skopírovali a vložili bez priradenia *)
Text bude po stlačení buttonu sfarbený do červena (aj po odobratí focusu) a farba pozadia ostane nezmenená.
|
|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | Napísal autor témy ha2: 16.11.2009 13:39 | |
|
dik.
No potreboval by som to na pevne urcenu napr. tretiu polozku. a dalsia vec ked klikam po listboxe tak to sfarbuje zakazdym vybranu polozku. Potreboval by som to tak ze iba button1 by treti item sfarbil a button2 odfarbil, pricom by pohyb (klikanie) po listboxe farby niako neovplyvnovalo
to by malo byt presne to co potrebujem
|
|
Registrovaný: 11.01.09 Prihlásený: 29.03.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 16.11.2009 14:27 | |
|
Snáď to už bude dobre
Kód: var access: boolean = false; cisloPolozky: integer = 2; // tretia polozka
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin
(Control as TListbox).Canvas.Brush.Color := clWhite; (Control as TListbox).Canvas.Font.Color := clBlack;
if ((access) and (Index = cisloPolozky)) then begin (Control as TListbox).Canvas.Brush.Color := clWhite; (Control as TListbox).Canvas.Font.Color := clRed; end;
(Control as TListbox).Canvas.FillRect(Rect); (Control as TListbox).Canvas.TextOut(Rect.Left+2,Rect.Top, (Control as TListbox).Items[Index]);
end;
procedure TForm1.FormCreate(Sender: TObject); begin ListBox1.Style:= lbOwnerDrawFixed; end;
procedure TForm1.Button1Click(Sender: TObject); begin Button2.Click; access:= true; cisloPolozky:= StrToInt(Edit1.Text); ListBox1DrawItem(ListBox1, cisloPolozky, ListBox1.ItemRect(cisloPolozky), [odSelected]); end;
procedure TForm1.Button2Click(Sender: TObject); begin access:= false; ListBox1DrawItem(ListBox1, cisloPolozky, ListBox1.ItemRect(cisloPolozky), [odSelected]); end;
Nevedel som, či sa má pozícia vykreslovaného riadku meniť, tak som určil, že sa meniť môže, konkrétne, že sa zadáva do Editu --> cisloPolozky:= StrToInt(Edit1.Text). V prípade, že má byť počas celého behu programu konštantné, tak stačí odstrániť v procedúre TForm1.Button1Click(Sender: TObject) riadky Button2.Click; a cisloPolozky:= StrToInt(Edit1.Text);
|
|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | Napísal autor témy ha2: 16.11.2009 15:10 | |
|
Skvele! presne takyto model som potreboval. Teraz si to uz vlozim do projektu diki moc
|
|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | Napísal autor témy ha2: 16.11.2009 15:50 | |
|
a este by som rad to vyznacovanie pozadia pri oznaceni polozky. Skusal som to ze som pridal prvy riadok ale nieje to dobre. Ostava to sfarbene.
Kód: procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin
if index= (Control as TListbox).itemindex then (Control as TListbox).Canvas.Brush.Color := clBlue else (Control as TListbox).Canvas.Brush.Color := clWhite; (Control as TListbox).Canvas.Font.Color := clBlack;
if ((access) and (Index = cisloPolozky)) then begin (Control as TListbox).Canvas.Brush.Color := clWhite; (Control as TListbox).Canvas.Font.Color := clRed; end;
(Control as TListbox).Canvas.FillRect(Rect); (Control as TListbox).Canvas.TextOut(Rect.Left+2,Rect.Top, (Control as TListbox).Items[Index]); end;
|
|
Registrovaný: 11.01.09 Prihlásený: 29.03.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 16.11.2009 16:37 | |
|
Za predpokladu, že sa pôvodná vykresľovaná položka nemá farebne meniť, tak takto:
Kód: procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin
(Control as TListbox).Canvas.Brush.Color := clWhite; (Control as TListbox).Canvas.Font.Color := clBlack;
if ((State = [odSelected]) or (State = [odSelected, odFocused])) then if ((Control as TListbox).Selected[Index]) then (Control as TListbox).Canvas.Brush.Color := clBlue;
if ((access) and (Index = cisloPolozky)) then begin (Control as TListbox).Canvas.Brush.Color := clWhite; (Control as TListbox).Canvas.Font.Color := clRed; end;
(Control as TListbox).Canvas.FillRect(Rect); (Control as TListbox).Canvas.TextOut(Rect.Left+2,Rect.Top, (Control as TListbox).Items[Index]);
end;
|
|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | Napísal autor témy ha2: 16.11.2009 16:52 | |
|
Vdaka za ochotu
|
|
| Stránka: 1 z 1
| [ Príspevkov: 10 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| Farebný text v konzoly, vysvetlenie "argumentu" v Assembler, C, C++, Pascal, Java | 7 | 436 | 13.03.2017 20:04 GamerSK | | Delphi: TCanvas.TextOut - ako na text s priesvitným pozadí v Delphi, Visual Basic | 6 | 1931 | 23.12.2007 21:58 p360t | | Visual Basic 6 Listbox po kliknuti, v Delphi, Visual Basic | 1 | 981 | 02.11.2008 13:33 Patkoo | | delphi zapis cisla do editu v delphi v Delphi, Visual Basic | 3 | 1100 | 11.05.2008 12:02 p360t | | farebny cartridge v Externé zariadenia | 0 | 676 | 28.02.2009 11:09 pcman | | Farebny problem v Operačné systémy Microsoft | 5 | 1172 | 04.10.2008 20:01 Svolo | | ako zmenit podmienku "where" pre listbox cez radiobutton ? v JavaScript, VBScript, Ajax | 0 | 417 | 18.02.2011 0:18 10tomi | | Farebny video efekt (prechod)??? v Video programy | 1 | 371 | 04.09.2012 22:17 Fifik | | Notebook do 400E (farebný) v Notebooky a netbooky | 8 | 857 | 12.06.2011 12:11 Volcano | | Farebný zadný kryt Moto G v Mobilné zariadenia | 3 | 379 | 02.07.2014 9:56 brmbo | | D: Stary farebny notebook Digital v Vymením a darujem | 0 | 381 | 10.07.2010 1:28 LuboZA | | Bridgestone predstavil najtenší ohýbateľný farebný el. v Novinky | 2 | 416 | 26.10.2007 17:07 mimkork | | Plynulý prechod z čiernobieleho na farebný obrázok v JavaScript, VBScript, Ajax | 1 | 397 | 28.03.2013 12:19 Merlin_sk | | Aký farebný odtieň používa Kingston v HyperX Blue Serii ? v Ostatné | 16 | 533 | 03.05.2014 16:46 kuki_sk | | LG.Philips vyvinul prvý ohybný A4 farebný e-papier v Novinky | 1 | 476 | 14.05.2007 14:27 johny128 | | "farebny" notebook do 420€ v Notebooky a netbooky | 9 | 1096 | 18.08.2011 10:28 jbakos |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|