Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > свойство CanGrow поля отчёта


Автор: kapbepucm 6.11.2007, 17:27
В стандартном поле отчёта есть свойство CanGrow. Возможно ли програмно узнать на сколько поле "хочет вырати", если CanGrow=False?

Добавлено через 1 минуту и 30 секунд
Мне не надо расширять строки, только хочу цифры знать.

Автор: Akina 6.11.2007, 17:54
Цитата(kapbepucm @  6.11.2007,  18:27 Найти цитируемый пост)
Возможно ли програмно узнать на сколько поле "хочет вырати", если CanGrow=False?

Самое простое - установить в true, спросить, какие у него получились размеры, после чего вернуть его (в т.ч. размеры) в первоначальное состояние.

Автор: kapbepucm 7.11.2007, 11:06
"Копаясь" в этом деле, получил странный эффект. При установке CanGrow=True отчёт печатает пустые поля. Чем такое может быть вызвано?

Автор: Akina 7.11.2007, 11:08
Цитата(kapbepucm @  7.11.2007,  12:06 Найти цитируемый пост)
При установке CanGrow=True отчёт печатает пустые поля.

Refresh/Repaint/Requery/Re(чего там еще бывает)...
Да! а свойство-то меняем в режиме макета?

Автор: kapbepucm 7.11.2007, 13:40
Цитата(Akina @  7.11.2007,  11:08 Найти цитируемый пост)
свойство-то меняем в режиме макета?
Режим Design view. Только вот незадача, куда я ни писал RepaintObject, так всё равно не хочет показывать написанное в поле, но всё становится на своё место, как только CanGrow=False

Автор: Akina 7.11.2007, 13:54
kapbepucm, т.е. если я правильно понимаю:
  • Report.Open Design
  • CanGrow=True
  • OldSizes.Store
  • Report.Save
  • Report.Close
  • Report.Open View
  • NewSizes.Store
  • Report.Close
  • Report.Open Design
  • CanGrow=False
  • OldSizes.Restore
  • Report.Save
  • Report.Close
не отрабатывает? или какие-то этапы пропущены?

Автор: kapbepucm 7.11.2007, 14:06
Нет, всё ещё проще:

1)вариант
Report.Open Design
CanGrow=False
Report.Save
Report.Close
Report.Open View
Здесь вижу всё

2)вариант
Report.Open Design
CanGrow=True
Report.Save
Report.Close
Report.Open View
Здесь вижу только те поля у которых CanGrow=False

Добавлено через 1 минуту и 11 секунд
И делаю пока всё ручками

Автор: kapbepucm 14.4.2009, 09:20
Проблема несколько видоизменилась. Теперь надо узнать "насколько выросло" поле в "повторяющейся" секции Detail. Изначально у поля стоит значение CanGrow=True. Но в событии OnFormat этой секции свойство Height показывает старое значение. Вопрос: как узнать новое?

Автор: bopoha 14.4.2009, 11:44
Цитата(kapbepucm @  14.4.2009,  09:20 Найти цитируемый пост)
Вопрос: как узнать новое? 

На событии OnPaint()

Автор: Akina 14.4.2009, 11:47
Цитата(kapbepucm @  14.4.2009,  10:20 Найти цитируемый пост)
в событии OnFormat этой секции свойство Height показывает старое значение. Вопрос: как узнать новое? 

Получать его в методе, вызываемом, когда форматирование уже завершено.

Автор: kapbepucm 14.4.2009, 12:48
Цитата(Akina @  14.4.2009,  11:47 Найти цитируемый пост)
Получать его в методе, вызываемом, когда форматирование уже завершено.
А раньше нельзя? Суть проблемы в том, чтобы узнать высоту самого длинного поля и установить эту высоту всем рядом стоящим полям. После форматирования будет поздно.

Псевдографически у меня такой отчёт:
Код
+=========+=========+=======+
|DataA1   |DataB1   |DataC1 |
+---------+---------+-------+
|DataA2   |DataB2   |Very   |
|         |         |long   |
|         |         |DataC2 |
+---------+---------+-------+
|DataA3   |Very     |DataC3 |
|         |long     |       |
|         |DataB3   |       |
+---------+---------+-------+
|DataA4   |DataB4   |DataC4 |
+=========+=========+=======+
У каждого поля есть Border. Всё вместе- должна получиться красивая таблица.

Автор: Akina 14.4.2009, 13:12
Ну вообще-то так и должно получиться без всяких дополнительных телодвижений...

Автор: kapbepucm 14.4.2009, 15:07
Цитата(Akina @  14.4.2009,  13:12 Найти цитируемый пост)
Ну вообще-то так и должно получиться без всяких дополнительных телодвижений...
Получается так:
Код
+=========+=========+=======+
|DataA1   |DataB1   |DataC1 |
+---------+---------+-------+
|DataA2   |DataB2   |Very   |
+---------+---------+long   |
                    |DataC2 |
+---------+---------+-------+
|DataA3   |Very     |DataC3 |
+---------+long     +-------+
          |DataB3   |
+---------+---------+-------+
|DataA4   |DataB4   |DataC4 |
+=========+=========+=======+


Добавлено через 1 минуту и 44 секунды
"Растёт" только то поле, которое длинное, а надо, чтобы все.

Автор: Akina 14.4.2009, 15:20
А зачем бордюр у ПОЛЯ? Прорисуй прямые между полями и по верху области данных и подножки - они и образуют тебе сетку.

Автор: kapbepucm 14.4.2009, 15:55
Гмм... Но всё равно, чтобы нарисовать вертикальную линию, своиство Height  кое-где надо увеличивать. Проблема осталась
Цитата(kapbepucm @  14.4.2009,  12:48 Найти цитируемый пост)
А раньше нельзя? Суть проблемы в том, чтобы узнать высоту самого длинного поля и установить эту высоту всем рядом стоящим полям. После форматирования будет поздно.
только height надо менять у линии smile
Проблема: нужный вертикальный рамер можно узнать, когда уже поздно менять (OnPrint). Менять что-либо в секции возможно только в OnFormat- но там невозможно узнать, насколько надо менять. Какой выход?

Автор: bopoha 14.4.2009, 16:04
Я такую задачу уже решал. Поищу дома.

Автор: kapbepucm 14.4.2009, 17:18
Цитата(bopoha @  14.4.2009,  16:04 Найти цитируемый пост)
Я такую задачу уже решал. Поищу дома.
Буду с нетерпением ждать smile

Автор: bopoha 15.4.2009, 23:27
Задача решалась следующим образом:
В области данных все поля размещались в одну линию.
Под полями размещена линия (элемент управления): lineEndRow.
Алгоритм вызывается на событие OnPaint и рисует вертикальные линии высотой равной lineEndRow.Top

Например (c работающего кода) :
Код

    Dim ctl As Control
    Dim sct As Section
    Dim lHeight As Long
    Const c_lColor As Long = 3355443
    
    Set sct = Me.Report.Section(acDetail)
    Me.DrawWidth = 1
    
    lHeight = Me.lineEndRow.Top
    For Each ctl In sct.Controls
        If ctl.ControlType = acTextBox And Not (ctl.Name = ... Or ctl.Name = ...) Then
            Me.Line (ctl.Left, ctl.Top)-Step(0, lHeight - 2), c_lColor '-- слева
            Me.Line (ctl.Left + ctl.Width, ctl.Top)-Step(0, lHeight - 2), c_lColor '-- справа
        End If
    Next ctl

Автор: kapbepucm 20.4.2009, 10:33
Простите за нескромный вопрос. Я в Design view (Access2000) не могу найти событие OnPaint smile
Не подскажите событие OnPaint к какому обьекту надо подцепить?

Автор: bopoha 26.4.2009, 22:03
kapbepucm, к тому разделу, где необходимо рисовать линии. В указанном выше примере это Область данных.

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