neznámý počet pictureboxu a jejich tvoření   zodpovězená otázka

VB.NET, WinForms

Prosím o radu nad mé síly,potřeboval bych poradit jak udělat "to" že kdyš vytvořim picturebox v programu aby sem měll možnost vybrat si z pc jakej obrázek do něj vložim ale hlavně nevím jak zajistit aby sem na začátku programu měl třeba jen jeden picturebox nebo tlačítko kterým další vytvořim,a kdyš vytvořim další,automaticky se zobrazí na mnou předem dané poloze a bude mít vlastnosti které jsem naprogramoval.

To znamená že mám již naprogramované pictureboxy ale já předem neznám jejich počet navíc se každý ukládá na určené souřadnice,nejspíš bych potřeboval něco jako pole ne?

jen nevim jak mu určit že má tyto vlastnosti a tuto polohu

kdyš to tak píšu přijde mi to strašně složité zde je kus kodu na ukázku vlastností(pictureboxy používám jako,jakási,animovaná tlačítka)

 Private Sub PictureBox2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox2.Click

        PictureBox1.Visible = True
        PictureBox1.Image = PictureBox2.Image           'po kliknuti na ikonku se promitne na picturebox1
        PictureBox6.Image = PictureBox1.Image         'ikona pro maximalizaci
        PictureBox6.Visible = True
        'zde naprogramuji přesuny
        If PictureBox2.Top = 83 And PictureBox2.Left = 99 Then       'první pozice
            PictureBox2.BringToFront()
        ElseIf PictureBox2.Top = 128 And PictureBox2.Left = 160 Then  'druhá pozice
            PictureBox2.Top = 83
            PictureBox2.Left = 99
            PictureBox2.Width = 94
            PictureBox2.Height = 73
            PictureBox2.BringToFront()
        ElseIf PictureBox2.Top = 167 And PictureBox2.Left = 205 Then
            PictureBox2.Top = 83
            PictureBox2.Left = 99
            PictureBox2.Width = 94
            PictureBox2.Height = 73
            PictureBox2.BringToFront()
        End If

        If PictureBox3.Top = 83 And PictureBox3.Left = 99 And PictureBox4.Top = 128 And PictureBox4.Left = 160 Then
            PictureBox3.Top = 128
            PictureBox3.Left = 160
            PictureBox3.Width = 69
            PictureBox3.Height = 57
            PictureBox3.BringToFront()
            PictureBox4.Top = 167
            PictureBox4.Left = 205
            PictureBox4.Width = 39
            PictureBox4.Height = 32

        ElseIf PictureBox3.Top = 128 And PictureBox3.Left = 160 And PictureBox4.Top = 83 And PictureBox4.Left = 99 Then
            PictureBox3.Top = 167
            PictureBox3.Left = 205
            PictureBox3.Width = 39
            PictureBox3.Height = 32
            PictureBox4.Top = 128
            PictureBox4.Left = 160
            PictureBox4.Width = 69
            PictureBox4.Height = 57
            PictureBox4.BringToFront()

        ElseIf PictureBox3.Top = 83 And PictureBox3.Left = 99 And PictureBox4.Top = 167 And PictureBox4.Left = 205 Then
            PictureBox3.Top = 128
            PictureBox3.Left = 160
            PictureBox3.Width = 69
            PictureBox3.Height = 57
            PictureBox3.BringToFront()

        ElseIf PictureBox3.Top = 167 And PictureBox3.Left = 205 And PictureBox4.Top = 83 And PictureBox4.Left = 99 Then
            PictureBox3.Top = 128
            PictureBox3.Left = 160
            PictureBox3.Width = 69
            PictureBox3.Height = 57
            PictureBox3.BringToFront()
            PictureBox4.Top = 167
            PictureBox4.Left = 205
            PictureBox4.Width = 39
            PictureBox4.Height = 32
        End If
        PictureBox2.BringToFront()
    End Sub

omnouvám se,je to trošku delší.

funguje to tak že jsou 3 pictureboxy ,umístěny za sebou překrývajíc se rohem(kdo to zkusi zpustit,pochopí),a pokud kliknu na jeden,třeba poslední,přejede dopředu a ostatní za něj.

To co potřebuji je vlastně aby se nový picturebox uložil na takhle danou souřadnici,třeba na první,ale to znamená že všem se musí změnit podmínky a to podle počtu pictureboxu.S tím že picturebox nacházející se mimo danou oblast by měl okamžitě hodnotu visible=false a přesunut třeba na nějaký společný hromadný bod kde není vidět.Po otocění kolečka myši přejedou první dozadu(zneviditelní se) a neviditelné,pojednom,podle místase zviditelní a oběví vzádu,s dalším otočením se posunou dopředějc.Omlouvám se pokud je to moc složité,nikoho nežádám o celý program,jen kdyby někdo poradil,popřípadě ukázal kus kodu který by mi k výsledku napomohl.Děkuji

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

