Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: Potrzebna jest pętelka... jak ją założyć?
jamajka




Typ: neutral
Postów: 18
Zarejestrowany: Apr 2005
Potrzebna jest pętelka... jak ją założyć?

Mam takie obiekty: 12 labelek i  buttona. Teraz chcę wykonać takie działanie:
klikam na buttona, zapala mi się pierwsza labelka na inny BackColor i wyświetla się w Label1 jedynka, klikam ponownie na buttona,zapala się druga labelka na inny BackColor i wyświetla się w Label2  dwójeczka i tak dalej, aż do dwunastej labelki. Czy ktoś mi może pomóc, bo kombinuję i kombinuję i nie mogę sobie poradzić. Za pomoc serdeczne dzięx.


_____________________________________________
Chcę wiedzieć, ale czy potrafię zrobić?

27-04-2005 11:43
Pokaż profil jamajka  Wyślij email do jamajka   
Chudy
[TLHW]Wiktor



Typ: moderator
Postów: 574
Zarejestrowany: Aug 2002

http://dotgeek.org/~masterblaster/tmp/frmLabelki.frm << czy chodzi o coś takiego ?


_____________________________________________
Projekt "Thunder Cannons" nadchodzi...

27-04-2005 12:26
Pokaż profil Chudy  Wyślij email do Chudy   Odwiedź stronę Chudy       1220895
anonim




Typ: Nie zarejestrowany

ja bym dal 13 labelek ;] i cos takiego

label13.caption = label13.caption + 1

if label13.caption = 1 then
  label1.caption = "1"
  label1.backcolor = ?????
end if
if label13.caption = 2 then
  label2.caption = "2"
  label2.backcolor = ?????
end if

27-04-2005 16:30
  
jamajka




Typ: neutral
Postów: 18
Zarejestrowany: Apr 2005

Chyba mnie nie zrozumieliście. Powtórzę jeszcze raz:
klikam w buttona, w Label1 "zapala" się 1 (jedynka) i BackColor Label1 zmienia się na np: żółty.
klikam drugi raz na buttona, w Label2 "zapala" się 2 (dwójka) i BackColor Label2 zmienia się na  ten żółty,
klikam znowu na buttona, w Label3 "zapala" się 3 (trójka) .... i tak aż do Label12. Więc trzeba kliknąć 12 razy aby w 12 labelach pojawiły się liczby od 1 do 12 i we wszystkich był BackColor w tym przykładowym żółtym kolorze.
Nie chcę If-ować ani Case-ować, chcę to zrobić w pętli, jednak nie mogę sobie z tym poradzić.


_____________________________________________
Chcę wiedzieć, ale czy potrafię zrobić?

28-04-2005 13:11
Pokaż profil jamajka  Wyślij email do jamajka   
Chudy
[TLHW]Wiktor



Typ: moderator
Postów: 574
Zarejestrowany: Aug 2002

A poco pętla ? Czy aby napewno sprawdzałeś mój przykład ?


_____________________________________________
Projekt "Thunder Cannons" nadchodzi...

28-04-2005 16:10
Pokaż profil Chudy  Wyślij email do Chudy   Odwiedź stronę Chudy       1220895
jamajka




Typ: neutral
Postów: 18
Zarejestrowany: Apr 2005

bo bez pętli to już mam i jest prostsze od zaproponowanego zapisu. Moim zdaniem jest to jeszcze do uproszczenia, bo jest nadal zbyt rozbudowane.

Przykład:
Select Case Licz
  Case 1
    lblA1.caption = "1"
    lblA1.BackColor = RGB (224,202,180) ' kolor pierwszy z brzegu
    Licz = 2
  Case 2
    lblA2.caption = "2"   
    lblA2.BackColor = RGB (224,202,180)
    Licz = 3
itd.........

Wydaje się, że na jakiejś sprytnej pętelce można to uprościć. dzięx

[Post edytowany dnia 28-04-2005 18:02 przez jamajka]


_____________________________________________
Chcę wiedzieć, ale czy potrafię zrobić?

28-04-2005 17:55
Pokaż profil jamajka  Wyślij email do jamajka   
Jeż



Typ: neutral
Postów: 55
Zarejestrowany: Mar 2004

Po mojemu trzeba to zrobić tak:

Weź Label1 zaznacz i skopiuj do schowka.
Następnie wstaw go na formę.Gdy VB zapyta Cię czy ma utworzyć tablicę - potwierdź.

