Текст разными стилями в одной клетке таблицы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ArtNeoX
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 17.02.2014 (Пн) 18:41

Текст разными стилями в одной клетке таблицы

Сообщение ArtNeoX » 23.02.2014 (Вс) 14:37

Из vb6 в Word создается таблица. Нужно в одной ячейке вставить текст двумя строками. Первая строка жирный текст, вторая обычным текстом.


TableWord.Cell(1, 5).Range.Select

With TableWord.Application.Selection
.InsertAfter "Строка жирным текстом" & vbCrLf
.Font.Bold = True
.EndOf
End With

With TableWord.Application.Selection
.InsertAfter "Строка не жирным текстом" & vbCrLf
.Font.Bold = False
.EndOf
End With

В результате появляется только первая строка жирным текстом, вторая не печатается. Что не так?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.02.2014 (Вс) 23:56

Есть подозрение, что надо выделять не ячейку, а текст внутри.

ArtNeoX
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 17.02.2014 (Пн) 18:41

Re: Текст разными стилями в одной клетке таблицы

Сообщение ArtNeoX » 24.02.2014 (Пн) 17:17

А если текст выводится все время разный, разной длины.
Есть идеи как сделать?

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Текст разными стилями в одной клетке таблицы

Сообщение pronto » 25.02.2014 (Вт) 11:11

Код: Выделить всё
   Dim wrdApp As Word.Application
   Dim wrdDoc As Word.Document
   
   Dim wrdSelection As Word.Selection
   
   ' создать экземпляр Word'ы
   Set wrdApp = CreateObject("Word.Application")
 
   ' добавить новый документ
   Set wrdDoc = wrdApp.Documents.Add
   
   Set wrdSelection = wrdApp.Selection
 
   ' создать таблицу
   wrdDoc.Tables.Add wrdSelection.Range, 2, 2, wdWord9TableBehavior
   
  ' оформить
  wrdDoc.Tables(1).Cell(1, 1).Select
   
   With wrdSelection
      .Font.Size = 12
      .Font.Bold = True
      .TypeText "Строка с жирным начертанием"
      .TypeParagraph
     
      .Font.Bold = False
      .TypeText "Строка с обычным начертанием"
   End With

   wrdDoc.Tables(1).Cell(1, 2).Select
   With wrdSelection
      .Font.Size = 14
      .Font.Bold = False
      .Font.Color = wdColorIndigo
      .TypeText "Совет: Открыть "
      .Font.Bold = True
      .TypeText "Word"
      .Font.Bold = False
      .TypeText ", нажать F1, выбрать пункт «Оглавление», найти пункт «Microsoft Word Visual Basic Reference»,"
      .Font.Size = 18
      .TypeText "читать, изучать..."
   End With

   ' сделать Верду видимой
   wrdApp.Visible = True
   
   ' освободить ссылки
   Set wrdSelection = Nothing
   Set wrdDoc = Nothing
   Set wrdApp = Nothing
O, sancta simplicitas!

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 25.02.2014 (Вт) 11:34

ArtNeoX писал(а):А если текст выводится все время разный, разной длины.

Вообще не представляю, на что влияет длина текста...

ArtNeoX
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 17.02.2014 (Пн) 18:41

Re: Текст разными стилями в одной клетке таблицы

Сообщение ArtNeoX » 25.02.2014 (Вт) 18:50

Понял, спасибо. Надо написать мой код вот так:

TableWord.Cell(1, 5).Range.Select
With TableWord.Application.Selection
.Font.Bold = True
.TypeText "Строка жирным текстом"
.TypeParagraph
.Font.Bold = False
.TypeText "Строка не жирным текстом" & vbCrLf
End With


а для чего нужно ?
' освободить ссылки
Set wrdSelection = Nothing
Set wrdDoc = Nothing
Set wrdApp = Nothing

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Текст разными стилями в одной клетке таблицы

Сообщение pronto » 26.02.2014 (Ср) 12:45

Объекты в VB имеют счётчик ссылок. Это означает, что объект хранит количество ссылок на себя. Когда на объект нет ссылок (счётчик = 0), он уничтожается.

При выходе из процедуры, счётчик ссылок уменьшается на единицу — проще говоря — объект автоматически уничтожается. Поэтому в таких случаях нет надобности принудительно объектной переменной (ссылке на объект) присваивать Nothing.

В других случаях, когда необходимо уничтожить громоздкий объект до выхода из процедуры, это делать обязательно. Ещё это относится к объектам, которые объявлены глобально, так как они могут (и будут) существовать вплоть до завершения программы.

Присвоение ссылке на объект Nothing не обязательно приведёт к уничтожению объекта, так как необходимо ВСЕ ссылки на этот объект установить в Nothing. Особенно остро эта проблема возникает с рекурсивными (циклическими) ссылками:
Код: Выделить всё
Sub Foo()
  Dim Token As Object, Phrase As Object

  Set Token = CreateObject("Parser.Token")
  Set Phrase = CreateObject("Parser.Phrase")

  Set Token.Counter = Phrase
...
...
  Set Phrase.Builder = Token
...
...
End Sub

При завершении такой процедуры эти объектные ссылки образуют утечку, потому что они ссылаются сами на себя. Невозможно уничтожить ссылку обнулением объектной переменной, тут необходимо зачистить сами свойства.

То есть правильно так:
Код: Выделить всё
Set Token.Counter = Nothing
Set Phrase.Builder = Nothing

а не
Код: Выделить всё
Set Token = Nothing
Set Phrase = Nothing

Есть ещё подводный камень при использовании ключевого слова New в объявлении объектных переменных.
Код: Выделить всё
Dim Cn As New ADODB.Connection

В таком случае объект создаётся при первом обращении (использовании) к нему, а не там где было использовано ключевое слово New. Присвоение такой ссылке на объект Nothing может уничтожить его, но он будет создан заново при последующем обращении к нему. Чтобы нечаянно не плодить "зомбоков" лучше не использовать такую форму объявления, а использовать оператор New, который не обладает таким "воскрешающим" поведением.
Код: Выделить всё
Dim Cn As ADODB.Connection
Set Cn = New ADODB.Connection
Последний раз редактировалось pronto 26.02.2014 (Ср) 15:07, всего редактировалось 1 раз.
O, sancta simplicitas!

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

Re: Текст разными стилями в одной клетке таблицы

Сообщение Хакер » 26.02.2014 (Ср) 14:28

pronto, много кривостей.

pronto писал(а):Это означает, что объект хранит количество других объектов, которые ссылаются на него.

Объект не хранит кол-во других объектов. Объект хранит количество ссылок на себя. (И если уж быть совсем точно, то не объект хранит, а интерфейс хранит).

pronto писал(а):счётчик локально объявленного объекта уменьшается на единицу

Не существует никаких локально объявленных объектов. Локально могут быть объявленными только переменные, хранящие ссылки.

pronto писал(а):В других случаях, когда необходимо уничтожить громоздкий объект до выхода из процедуры, это делать обязательно.

Зануление ссылки не гарантирует уничтожения объекта.

pronto писал(а):рисвоение такому объекту Nothing может уничтожить его,

Присвоение ссылке, а не объекту.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Текст разными стилями в одной клетке таблицы

Сообщение pronto » 26.02.2014 (Ср) 15:10

Хакер, спасибо за уточнения! Подправил свой предыдущий пост.
Это наверное первый раз, когда я формулирую эти знания в письменном виде — от этого некоторая путанность в терминологии
O, sancta simplicitas!

ArtNeoX
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 17.02.2014 (Пн) 18:41

Re: Текст разными стилями в одной клетке таблицы

Сообщение ArtNeoX » 26.02.2014 (Ср) 18:57

Вообщем что объявляли Dim делаем Nothing

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 26.02.2014 (Ср) 19:01

ArtNeoX писал(а):Вообщем что объявляли Dim делаем Nothing

Нет. Перечитай ещё раз.


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

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

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot] и гости: 22

    TopList