Как программно добавить фрейм на форму?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Как программно добавить фрейм на форму?

Сообщение qwertyhp » 26.12.2017 (Вт) 19:05

Здравствуйте!
Есть форма, на ней фрейм, во фрейме массив кнопочек и т.п.
Необходимо на той же форме программно создать полную копию копию фрейма (с другими, предопределенными именами элементов, конечно).
Знаю, как создавать программно отдельные элементы. А как программно создать полную копию копию фрейма? Пожалуйста, подскажите, если кто знает...
Пятачок Forever! :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16038
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как программно добавить фрейм на форму?

Сообщение Хакер » 27.12.2017 (Ср) 0:57

qwertyhp писал(а):Знаю, как создавать программно отдельные элементы. А как программно создать полную копию копию фрейма? Пожалуйста, подскажите, если кто знает...

Создать фрейм так, как ты создаёшь отдельные элементы, а потом создать дочерние элементы так, как ты умеешь создавать отдельные элементы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3763
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Как программно добавить фрейм на форму?

Сообщение Mikle » 27.12.2017 (Ср) 9:23

qwertyhp писал(а):как создавать программно отдельные элементы

Включив телепатию, я понимаю, что ты ждёшь ответ, типа такого: пройтись по контролам формы циклом For Each, для тех, у которых фрейм является контейнером создать копию.
Но если ты пишешь:
qwertyhp писал(а):с другими, предопределенными именами элементов, конечно

Значит у тебя список контролов уже есть, раз есть список имён, вот тут становится непонятно, что же тогда ещё нужно.

qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Re: Как программно добавить фрейм на форму?

Сообщение qwertyhp » 27.12.2017 (Ср) 17:07

Первоначально я полагал, что существует способ скопировать фрейм с контролами целиком, одномоментно - я заблуждался.
За время после первого моего поста человечество шагнуло вперед, и я написал код, который программно создает фрейм и нужные мне контролы на нем.
Но теперь я не могу программно установить графический стиль кнопочек - чтобы их можно было раскрасить - а нужно.
(строки в коде, касающиеся высоты и ширины - это автоподгон параметров формы/фрейма в зависимости от количества кнопок на ней).
Подскажите, пожалуйста - как программно установить графический стиль кнопочек?
Спасибо.
Код: Выделить всё
    Option Explicit

    Dim Btn()               As VB.CommandButton
    Dim Frame2              As VB.Frame
    Dim p As Integer, nm    As String

Private Sub Form_Load()
    Me.Left = 12865
    Me.Top = 2075
    Set Frame2 = Controls.Add("VB.Frame", "nm1", Form1)
    Frame2.Visible = True
    Frame2.Left = 0
    Frame2.Top = 100
For p = 1 To 16           ' количество кнопок
    ReDim Preserve Btn(p)
    nm = "btn"
    Set Btn(p) = Controls.Add("VB.CommandButton", nm & p, Frame2)

    Btn(p).Visible = True
    Btn(p).TabStop = False
    Btn(p).Caption = p

    Btn(p).Height = 465
    Btn(p).Width = 2055
    Btn(p).Left = 30
    Btn(p).Top = (p - 1) * (Btn(p).Height + 15) + 120
Next p
    Frame2.Height = (p - 1) * (Btn(1).Height + 15) + 150
    Form1.Height = Frame2.Top + Frame2.Height + 395
    Frame2.Width = Btn(1).Width + 75
    Form1.Width = Frame2.Width + 90
End Sub
Пятачок Forever! :)

ALX_2002
Продвинутый гуру
Продвинутый гуру
 
Сообщения: 1999
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Как программно добавить фрейм на форму?

Сообщение ALX_2002 » 30.12.2017 (Сб) 1:28

[OFFTOP] Поздравляю всех с наступающим ! :wink:

qwertyhp, приветствую.

Попробую помочь с Вашим последним вопросом:
Код: Выделить всё
Private Const BM_SETSTYLE = 244
Private Const BS_OWNERDRAW = &HB&

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    lParam As Any) As Long

Private Sub Form_Load()
    Dim ctlButton As CommandButton
    Dim WindowLong As Long
    Set ctlButton = Form1.Controls.Add("VB.CommandButton", "ctlButton")
    SetButtonStyleGraphical ctlButton
    With ctlButton
        .BackColor = vbRed
        .Caption = "Test"
        .Visible = True
    End With
End Sub

Sub SetButtonStyleGraphical(ByRef ctlButton As CommandButton)
    SendMessage ctlButton.hwnd, BM_SETSTYLE, BS_OWNERDRAW, 1
    Set ctlButton.Picture = Nothing
End Sub


Возвращаясь к вопросу о клонировании, добавил в аттач пример. Возможно он Вам поможет.
Вложения
CloneControl.zip
(2.38 Кб) Скачиваний: 4

qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Re: Как программно добавить фрейм на форму?

Сообщение qwertyhp » 30.12.2017 (Сб) 21:52

