Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Napisanie funkcii dlya leybelov


Автор: Pavel_NL 26.5.2005, 11:27
zdraste vsem, pomogite 4ajniku

istoriya v kratse:
est' 6 raznyh leybelov, s sovsem raznymi imenami (pereimenovyvat' nel'zya =(...), ja ho4u 4toby kogda proizoshel form_load (zagruzka moego okoshe4ka progi), v samom na4ale to bish', 6 etix leybelov stanovilis' pustimi i nedostumnimi dlya ispolzovaniya.
pisat' 6 raz odno i tozhe no s raznimi imenami ne ho4u, no zahotel napisat funkciyu sled. vida:
Function begin_labels_clear (label_naam As Label)

With label_naam
.Enabled = False
.Caption = ""
End With

End Function


pomestil v samom verhu koda, potom nizhe u menya tam idet form_load:
.........
begin_labels_clear (lblEen)
.........

Leybel s takim imenem sushestvuyet, stopudova smile
a pri popitke prosmotra progi, on mne na form_load, i etot vizov funkcii materitsa i oret Type missmatch...

kto skazhet, 4to ya delayu ne tak? smile

Автор: Guest 26.5.2005, 11:33
smile pozhaluysta... =(

izvinite za flud

Автор: cardinal 26.5.2005, 16:48
Модератор: Пользуйся транслитом!
Код

Option Explicit

Private Function begin_labels_clear(label_naam As Label)
    With label_naam
        .Enabled = False
        .Caption = ""
    End With
End Function

Private Sub Command1_Click()
Call begin_labels_clear(Label1)
End Sub

Автор: ~FoX~ 27.5.2005, 09:06
cardinal
А почему функцией? Онаже не возвращает ничего......

Тогда уж так:
Код

Option Explicit

Private Function begin_labels_clear(label_naam As Label) As Integer
On Error GoTo ErrorHandler
    With label_naam
        .Enabled = False
        .Caption = ""
    End With
Exit Function
ErrorHandler:
  begin_labels_clear = Err.Number
  Resume Next
End Function

Private Sub Command1_Click()
Dim a As Integer
  a = begin_labels_clear(Label1)
End Sub

Автор: cardinal 27.5.2005, 13:24
Цитата
А почему функцией?

Ну он так хотел. smile

Автор: Naghual 27.5.2005, 16:39
Я мне кажется ему необходимо обращятся к объекту по его имени:
Код
Private Function Begin_Labels_Clear(LabelName As String)
    Dim Ctrl As Object
    
    For Each Ctrl In Me.Controls
        If TypeName(Ctrl) = "Label" Then
            If Ctrl.Name = LabelName Then
                Ctrl.Enabled = False
                Ctrl.Caption = ""
            End If
        End If
    Next
End Function

Автор: Black_Star 27.5.2005, 17:30
Гы. И каждый раз идет перебор по всем элементам...
Автор и сам решил проблему, но почему-то есть ошибка (как обычно без кода не поймешь).
А обращАтЬся ему надо не по имени (иначе имя было бы в кавычках).

Автор: cardinal 27.5.2005, 17:49
Просто как всегда надо так
Код

Call begin_labels_clear (lblEen)

или так
Код

begin_labels_clear lblEen

писать...

Автор: Pavel_NL 28.5.2005, 13:54
хм... спасибо. я только не совсем все понял. чайник же. например, что вот это такое

Код

Private Function Begin_Labels_Clear(LabelName As String)' 
    Dim Ctrl As Object 'это будут ярлыки, так?
    
    For Each Ctrl In Me.Controls 'для каждого значения в Где?! я просто такое не использовал ни разу... :)
        If TypeName(Ctrl) = "Label" Then 'вот здесь тоже сомневаюсь, правильно ли понимаю...
            If Ctrl.Name = LabelName Then 'и дальше тож
                Ctrl.Enabled = False 
                Ctrl.Caption = "" 
            End If 
        End If  
    Next
End Function


я конечно могу весь код выложить, но там все переменные итд названы по голландски... там не так уж и много на самом деле... но помоему не в коде дело.
вся запарка моя в том, что если я вызывваю эту функцию в любом другом месте - ошибок никакиз нет, но и работать она тоже не работает, да и смысл у нее именно в начале всего действия работать, поэтому и помещена она в Form_Load() может эта процедура особенная какая-то и там функции свои вписывать незя?

кстати, я от своего старого учителя слыхал, что использование меток и ГоуТу считается плохим стилем программирования... Правда? smile

Автор: Naghual 28.5.2005, 15:20
Приведенная мной функция ищет на форме объект типа Label по его имени.
Давай попробуем пробежатся по моему коду.

Dim Ctrl As Object - Объявляем переменную Ctrl как Объект любого типа.

For Each Ctrl In Me.Controls - Конструкция For Each ... In ... работает по тому же принципу что и обычный цикл For...Next но с одним МАЛЕНЬКИМ нюансом. Последовательным перебором переменной Ctrl присваивается каждый объект из коллекции. В данном случае Me.Controls это коллекция всех элементов управления на форме.

If TypeName(Ctrl) = "Label" Then - Если тип объекта Ctrl называется "Label" тогда...

If Ctrl.Name = LabelName Then - Если этот лейбл имеет заданное имя тогда ...
Добавлено @ 15:22
З.Ы.
Цитата
использование меток и ГоуТу считается плохим стилем программирования

Истинно говорю, правда.

И Pavel_NL зарегистрируйся
Добавлено @ 15:25
Black_Star абсолютно правильное замечание.
Тело в цикле нужно изменить вот так:
Код

...
            If Ctrl.Name = LabelName Then
                Ctrl.Enabled = False    
                Ctrl.Caption = ""
                Exit For   'Объект был найден, дальнейший перебор не нужен. Выходим из цикла
            End If 
...

Автор: PavelNL 29.5.2005, 20:57
Naghual, спасибо большое за пояснение кода. зарегился кстати.
как только смогу все, что планировал реализовать в коде, с ващей помощью, отпишусь.

топик прошу не удалчть

Автор: PavelNL 30.5.2005, 12:19
Проблему с ошибкой наконец-то решил. smile Надо было всего навсего правильно вызвать функцию. Спасибо всем, кто помог. Узнал много нового. Топик все еше прошу не удалять, т.к. помошь наверняка понадобиться снова.

Автор: PavelNL 5.6.2005, 04:11
У меня снова вопрос smile
Я в своем фрэйме сделал строку меню. Хочу "Выход" Кнопочку сделать, чтобы все закрывалось.
Прописал Stop, но сам помню, что это не то, что мне надо, даже если бы и работало. Но даже и это не работает почему-то.
В интернете поискал что-то вроде функции Exit, не нашел. Руки кривые наверное smile

Еще хочу узнать, как переносить строки кода. Я хочу например вот следующего вида МэссэджБокс использовать:
Код

MsgBox "Hallo! U probeert een Yahtzee-wannabe spel te spelen. Wat is nou de bedoeling van het spel? Simpel. U heeft 5 dobbelstenen. Als u op 'Start' klikt, dan gooit u de dobbelstenen. Als u een dobbelsteen vast wilt houden, dan moet u op de witte oppervlakte rond het beeld van een dobbelsteen om drukken. Heeft u op een verkeerde plek gedrukt? Het kan ook terug vrij laten, door een klik op eenzelfde plek. Door drie drie poggingen met behulp van 'Start' maakt u een Spelbeurt. In het geheel zijn er maar 6 spelbeurten. Als u een niuewe spel wilt beginnen moet u naar menu 'Spel' gaan, daarna op 'Nieuw Spel' klikken. In dezelfde menu kunt u ook van het spel uit gaan (Exit)", , "Help!"

И все это написал в одну строчку, ужасно неудобно. Как пересонить строки кода на новый абзац?

ну и самый наверное ламмерский вопрос. как мне exe-шник мой получить-то? =) я нажимаю Ctrl+F5 но где мой экзэшник я так и не понимаю...