Nové pictureboxy vytvoříte takto:

For i As integer = 0 To 6
  Dim pb as new picturebox
  pb.image = image.fromfile(...)
  ' dál si nastavíte paramtry jako velikost, pozici apod.
  pb.AddEventHandler pb.click adressof pb_click
  me.controls.add(pb)
Next

...

Private sub pb.client(byval sendet as object, byval e as eventargs)
  msgbox("Klikl jste na picturebox. Gratuluji :-)")
end sub

a to přehazování by už měla být hračka.

PS: doporučuji si pictureboxy naházet do Panelu, jelikož bude snazší zjišťovat kolik jich je a kde jsou ři procházení Panel1.Controls . Kdybyste je dával přímo na form, budou se

vám do panelu plést i tlačítka apod. (Samozřejmě musíte do toho panelu dávat jen ty pictureboxy.)

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

děkuji s tím panelem máte asi pravdu ale já s ním ještě nepracoval,nevím jak přesně to mysslíte bla by rada?

ps:jak mužu naprogramovat aby se poslední přesunul na předposlední a první zmizel a tak dále kdyš neznám počet pictureboxu?Podle mého kodu je vidět že tento kod to vědět potřebuje a další otázka je jestli jde udělat aby se první picturebox uložil na jedny souřadnice(třeba podle výběru,bude odkazovat na text. soubor tak bude mít jiné souřadnice než kdyby ukazoval na .exe)a druhý zase na jiné? Kod co jsem zde napsal je v tomto ohledu dost nohrabaný a pro svou funkci potřebuje strašně moc informací

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

Vážená příteli, pokuste se, prosím, svůj problem popsat trošičku přesněji, přiznám se, že z Vaší první ukázky, ani z následného doplnění moc chytrý nejsem. A před odesláním si příspěvek ještě jednou pročtěte a zamyslete se, je-li Vaše sdělení pochopitelné i někomu, kdo Váš program nezná.

Rád bych Vám pomohl, ale takto to skutečně nejde.

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

Omlouvám se že ještě ruším ale váš kod mi nejde sprovoznit mužete ho nějak popsat a vysvětlit prosím?Dekuji.

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