ALX_2002, СПАСИБО!!! Все раскрасилось, клонируется - ...
Но начались чудеса. Код ниже клонирует массив кнопок во фрейме - но при нажатии на любую из них если какая-либо кнопка теряет фокус - то из объемной кнопка становится плоской, а подпись на кнопке выравнивается влево. И так при нажатии на любую кнопку: если имеет кнопка фокус - то надпись по центру, кнопка объемна: теряет кнопка фокус - надпись слева, и кнопка плоская. Как исправить?
И еще вопрос: как обработать нажатие кнопки (ну, что-то вроде Private Sub Command1_Click()), если имя кнопки - это набор переменных? Как записать в коде, грамотно обозвав это самое Command1_Click()?
Спасибо.
Всех с наступающим Новым Годом!
Код: Выделить всё
    Option Explicit

    Private Const BM_SETSTYLE = 244
    Private Const BS_OWNERDRAW = &HB&

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
        ByVal hwnd As Long, _
        ByVal wMsg As Long, _
        ByVal wParam As Long, _
        lParam As Any) As Long

        Dim Btn()               As VB.CommandButton
        Dim Frame()             As VB.Frame
        Dim f  As Integer, p As Integer, nm    As String

    Private Sub Form_Load()
        Me.Top = 2075
For f = 1 To 3
    ReDim Preserve Frame(f)
    Set Frame(f) = Controls.Add("VB.Frame", "mm" & f, Form1)
    Frame(f).Visible = True
    Frame(f).Top = 100
    Frame(f).Left = (f - 1) * 3000

    For p = 1 To 16           ' количество кнопок
        ReDim Preserve Btn(p)
        nm = "btn"
        Set Btn(p) = Controls.Add("VB.CommandButton", nm & f & "_" & p, Frame(f))

        SetButtonStyleGraphical Btn(p)
        With Btn(p)
            .BackColor = vbYellow
            '.Caption = "Test"
            .Visible = True
            .TabStop = False
        End With

        Btn(p).Visible = True
        Btn(p).TabStop = False
        Btn(p).Caption = "Frame " & f & "     btn " & p

        Btn(p).Height = 465
        Btn(p).Width = 2055
        Btn(p).Left = 30
        Btn(p).Top = (p - 1) * (Btn(p).Height + 15) + 120
    Next p

    Frame(f).Height = (p - 1) * (Btn(1).Height + 15) + 150
    Form1.Height = Frame(f).Top + Frame(f).Height + 395
    Frame(f).Width = Btn(1).Width + 75
Next f
    End Sub

    Sub SetButtonStyleGraphical(ByRef ctlButton As CommandButton)
        SendMessage ctlButton.hwnd, BM_SETSTYLE, BS_OWNERDRAW, 1
        Set ctlButton.Picture = Nothing
    End Sub

Пятачок Forever! :)

ALX_2002
Продвинутый гуру
Продвинутый гуру
 
Сообщения: 1999
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Как программно добавить фрейм на форму?

Сообщение ALX_2002 » 31.12.2017 (Вс) 0:48

qwertyhp,

1) Боюсь тогда придётся гораздо больше повозиться с API. Не зря разработчики VB 6.0 сделали эту настройку доступной только в Design Mode.

Возможно Вам пригодятся следующие ссылки, откуда я брал пример:
http://forums.devx.com/showthread.php?42657-Changing-the-style-of-a-CommandButton-to-Graphical-at-run-time
http://vbnet.mvps.org/index.html?code/intrinsic/buttonstyle.htm
https://www.daniweb.com/programming/software-development/threads/352733/change-color-of-command-buttons

2)
как обработать нажатие кнопки (ну, что-то вроде Private Sub Command1_Click()), если имя кнопки - это набор переменных?


Можно воспользоваться VBControlExtender, но Вы уверены, что хотите идти этим путём ? Мой пример в аттаче не подходит под Ваши нужнды ?

qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Re: Как программно добавить фрейм на форму?

Сообщение qwertyhp » 02.01.2018 (Вт) 16:38

ALX_2002, пример отличный, спасибо - только пока непонятно, как к копии кнопки привязать функционал, отличный от оригинала. Ну, чтобы и имя копии отличалось от оригинального, и результаты нажатия. Возможно, я туплю - но непонятно... :shock:
Пятачок Forever! :)

ALX_2002
Продвинутый гуру
Продвинутый гуру
 
Сообщения: 1999
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Как программно добавить фрейм на форму?

Сообщение ALX_2002 » 11.01.2018 (Чт) 12:51

qwertyhp, Для начала хотелось бы понять общую конву задачи. ) А то возможно идём не в том направлении ?

qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Re: Как программно добавить фрейм на форму?

Сообщение qwertyhp » 17.01.2018 (Ср) 1:18

Итак - канва задачи.
Я - пользователь Интернет. Я периодически захожу на одни и те же сайты. В стандартных условиях одни и те же адреса, изо дня в день, приходится либо вызывать с помощью возможностей, любезно предоставляемых браузером - либо вводить вручную.
Это утомляло.
Для улучшения эргономики условий своего труда я сделал программку, которая вызывала один (либо группу) интернет-страниц путем простого нажатия на подписанную кнопочку на форме. Удобства ради кнопочки имеют (и меняют) цвет.
Но наука не стоит на месте - и мне понадобилась уже не одна панелька с кнопочками, удобства ради помещенных во фрейм - а группа фреймов с кнопочками. При этом предполагается, что одна панелька будет на переднем плане, а другие будут из-за нее "выглядывать". При этом важно, чтобы кнопочки не имели предопределенных подписей и подписывались при прочтении файла Базы ссылок (например, текстового файла) по мере надобности.
Попытка программного создания фреймов с РАСКРАШИВАЕМЫМИ кнопками натолкнулась на проблемы, изложенные выше.
В Аттаче представлен код, который частично решает мою задачу - из фрейма с одной кнопкой порождается фрейм с заданным количеством кнопок, а также заданное количество дополнительных фреймов.
Вот только все дополнительные кнопки слой за слоем оседают на нулевом фрейме (я смотрел), а дополнительные фреймы получаются без кнопок. Как сделать так, чтобы дополнительные, размноженные фреймы тоже были с кнопками?
Вложения
ProgramCopy Control.zip
(1.77 Кб) Скачиваний: 5
Пятачок Forever! :)

ALX_2002
Продвинутый гуру
Продвинутый гуру
 
Сообщения: 1999
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Как программно добавить фрейм на форму?

Сообщение ALX_2002 » 17.01.2018 (Ср) 11:30

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

Такой вариант решения не подходит ? Он позволяет за 1 раз открыть нужную группу ссылок.
ссылка

В частности для Google Chrome это выглядит так:

1. Группа ссылок:
Изображение

2. Открытие группы ссылок:
Изображение

qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Re: Как программно добавить фрейм на форму?

Сообщение qwertyhp » 17.01.2018 (Ср) 17:58

О группировании закладок/страниц знаю - но я стал разрабатывать собственный сервис потому, что потребовалась более многоуровневая иерархия вложенности (например, применительно к Avito.ru); во-вторых, самописный сервис включает в себя обработку/анализ загруженных страниц (например, на новизну или наличие нужного контента), по результатам которых не представляющие интереса страницы закрываются автоматически; на Авито позволяет искать объявления до последнего ранее просмотренного; да и просто удобно, когда можешь вносить изменения и расширять возможности по мере необходимости.
К тому же, у моего FireFox' а периодически слетают настройки. А потом вдруг иногда появляются. А у Яндекса слетают виджеты, и автоматическое размещение их позволяет установить их заново (интересно было бы взглянуть на АПИ).
Ввиду изложенной аргументации остается открытым вопрос: как размножать фрейм вместе с кнопочками, каждая из которых жила бы своей жизнью?
Пятачок Forever! :)

NashRus
Постоялец
Постоялец
 
Сообщения: 362
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Как программно добавить фрейм на форму?

Сообщение NashRus » 18.01.2018 (Чт) 8:06

на UserControl помести всё, что нужно размножать.

qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Re: Как программно добавить фрейм на форму?

Сообщение qwertyhp » 19.01.2018 (Пт) 0:26

NashRus, ранее ALX_2002 именно это и предложил - но только пока непонятно, как к копии кнопки привязать функционал, отличный от оригинала. Ну, чтобы и имя копии отличалось от оригинального, и результаты нажатия.
Пятачок Forever! :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16038
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как программно добавить фрейм на форму?

Сообщение Хакер » 19.01.2018 (Пт) 6:09

qwertyhp писал(а):Ну, чтобы и имя копии отличалось от оригинального, и результаты нажатия.

Кому какое дело, какое у кнопки имя, кроме как в моменти, когда кому-то захочется найти её в коллекции контролов?

У кнопки один результат нажатия — кнопка генерирует событие Click. На это событие может быть никто не подписан, подписан 1 клиент или подписано 20 клиентов, а может быть 100 клиентов. Какие там действия произойдут во всех обработчиках события клик — кнопке всё равно. Точно так же ей всё равно, сколько там вообще обработчиков висит на событии Click — ноль, один, два, шестьдесят...

Прокачай своё понимание ООП, механизма обработки событий, и проблема решится сама собой, вернее, окинув ситуацию новым взглядом, ты поймёшь, что никакой проблемы вообще не существует.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Продвинутый гуру
Продвинутый гуру
 
Сообщения: 1999
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Как программно добавить фрейм на форму?

Сообщение ALX_2002 » 19.01.2018 (Пт) 12:56

qwertyhp, честно говоря постановка задачи мне пока так и не ясна. Не понял зачем нужно клонирование, если действия кнопок должны измениться. Для меня это звучит как - "хочу такой же один в один, но чтоб делал совсем другое". На это в моей голове рождается ответ - "Так проще же сразу сделать совсем другое, чтобы оно выполняло другую задачу" Если Вы собираетесь на все кнопки "клона" фрейма навешивать новые события, то что мешает создавать эти кнопки по отдельности ? Зачем нужен фрейм ? В чём его задача ? Посмотрел Ваш пример, из него этого тоже, к сожалению, не понял. Видимо старею. :roll:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 4

    TopList