заранее спасибо

Автор: Gannibal 5.6.2005, 04:47
Цитата(PavelNL @ 5.6.2005, 03:11)
Я в своем фрэйме сделал строку меню. Хочу "Выход" Кнопочку сделать, чтобы все закрывалось.


ну если правельно понял тогда тебе надо писать

Код

Privat Sub Command1_Click()
End ' закрывает всю програму :)
End Sub



Цитата(PavelNL @ 5.6.2005, 03:11)
Еще хочу узнать, как переносить строки кода. Я хочу например вот следующего вида МэссэджБокс использовать:


вот типа такого и будет если я правельно тебя понял smile

Код

MsgBox "Hallo! U probeert een Yahtzee-wannabe spel" _
& "te spelen. Wat is nou de bedoeling van het spel? Simpel." _
& "U heeft 5 dobbelstenen. Als u op 'Start' klikt, dan gooit u de dobbelstenen." _
& "Als u een dobbelsteen vast wilt houden, dan moet u op de witte" _
& "oppervlakte rond het beeld van een dobbelsteen om drukken." _
& "Heeft u op een verkeerde plek gedrukt? Het kan ook terug vrij laten," _
& "door een klik op eenzelfde plek. Door drie drie poggingen met " _
& "behulp van 'Start' maakt u een Spelbeurt. In het geheel zijn " _
& "er maar 6 spelbeurten. Als u een niuewe spel wilt beginnen " _
& "moet u naar menu 'Spel' gaan, daarna op 'Nieuw Spel' klikken." _
& "In dezelfde menu kunt u ook van het spel uit gaan (Exit)", , "Help!"



Цитата(PavelNL @ 5.6.2005, 03:11)
ну и самый наверное ламмерский вопрос. как мне exe-шник мой получить-то? =) я нажимаю Ctrl+F5 но где мой экзэшник я так и не понимаю...


Экзешник лежит там где и проект ;) лежит...

Автор: cardinal 5.6.2005, 17:31
Если не ошибаюсь, то в какой-то книге было написано, что вместо
Цитата(M @ 5.6.2005, 02:47)
Privat Sub Command1_Click()
End ' закрывает всю програму smile
End Sub

