Událost Click v poli obrázků   zodpovězená otázka

VB.NET, WinForms

Mam programove vytvorene pole obrazku KARTA(I) na zaklade objektu PictureBox. Umim menit vlastnosti jednotlivych karet avsak nyni potrebuji, aby se po kliknuti na libovolne karte zmenil obrazek (Image.fromFile). Jak mam odchytit Click konkretni karty? Zkousel jsem tento kod, avsak nefunguje:

    Private Sub Karta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Click
        Karta(I).Image = Image.FromFile(Application.StartupPath & "\obrazky\nic.jpg")
    End Sub

Diky predem za vase odpovedi. Lada

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Zkuste se podívat na

http://www.vbnet.cz/forum-tema--503-nezn...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Musí se připojit Handler, když kartu vytvoříte.

Dim pb as new picturebox
pb.image = image... ' nastavíte jí vlastnosti
AddHandler pb.click, Adressoff kliknuto ' kliknuto je jméno sub-h, který se vyvolá po kliku
private sub kliknuto(byval sender as object, byval e as mouseeventargs)
 ' a tady můžete pracovat, např.:
 sender.image = ...
end sub

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Zkousel jsem, ale nejde mi to na pole. Mam programove vytvorene PictureBox pod nazvem KARTA(I), kde I je od 0 do 32. V cyklu menim vlastnosti. Pokud chci aplikovat karta(I).AddEventHandler, zobrazi se chybove hlasení AddEventHandler is not a member system.array.Obdobne i pro Click. Pokud nemam indexovane objekty, tak kod je funkcni.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Do cyklu vložte přesně tento zápis:

AddHandler pb.click AddressOf -jmeno-subu-

s tím že pb je název nového pictureboxu a jmeno subu je název té procedury. AddHandler a AdressOf jsou klíčová slova.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak jsem to naspal takto:

AddHandler Karta(I).Click, AddressOf kliknuto

a zobrazuje se mi tato chyba:

Method 'Private Sub kliknuto(sender As Object, e As System.Windows.Forms.MouseEventArgs)' does not have the same signature as delegate 'Delegate Sub EventHandler(sender As Object, e As System.EventArgs)'

Vlastni proceduru Kliknoto jsem pouze prenesl z vaseho prikladu:

    Private Sub kliknuto(ByVal sender As Object, ByVal e As MouseEventArgs)
        ' a tady můžete pracovat, např.:
        sender.Image = Image.FromFile(Application.StartupPath & "\obrazky\nic.jpg")
    End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Aha to je moje chyba, argumenty u toho subu jsou tedy

sender As Object, e As System.EventArgs

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diky, uz mi to jede!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A proč tak neefektivně ukládat PictureBox do pole? Nestačilo by do pole ukládat jenom ty obrázky (System.Drawing.Bitmap)?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nejde o to promítat obrázky do toho PictureBoxu, ale mít více PictureBoxů, ve kterých ty obrázky indikují stavy.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Prosím o nápovědu jak pracovat s PictureBoxy v Array - nejde mi to. Zkouším definici pole typu Object plnit PictureBoxy, skončím na události click - nezná jí to.

'......
Dim pole(2) As Object
  For i As Integer = 0 To 2
    pole(i) = New PictureBox
    pole(i).image = Image.FromFile("C:\Bitmap\o1.jpg")
    pole(i).SizeMode = PictureBoxSizeMode.AutoSize
    pole(i).left = i * (pole(i).width + 10)
    ''''AddHandler pole(i).Click, AddressOf p_click ' CHYBA!!!''''
    Me.Controls.Add(pole(i))
    Next
    Me.AutoScroll = True
' .......
  Private Sub p_click(ByVal sender As Object, ByVal e As EventArgs)
    MsgBox("Kliknuto na PictureBox")
  End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkusil jste pole deklarovat ajko pole PictureBoxů?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji, jde to!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Není za co :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Stále nechápu smysl načítat PictureBoxy do pole. Pokud máte těch několik PictureBoxů umístěných v návrhovém režimu na formuláři, můžete se na ně přece odkazovat jménem. Pokud je přidáváte dynamicky v průběhu programu, můžete se na ně odkazovat přes jméno v kolekci Controls nadřazeného ovládacího prvku (pravděpodobně Form).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Osobně tím sleduji jen vlastní poučení jak pracovat s polem prvků. Smysl pole prvků vidím v tom, že pracuji právě s těmi prvky, se kterými chci bez výběru mezi ostatními.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Toto mělo smysl ve VB 6.0, kde se automaticky vytvořilo pole ovládacích prvků stejného typu v momentě, kdy byly stejně pojmenovány. Ve VB .NET to ztrácí význam.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je mnoho situací, kdy se hodí mít pole PictureBoxů. Často totiž nevíte, kolik jich budete potřebovat. A mimochodem vyhledávání prvků v kolekci Controls podle jména je pomalejší.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ono asi dos záleží na tom, co má v úmyslu s Pictureboxy dělat. Pokud chce pouze reagovat na události konkrétního pictureboxu (viz příklad výše), pak je skutečně zbytečné se polem prvků zaobírat - v tomto případě se nemusí starat ano i jméno prvku, ošetří pouze hodnotu konkrétní controlls, které mu adálost nabídne v proměnné sender.

Pokud ale bude mít složitější požadavky (např. při kliknutí na jeden obrázek tento změní, ale současně přenastaví i všechny (nebo vybrané) ostatní pictureboxy, pak už bude mít pole těchto prvků smysl a ulehčí práci.

Řešili jsme zde podobnou problematiku viz http://www.vbnet.cz/clanek--45-vb_net_od... , a hlavním problémem přímého oslovení kolekce controls je to, že (dle toho, co nás učili naši Gurů) nelze v tomto přímém oslovení jménem použít proměnné (typu string). Takže by se to muselo dělat opět oklikou přes vyhledání indexu, což je zase ale pomalé.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback