Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2009, 14:56   #1
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию Нужна идея

Господа, есть телевизионная программа ТВпрограмма.rar. Нужно ее структурировать. Т.е. разделить программы по каналам, дням выхода, названию программы и времени выхода.
Я попытался это сделать классами, но не хватает элементов в коллекции. Им может быть только 256, а мне нужно больше. Какие будут идеи?

P.S. Большое спасибо EducatedFool за пример работы с классами.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 04.02.2009, 15:27   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Я попытался это сделать классами, но не хватает элементов в коллекции. Им может быть только 256
Попробуй запустить такой код:
Код:
Sub test()
    Dim coll As New Collection
    For i = 1 To 500000
        coll.Add i
    Next
    MsgBox coll.Count
End Sub
Да и не надо все строки загонять в одну коллекцию.

Сделай 2 класса:
первый - программа за день (содержит коллекцию элементов 2-го класса)
второй - телепередача (имеет 2 или 3 свойства типа: время, наименование телепередачи, дата)

Так (с двумя классами, а не с одним), мне кажется, будет потом удобнее работать, если ты на основе полученных коллекций будешь формировать программу в другом формате.
Хотя, в принципе, и одного класса хватит...

А почему программа в формате Word?
Ты её сам преобразуешь из формата HTML, или она тебе поступает изначально в таком виде?
EducatedFool вне форума Ответить с цитированием
Старый 04.02.2009, 15:48   #3
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Попробуй запустить такой код:
Результат на картинке
Вложение 8563
Думаю, что нужно три класса: один — программа за неделю, второй — программа за день, третий соственно сама программа с именем канала, и временем выходаю
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 15.04.2009 в 14:44.
viter.alex вне форума Ответить с цитированием
Старый 04.02.2009, 15:50   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Результат на картинке Owerflow.png
Ну, не знаю...
Я проверял этот код в VBA Office 2003.
Мои программы (которые используют коллекции из тысяч элементов) запускались и под Office 2003, и под Office 2007.
(проверял в Excel и в Word)

Попробуй не 500 000, а 50 000...

Цитата:
Думаю, что нужно три класса: один — программа за неделю, второй — программа за день, третий соственно сама программа с именем канала, и временем выходаю
Да не проблема... хоть 10 классов.
Ты объясни, для чего ты это хочешь использовать...

По поводу Overflow:
я как-то видел в твоём коде строки типа: DefInt I
Переполнение возникает как раз из-за этого.
Попробуй в цикле заменить i на j

Последний раз редактировалось EducatedFool; 04.02.2009 в 15:58.
EducatedFool вне форума Ответить с цитированием
Старый 04.02.2009, 16:03   #5
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Поскольку у меня стоит Option Explicit, то i я объявил как Integer. В этом и проблема.
Вот код, который помог выявить ошибку:
Код:
Sub test()
    Dim coll As New Collection
    Dim i As Integer
    On Error Resume Next
    For i = 1 To 500000
        coll.Add i
        If Err.Number <> 0 Then
          MsgBox coll.Count: Err.Clear: End If
    Next
    MsgBox coll.Count
End Sub
Она происходила сразу при инициализации цикла. Меняем Integer на Double и все работает.

А почему же тогда в класс добавлялось только 256 элементов
Добавлено
Игорь, посмотри, сколько членов показывает окно Locals для коллекции coll
Добавлено
Показывать-то, оно показывает, но членов в коллекции больше. Оказывается первый код работает правильно, только с именами каналов нужно поработать, а то не записываются.
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 04.02.2009 в 16:11.
viter.alex вне форума Ответить с цитированием
Старый 04.02.2009, 16:13   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Создай модуль класса Class1
У этого класса определи одно свойство:
Код:
Public index As Double

В стандартном модуле напиши:
Код:
Sub test()
    Dim coll As New Collection
    For i = 1 To 50000
        Set cl = New Class1: cl.index = i: coll.Add cl
    Next
    MsgBox coll.Count
End Sub
У тебя создастся коллекция с 50000 экземплярами этого класса.

PS: Убери все свои DefInt I, DefBool B и т.д. - и проблем не будет...

(добавлено)
Действительно, почему-то в окне Watches отображается только 256 элементов
Однако, если ты запустишь код:
Код:
Sub test()
    Dim coll As New Collection
    For i = 1 To 50000
        Set cl = New Class1: cl.index = i: coll.Add cl
    Next
    MsgBox coll.Item(14256).index
    'MsgBox coll.Count
End Sub
то увидишь, что все элементы в действительности создаются.

Последний раз редактировалось EducatedFool; 04.02.2009 в 16:16.
EducatedFool вне форума Ответить с цитированием
Старый 04.02.2009, 16:26   #7
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
…PS: Убери все свои DefInt I, DefBool B и т.д. - и проблем не будет…
Зачем? Мне так удобнее.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 05.02.2009, 13:23   #8
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Сделал с одним классом для телепрограммы со свойствами канал, название и время выхода и с двумя коллекциями: одна для дней недели, которая хранит все программы данного дня и вторая для недели, которая хранит все коллекции дней.
Но теперь пояыился еще вопрос. При создании коллекции недели я ключом к элементу коллекции назначаю дату. Как прочитать этот ключ?
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 05.02.2009, 17:12   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
с двумя коллекциями: одна для дней недели, которая хранит все программы данного дня и вторая для недели, которая хранит все коллекции дней
весьма оригинальный подход.
Я бы сделал по-другому...

Цитата:
Как прочитать этот ключ?
Никак. Не надо ограничиваться только коллекциями.
Есть более простые способы достижения результата.
Достаточно добавить в главный класс метод, возвращающий нужный элемент подкласса с заданными свойствами, и всё.

Чуть попозже объясню, как лучше сделать.

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

Последний раз редактировалось EducatedFool; 05.02.2009 в 17:21.
EducatedFool вне форума Ответить с цитированием
Старый 05.02.2009, 18:23   #10
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
…Если ты прикрепишь файл с уже имеющимся кодом - будет намного проще.
Не забудь описать, что требуется получить в итоге, т.е. для каких целей предназначена прога.
Не я сам Ты пример приведи, а я разберусь.
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
…Есть более простые способы достижения результата.
Достаточно добавить в главный класс метод, возвращающий нужный элемент подкласса с заданными свойствами, и всё…
Идея! Спасибо. Но пример нужен, а то долго думать буду
Добавлено позже
Есть еще идея использовать «user-defined data type» . Почитал справку, вроде подходит. Опять придется код переписывать
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 05.02.2009 в 20:03.
viter.alex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть идея для создания игры!!! Mb666 Gamedev - cоздание игр: Unity, OpenGL, DirectX 8 01.04.2009 23:59
Идея: Анализатор сайтов с искусственным интелектом NoComm Свободное общение 4 05.01.2009 09:30
есть одна идея Askar_g Работа с сетью в Delphi 5 26.12.2008 09:24
Идея по определению ip сервера ben95 Работа с сетью в Delphi 4 07.05.2008 23:09
Есть идея, но не знаю, как сделать. Небесный Свободное общение 22 01.04.2007 18:07