Uzyskasz Label1(0) do Label1(11).

Teraz w CommandButtonie wstaw taki kod

    licz=licz+1
    if licz >11 then licz = 0
    label1(licz).caption=str(licz)
    label1(licz).bacColor=RGB(224,202,180)

28-04-2005 20:04
Pokaż profil Jeż  Wyślij email do Jeż   
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Pozwolę sobie wtrącić się do Waszej dyskusji, wybaczycie gadatliwej kobiecie..
Pomijając tablicę kontrolek, o której wspomiał Chudy i Jeż, widzę, że Jamajka nie ma tych kontrolek w tablicy kontrolek, natomiast ma je nazwane od LblA1 do LblA12 i tak chciałby pozostawić. Jest jedna możliwość odwołania się w VB 6 do kontrolki przez nazwę. Należy skorzystać z biblioteki Typelib Information (TLBINF32.dll ) dodając ją do referencji projektu, wówczas można wykorzystać następujące kod

Private Sub Command1_Click()
Static licz As Integer
Const OstatniNumerLabelki As Integer = 12
Dim sCzescWspolnaNazwy As String
Dim oKontrolka As Variant
sCzescWspolnaNazwy = "lblA"
    If licz > OstatniNumerLabelki - 1 Then
        licz = 0
        Exit Sub
  End If
    Set oKontrolka = TLI.InvokeHook(Me, sCzescWspolnaNazwy & CStr(licz + 1), INVOKE_PROPERTYGET)
    With oKontrolka
        .Caption = licz + 1
        .BackColor = &HFFFF&
    End With
licz = licz + 1
End Sub


_____________________________________________
Karolina

28-04-2005 21:02
Pokaż profil karolinavb  Wyślij email do karolinavb   
jamajka




Typ: neutral
Postów: 18
Zarejestrowany: Apr 2005

No tak, jest trochę zamieszania z moimi labelami. Przepraszam Was wszystkich za nieścisłość, są bez tablicy, ale nie jest powiedziane, że tak musi być.
Taka informacja z mojej strony powinna być duuużżoo wcześniej. Przepraszam.

Karolinko: poddałaś ciekawy pomysł, ale boję się, że go zbytnio nie rozumiem. Czuję przez skórę SubClassing, albo coś koło. Czy możesz wyjaśnić biednej sierotce Marysi, tak w kilku słowach, ten Twój kod, ja się tylko domyślam.
dzięx


_____________________________________________
Chcę wiedzieć, ale czy potrafię zrobić?

29-04-2005 18:10
Pokaż profil jamajka  Wyślij email do jamajka   
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Jamajko

Nie tylko w takim przypadku jak Twój czasem potrzebny jest dostęp do kontrolki poprzez jej nazwę wybraną w zależności od jakiegoś parametru , w Twoim przypadku jest to numer kolejnego kliknięcia.

W VBA, np. w Accessie możliwy jest dostęp do kontrolki formularza przez nazwę np.:

Me.Controls("txtWynik" )

VB można uzyskać dostęp do obiektów na formie przez kolekcję Controls jedynie przez numer obiektu w kolekcji Controls,  na przykład

Me. Controls(5)
 
może być kontrolką TextBox o nazwie LblA1, lecz aby sprawdzić czy dany element tej kolekcji jest kontroką  LblA1 trzeba byłoby "okrążyć" całą petlę:

Dim i As Integer
Dim oLabel As Label
For i = 0 To Me.Controls.Count - 1
    If Me.Controls(i).Name = "lblA1" Then
        Set oLabel = Me.Controls(i)
        Exit For
    End If
Next
' i teraz dopiero można byłoby "coś zrobić"z tą kontrolką  :

oLabel.Caption = "ALA"

i tak czy podobnie dla każdej labelki.

Biblioteka TLBINF32.dll instalowana z Visual Studio oraz Office wykorzystywana przez Object Browser (przeglądarkę obiektów VB oraz VBA Office) umożliwia sprawdzenie czy właściwości dla danego obiektu istnieje, umożliwia jej modyfikację. Ma metodę

TLI.InvokeHook(oObject,oMember.Name, INVOKE_PROPERTYGET)

która pozwala na pobranie tej właściwości

(http://www.vb-helper.com/howto_typelib_invoke_name_method.html
http://www.vb-helper.com/howto_get_control_properties_using_typelib.html)

przy czym trzeba pamiętać, że jeśli chcemy pobrać obiekt należy wykorzystać instrukcję Set.
Taka właściwością obiektu Form są jego kontrolki:

Set oKontrolka = TLI.InvokeHook(Me, "lblA1" , INVOKE_PROPERTYGET)

w tym kontrolki Label.  Umożliwiło  to dostęp do kontrolki Form przez nazwę kontrolki

W pliki Tlbinf32.exe znajduje się help do tej biblioteki, do pobrania na stronie

http://support.microsoft.com/?scid=kb;en-us;224331&spid=3042&sid=global

nie wiem czy dobrze wytłumaczyłam, ale lepiej nie umiałam. Stosowanie tablicy kontrolek w takim przypadku jak Twój jest rzeczywiście bardziej proste.

[Post edytowany dnia 29-04-2005 22:07 przez karolinavb]


_____________________________________________
Karolina

29-04-2005 22:05
Pokaż profil karolinavb  Wyślij email do karolinavb   
Knight Lore''FC




Typ: neutral
Postów: 240
Zarejestrowany: Jan 2003


karolinavb
... Jest jedna możliwość odwołania się w VB 6 do kontrolki przez nazwę....

A jest mozliwosc odwolania sie do zmiennej poprzez nazwe zmiennej ?

Chodzi o problem z przed ponad roku (ale wciaz aktualny)  : Pliki INI ?

30-04-2005 00:11
Pokaż profil Knight Lore  Wyślij email do Knight Lore        1065423
jamajka




Typ: neutral
Postów: 18
Zarejestrowany: Apr 2005

No tak, no tak.  Rzeczywiście moja dociekliwość nieco wyprzedziła Ciebie Karolino - bardzo mnie zaintrygowała nazwa użyta w Twoim kodzie - TLI.InvokeHook, stąd moja dociekliwość. Właśnie pracuję nad artykułami z VB Helper'a - znam trochę ten serwis.  I tutaj przyznam parę rzeczy nie łapię. Tzn w tym drugim przykładzie myślę, że chodzi o wykorzystanie biblioteki do pobierania właściwości kontrolek ( chyba tak, tak to rozumiem). W  pierwszym przykładzie chodzi o poszukiwanie kontrolki po nazwie - czy tak?

Bo wyjaśnienie w rubryce "Description, czyli opis" brzmi mniej więcej tak:
Przykład pokazuje jak stosować TypeLib i procedurę InvokeHook, do wyszukiwania kontrolki po nazwie i odwoływania się do jej procedur w Visual Basic 6. Korzystając z metody InvokeHook i polecenia INVOKE_PROPERTYGET można odwołać się do właściwości Name kontrolki. A korzystając z polecenia INVOKE_FUNC, można odwołać się do procedury.

Zakładając, że się nie mylę, to czy możesz mi jeszcze wyjaśnić co oznacza:
1.metoda foo - czego dotyczy
2.IDispatch  - is patch, czyli ID jest dodatkiem? Nie panimaju

w Sub Hook () w komentarzu:
'Odwoływanie się członu do obiektu TLIApplication
'pozwala tobie na łatwe korzystanie z IDispatch:
'Odwołuj się bezpośrednio z kodu VB

3.callbyname - czy chodzi o wywoływanie przez nazwę?
Wielkie dzięx za wyjaśnienia, to ważne bo wiem o czym rozmawiam no i zrozumiałe, że się uczę.

[Post edytowany dnia 30-04-2005 11:44 przez jamajka]


_____________________________________________
Chcę wiedzieć, ale czy potrafię zrobić?

30-04-2005 11:34
Pokaż profil jamajka  Wyślij email do jamajka   
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Jamajko
Będe pisała w częściach, więc dopóki nie pojawi się w poście słowo koniec czytaj partiami:

1. IDispatch jest interfejesem opis jak niżej. Na dole jest metoda Invoke tegoż interfejsu, ona właśnie pozwala na dostęp do właściwości i metod obiektu. Autor VB Helper'a  napisał właśnie to:

Obiekt TLIApplication  umożliwia skorzystanie w kodzie VB  właśnie z metody Invoke interfejsu IDispatch. W VB istnieje natomiast funkcja CallByName, która pozwala wykonać metodę obiektu, lub ustawić właściwość obiektu poprzez nazwę

CallByName(object, procedurename, calltype,[arguments()])

żeby przybliżyć przykład z helpa VB

CallByName Text1, "Move", vbMethod, 100, 100

wykorzystanie omawianej biblioteki tworzy zatem zdaniem autora podobne w analogii działanie jak CallByName VB



MSDN 
IDispatch
[This is preliminary documentation and subject to change.]
The IDispatch interface implements Automation, which makes it easier for interpretive and macro languages to access COM components.
This interface and its methods are fully documented in the COM documentation in the Microsoft&reg; Platform SDK and are only partially documented here for quick reference.

Methods in Vtable Order
IUnknown MethodsDescription
QueryInterfaceReturns pointers to supported interfaces.
AddRefIncrements the reference count.
ReleaseDecrements the reference count.

IDispatch MethodsDescription
GetTypeInfoCountRetrieves the number of type information interfaces.
GetTypeInfoRetrieves the type information for an object.
GetIDsOfNamesMaps a single member and an optional set of argument names to a corresponding set of integer DISPIDs.

InvokeProvides access to properties and methods exposed by an object.



2. Foo jest tylko przykładową metodą Form1, która się autor posługuje i wywołuje ją z pomocą biblioteki tLbinf32.dll - jej metody InvokeHook w przykładzie na dole.

Lecz tak naprawdę wydaje mi się, że należy korzystać z bardziej prostych metod jak tablica kontrolek, poza absolutna koniecznością, proste jest bowiem piękne i bardziej praktyczne.

P.S.
Rycerzu Wiedzy ( dobrze przetłumaczyłam ?)
Co do Twojego pytania to nie znam odpowiedzi, można jedynie próbwać dodając referencję w projekcie (NIE Components), jeśli nie chcemy mieć kontrolki MSScriptControl.ScriptControl na formie a wykorzystać ją w kodzie, do biblioteki Microsoft Script Control i dalej np:

Dim objSC As New MSScriptControl.ScriptControl
objSC.Language = "VBScript"
objSC.AllowUI = True

dalej natomiast..
biblioteka ta ma metody Run, Eval,ExecuteStatement i może tą drogą dojdziesz do szczęścia, ja ją wykorzystuję do wykonania operacji budowanych ze stringów w TexBoxach (nie drogę lecz kontrolkę oczy...)

Wiecej nic nie wiem....koniec czekam na poprawę i lepsze pomysły...

[Post edytowany dnia 30-04-2005 13:22 przez karolinavb]


_____________________________________________
Karolina

30-04-2005 12:59
Pokaż profil karolinavb  Wyślij email do karolinavb   
jamajka




Typ: neutral
Postów: 18
Zarejestrowany: Apr 2005

UUUUUUAAAAAAAAOOOOOOOOOO !!!!!!!!! Dddzzziiięęęęxxx

To chyba samo za się mówi.

Mam taką stronkę, dlatego była mowa z mojej strony o subclassingu. Już nad nią pracuję. Dzięx,Dzięx,Dzięx

http://gpwiki.org/index.php/VB:Building_a_Better_Scripting_Language_by_Using_Dynamic_Classes


_____________________________________________
Chcę wiedzieć, ale czy potrafię zrobić?

30-04-2005 14:21
Pokaż profil jamajka  Wyślij email do jamajka   
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Bardzo ładny arktykuł, nie widziałam go, dzięki Jamajko, szersze omówienie problemu na przykładzie dostępu do elementów własnej klasy.

Rycerzu Wiedzy jeszcze raz
Co do Twojego pytania i linku do postu w nim zawartego cd...
Są w tym poście zmnienne np:
WspX, WspY, gdyby nie były zmiennymi tylko własciwościami klasy to wówczas można byłoby mieć do nich dostęp przez nazwę, bez problemu chyba, omawianą z Jamajką metodą (np w artykule z ostatniego linku), a przecież tak naprawdę  wykorzystanie właściwości WspX, WspY stworzonej przez siebie klasy zamiast "zwykłych" zmiennych z punktu widzenia programu nie stanowi problemu, może się mylę ? Rycerzu ?

[Post edytowany dnia 30-04-2005 14:48 przez karolinavb]


_____________________________________________
Karolina

30-04-2005 14:38
Pokaż profil karolinavb  Wyślij email do karolinavb   
Wszystkich odpowiedzi: 14 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1