Dim BoxCount As Integer = 6 ' reálný počet PictureBoxů
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
  For i As Integer = 0 To BoxCount - 1 ' bereme je od nuly
    Dim Box As New PictureBox
    Dim Img As Bitmap = Image.FromFile("C:/" + i.ToString() + ".png"
    Box.Image = Img
    Box.Size = Img.Size ' nastavíme boxu velikost podle obrázku, jestli to tak nechcete, tak zadejte hodnotu: New Size(32,32)
    Box.Location = New Point(i*20,i*20)
    Box.Name = "Karta" + i.ToString() ' Karta, protože mě napadlo, že by takto mohly vapadat právě karty. Zadejte co chcete
    AddHandler Box.Click, AdressOf Box_Click
    Me.Panel1.Controls.Add(Box) ' přidáme box do Panelu
  Next
End Sub

Private Sub Box_Click(ByVal sender As Object, ByVal e As System.EventArgs)
  MsgBox("Klikl jste na kartu s názvem " + sender.Name + ".")
  sender.BringToFront()
End Sub

snad jsem Vám to už více osvětlil.

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

No ten Panel je vlatně jen container na komponenty. Nic víc, nic míň. Vy si do něj naskládáte komponenty stejně jako na formulář (akorát jejich pozice se bude vztahovat ke stranám panelu, ne formuláře) a můžete s nimi úplně normálně dál pracovat.

A na závěr: to "blablabla" jsou parametry pro událost, které si sice pamatuji z hlavy, ale je clekm nuda je psát, když je tam VS hodí samo. Omlouvám se tedy za nejasnosti.

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

Možnože pomôže

Public Class Form1
    Dim pt As Point
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For i As Integer = 1 To 4
            Dim pb As New PictureBox
            pb.Image = Image.FromFile("c:\obrazek" & i & ".jpg")
            pb.Name = "obrazek" & i
            ' dál si nastavíte paramtry jako velikost, pozici apod.
            pt.Y = pt.Y + 60
            pt.X = pt.X + 10
            pb.Location = pt
            Me.Controls.Add(pb)
            AddHandler pb.Click, AddressOf pb_click
            Me.Controls.Add(pb)
        Next
    End Sub
    Private Sub pb_click(ByVal sender As Object, ByVal e As EventArgs)
        MsgBox("Klikl jste na picturebox: " & sender.name & " Gratuluji ")
    End Sub
End Class

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

Ano, anebo je možné vytvořit dva cykly, pomocí kterých by se řádek po řádku vykreslovali jednotlivé pictureboxy. Výsledkem by byla tabulka.

Jenže já jsem to z toho popisu pochopil tak, že se mají boxy navzájem částečně překrývat, a ten aktivní má být navrchu. Něco jako balíček karet, každá mkarta posunutá o něco níže a vy kliknete na jednu kartu, které se přesune navrch.

Chápu to správně, pane Trakale?

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

Ano pochopil jste to dokonale.chtěl jsem to takhle vysvěětlit ale nebyl jsem si jist zda by to všichni pochopil i správně.Ukázka jak je to myšleno je v prvnim příspěvku,pokud do těch pictureboxu vložíte obrázky vypadá to i,dle mne, velmi dobře co vy na to?

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

Mne osobně se ten nápad líbí. Nevím, jestli chcete aby se ty obrázky přesunovaly po určité dráze ( jako kdybyste v ruce držel řetěz a posunoval články - budou vždy ve stejném pořadí v nezávislosti na tom, na který se díváte ), protože to by pak bylo kapku složitější.

Jestli Vám stačí, že se obrázek, na který bylo kliknuto přesune nahoru, kód by měl fungovat.

Můžu se Vás tedy na závěr zeptat, na čem vlastně děláte? Nemůžu si pomoct, ale jako praktické využití mi to přijde jen u toho balíčku karet.

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

NO,v podstatě jde o to si "něco" dokázat :o).Ale řekl jsem si že mne už nebaví poslouchat "ty nic neumíš,je to na nic,..." určitě vědšina zná.A tak jsem si umanul že "zakonkuruju" Microsoftu :o) a zároven si dokážu že umim udělat aplikaci která by spříjemnila práci na PC.Má za ukol to,že ji spustíte a ona "nahradí" grafické rozhraní na kterém momentálně pracujete , a to dokonce velmi jednoduše:to "předchozí" pozadí,složky,atd... tam stále je ale navrchu je program který to vše přikryje a budou v něm odkazy jako je nová složka, a tak dále,včetně vypnout,restartovat,odhlásit...

Máte pravdu že to nemá praktické využití,leda by se to někomu zalíbylo natolik,že podle toho napíše grafické rozhraní OS.O čemž pochybuji,ikdyš je škoda že češi nemají vlastní OS,dle mého názoru by jsme ho zvládli,jsme přeci vynalézavý národ ne?

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

Je to zajímavý nápad, a nemyslete si, že je to ztracený projekt, protože je spousta programů, které běží pod Windows a chovají se jako ten Váš. Jsou to takoví náhradní průzkumníci.

Existuje i 3D varianta, kdy se jakoby procházíte domem, kde má každá místnost reprezentovat určité odvětví práce s počítačem (kancelář - práce, obývací pokoj - odpočinek, zde sledujete filmy, posloucháte hudbu apod.) Takže je jisté, že nejsete první ani poslední, kdo tento nápad měl.

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

V to doufám,jen mám málo zkušeností a proto se musím pořád někde ptát.Momentálně je "pokus" psán s GDI+ ale rozhodl jsem se že se budu muset naučit directX a přepsat to.Díky bohu,a mé přítelkyni,věčné opoře ve chvílích nezdaru :o), mám i dost živou předstvu,jen ještě nevím po té programové stránce jak naprogramovat ono propojení složek atd...

Vy náhodou nemáte zkušenosti s programy tohoto druhu?

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

Takový program jsem psal, když jsem vytvářet FTP koienta, jenže tam šlo o něco jiného. Navíc ty kódy už nemám.

Ale jestli umíte rekurzi (dá se natomto serveru najít) nebude pro Vás problém přes My.Computer.FileSystem obstarat vše potřebné pro systém souborů.

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

To jsou spíš takové hračky, k použitelnosti a rycholsti to má dost daleko. Nápad hezký, ale produktivní to není.

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

To je docela možné ale já bych to bral spíše jako "kdo si hraje nezlobí" a navíc,každý se musíme nějak učit

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

Dobrý den.

Tady mi není jasné, proč máte v kódu dvakrát za sebou

Me.Controls.Add(pb)

Proč napřed přidáte do kolekce Controls ten obrázek, pak mu připojíte handler a pak ho znovu připojíte do kolekce???

PV

nahlásit spamnahlásit spam 1 / 1 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