лучше писать
Код

Privat Sub Command1_Click()
Unload Me
End Sub

Так как типа End это полный абзац, а Unload Me нормальная выгрузка проги... smile

Автор: Gannibal 5.6.2005, 17:54
Цитата(cardinal @ 5.6.2005, 16:31)
Unload Me нормальная выгрузка проги


сразу из памяти выгружает если неошибаюсь

Автор: efedron 5.6.2005, 22:23
cardinal
Цитата
лучше писать unload me

это почему же? лучше всего сначала все выгрузить (unlaod), а потом не забыть написать end, ибо программа может "случайно" не закрыться и висеть в памяти (мало ли, мож забыл че-нть выгрузить).
А End - это типа процедуры ExitProcess, так что для того, чтобы быть уверенным, что программа завершиться, надо ее использовать smile

Автор: Naghual 6.6.2005, 09:10
Неа. Unload Me выгружает из памяти текущую Форму! Если програма стартовала формой то она возможно таки будет завершена, но при условии что не были созданы иные глобальные объекты. А если программа запускалась из Sub Main() тогда ничего не получится.

Правильнее всего уничтожить все что было созданной программой (Set SomeObject = Nothing) и затем заверщить программу ерез End.

Автор: cardinal 6.6.2005, 16:02
Понял. Посмотрю, может найду ту книгу, может там что-нибудь другое имелось в виду...

Автор: PavelNL 6.6.2005, 16:46
Спасибо, за полные ответы. но вот своего экзешника я так и не получил. smile
Играет ли версия моего бейсика роль - 5.0 ССЕ? 6-ой стоит в школе, а дома вот это Г.
Хотя может зря я на версию думаю?
В папке у меня лежат три файла одного имние, с разными расширениями: file.frm, file.vbp, file.vbw
Можно так же сохранить группу. Не знаю точно, что это, но кажется, это как раз эти три файла в одном.
Больше в этой папке ничего нету. smile

Автор: Voldemar2004 6.6.2005, 18:18
Цитата

Спасибо, за полные ответы. но вот своего экзешника я так и не получил.


Ну так ведь File->Make Project1.exe ?

Командная строка VB в крайнем случае...

Автор: Naghual 6.6.2005, 18:22
Я конечно дико извеняюсь, но VB 5.0 ССЕ это есть Control Creation Edition.
Он может компилить только в OCX. Да и внутренности у него урезанные.

ИМХО: Однако вещь незаменимая для написания чисто контролов!

Автор: PavelNL 6.6.2005, 19:50
Naghual, кто такое ОСХ? smile

Автор: cardinal 6.6.2005, 20:50
PavelNL, не майся дурью! smile Поставь себе VB6.
Кстати этот подраздел форума называется VB6, а не VB5...
PavelNL, если ты в школе диск на день попросишь тебе не дадут?

Автор: Naghual 6.6.2005, 20:54
OCX - Это скомпилированный код элемента(ов) управления (ActiveX Control).
В любом случае это не то что тебе нужно.

Автор: Voldemar2004 6.6.2005, 21:44
Цитата

ССЕ это есть Control Creation Edition


У меня была такая фишка: удалил случайно какие-то жизненно важные системные файлы для VB 6 и - не поверите - он стал именно Control Creation Edition, если память мне не изменяет. А вот назад попробовать - прописать эти удаленные системные файлы на свое место - не получилось. Пришлось переставлять VB 6 Pro. Вот так. smile

Автор: PavelNL 7.6.2005, 02:46
cardinal, в Голландии все жмоты, не дадут. Но диск я уже пробил. За нарушение рубрикации - пардон, виноват, исправлюсь smile
а вообще не честно, конечно, вот так вот и не скачаешь ничего, башлять только надо везде... =(


Voldemar2004, вот мне бы ухитриться файлы присобачить к моей версии, чтоб 6-ая получилась smile

(топик пока не закрывайте, пожалуйста)

Автор: Naghual 7.6.2005, 09:43
Voldemar2004
Цитата
- не поверите -

И не верю

Автор: Voldemar2004 7.6.2005, 12:54
Цитата

И не верю


Так я ведь бейсик ставил (так же как и удалял впрочем и все другие проги) с помощью Total Uninstaller'а. А он пишет при финализации удаления: файл с расширением таким-то ОС сообщает что он не занят в данный момент - ну так я файлы эти и посносил - сюрпизов потом - ну как я выше рассказал. smile

Автор: Exception 7.6.2005, 15:15
Цитата(Voldemar2004 @ 6.6.2005, 22:44)
не поверите - он стал именно Control Creation Edition

smile smile smile
[offtop]
а у тебя он никогда не становился Working Model Edition?
У меня становился smile и не работал smile
[/offtop]

Автор: Voldemar2004 7.6.2005, 17:04
Цитата

Working Model Edition?


Да точно, я имел в виду именно Working Model Edition. А не Control Creation Edition.

Вот, надо ж было так перепутать. Извиняйте. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)