1. Для добавления поля к таблице необходимо добавить новый объект Field к существующей коллекции Fields

Dim DB As DataBase [AAnA32]

Dim Td As TableDef

Dim Fld As Field ‘Создать новый объект Field

Set Db=DBEngine. Workspace(0).OpenDatabase(“C:\Biblio.mdb”)[AAnA33]

Set Td=DB. TableDefs(“Authors”)

Set Fld= Td.CreateField(“NewField1”,dbText,30) ‘Создать первое новое поле

Td.Fields.Append Fld ‘добавить поле к коллекции Fields

Set Fld= Td.CreateField(“NewField2”,dbText,20) ‘Создать второе новое поле с помощью той же переменной

Td.Fields.Append Fld ‘добавить еще один объект к коллекции Fields

Db.Close ‘Закрыть базу данных

2. Для добавления таблицы к базе данных необходимо добавить новый объект TableDef к существующей коллекции TableDefs. Например:

Dim DB As DataBase [AAnA34]

Dim NewTd As TableDef ‘ Создать новый объект TableDef

Dim NewFld As Field ‘Создать новый объект Field

Set Db=DBEngine. Workspace(0).OpenDatabase(“C:\Biblio.mdb”)

Set NewTd=DB.CreateTableDef(“NewTable”)

Set NewFld= NewTd.CreateField(“NewField”,dbInteger)

NewTd.Fields.Append NewFld ‘добавить поле к таблице

DB.TableDefs.Append NewTd ‘добавить таблицу к базе данных

Db.Close ‘Закрыть базу данных

3. Для добавления индекса к таблице необходимо добавить новый объект Index к существующей коллекции Indexes . Например:

Dim DB As DataBase, Td As TableDef, NewIdx As Index ,NewFld As Field [AAnA35]

Set Db=DBEngine. Workspace(0).OpenDatabase(“C:\Biblio.mdb”)

Set Td=DB. TableDefs(“Authors”)

Set NewIdx =Td.CreateIndex(“Address[AAnA36] _Index”)

NewIdx.Unique=False

Set NewFld= NewIdx.CreateField(“Address”,)

NewIdx.Unique=False

NewIdx.Fields.Append NewFld ‘добавить поле к объекту Index

Td. Indexes.Append NewIdx ‘добавить объект Index к TableDef

Db.Close ‘Закрыть базу данных

4. Для удаления таблицы используется метод Delete коллекции TableDefs. Этот метод удаляет из таблицы все поля, индексы и данные, содержащиеся внутри таблицы. Например:

Db.TableDefs.Delete “Authors”

5. Для удаления поля (объекта Field) используется метод Delete объекта TableDef.

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

6. Для удаления индекса используется метод Delete коллекции TableDefs.

Например:

Db.TableDefs(“Authors”). Indexes.Delete “Address[AAnA37] _Index” ‘ Из коллекции Indexes в таблице Authors удаляется индекс “Address[AAnA38] _Index”.

Нельзя удалять объект Index, который формирует объект Relation.

7. Для изменения поля необходимо создать новый объект TableDef, который отражает требуемые изменения в полях, и затем переместить данные в новую таблицу, удалив старую.

Модификацию базы данных можно также проводить с помощью специальных запросов SQL.

Работа с записями базы данных

Работа с записями базы данных(добавление, удаление, модификация, поиск, сортировка) осуществляются DAO посредством объектов Recordset. Объект Recordset представляет записи исходной таблицы или записи, получаемые в результате выполнения запроса. Существуют 5 типов объектов Recordset:

*        Объект Recordset типа table работает с локальной таблицей базы данных или вешней базы данных, созданной MS Jet. Этот объект можно индексировать, используя индекс, созданный для исходной таблицы, что намного ускоряет сортировку и поиск по сравнению с другими типами объектов Recordset.

*        Объект Recordset типа dynaset (динамический набор) создается для локальных или связанных таблиц или с результатами запросов. Фактически, это набор ссылок на записи одной или более таблиц. С помощью dynaset можно получать и модифицировать данные более, чем одной таблицы, включая связанные таблицы из других баз данных. Набор dynaset и его исходные таблицы модифицируют друг друга. Dynaset - наиболее гибкий и мощный тип набора записей, хотя поиск в них работает не так быстро, как в случае table.

*        Объект Recordset типа snapshot (моментальный снимок) содержит фиксированную копию данных в состоянии на момент создания snapshot. Snapshot, созданный на базе источника данных MS Jet, не может быть обновлен. Snapshot требует меньших затрат обработки, чем dynaset или table, и запросы в них выполняются быстрее.

*        Объект Recordset типа forward- only (листаемый снимок, только вперед), обеспечивает подмножество функций snapshot. Он предоставляет меньше всего возможностей, но зато самое высокое быстродействие. Он не является обновляемым, и он позволяет перемещаться по записям только в прямом направлении.

*        Объект Recordset типа dynamic - результирующий набор запроса одной или нескольких исходных таблиц, в котором можно добавлять, изменять или удалять записи.

Выбор того или иного типа набора записей зависит от того, какие функции необходимо выполнить, нужно ли изменять или просто просматривать данные. Обычно Объект Recordset типа table почти всегда обеспечивает наивысшую эффективность.

[AAnA39]

Создание перемещений RecordSet

Для этого используется метод OpenRecordSet

Set rstNew = dbs.OpenRecordSet(“Customers”, dbs.Open RecordSet),

где rstNew - переменная, dbs.OpenRecordSet(“Customers”, dbs.Open RecordSet) - ссылка на объект, возвращаемый методом OpenRecordSet.

Этот метод доступен не толко для объекта Database, но и Connection, TableDef, QueryDef и существующих наборов RecordSet.

Set rstNew = qdf.OpenRecordSet

Например, создается объект RecordSet из сохраненного в текущей БД запроса.

Dim dbs As Database, Rst As RecordSet

Set dbs=OpenDatabase (“Nwind.mdb”

[ Set rst = dbs.OpenRecordSet (“Сохраняет_Запрос”)]

или если сохранение запроса не существует

Dim strQuerySQL As String

Set dbs=OpenDatabase (...

StrQuerySQL=“Select * From Products”_ & “Order by ProductName”

Set rst=dbs.OpenRecordSet (strQuerySQL)

Перемещение по набору записей

Методы MoveFirst, MoveLast, MoveNext, MovePrevious - перемещает указатель.

Move [n]

Переделы набора записей определяется свойствами BOF и EOF, количество записей свойством - RecordCount.

Найти определенную запись в наборе можно с помощью метода Seek (для Table) и Find (dynaset, snapshop): FindFirst, FindLast, FindNext, FindPrevious.

Например

rstOrderDetails.Find “Order ID= ” & rstOrders.[Order ID] - для первой записи в Orders найти .... запись в OrderDetails

rst Suppliers.Index=“CompanyName”

rst Suppliers.Seek “=” str CompanyNAme

If rst Suppliers. NoMatch Then ...

(используется текущий индекс таблицы, определенной свойством Index). Свойство NoMatch используется для проверки найденной записи, критерий поиска.

После создания объекта RecordSet типа table или dynaset в переменной можно удавлять или добавлять, модифицировать новые записи (Update, Delete, AddNew).

.... модификации намного эффективнее с помощью запросов SQL.

Dim dbs As DataBAse, qdfChangeTitles As QueryDef

Set dbs = Open Database (‘ Nwind.mbb)

Set qdfChangeTitles=dbs.Create QueryDef (“ “)

qdf ChangeTitles.SQL=“Update Employers” & “Where Title = ‘Бухг’”

После извлечения записи можно обращаться к ее отдельным полям через коллекцию Fields объекта RecordSet по его свойству Name (имя столбца в таблицк)

rst Employers.Fields (“LastName”)

или rstEm.LastName

или rstEm.Fields(0) - индексом в коллеции

Типы данных объекта Field: dbChar, bdByte, dbDouble, dbInteger, dbSingle, dbLong, dbText.

При работе с данными Field используется его свойство Value.

Sub Change Title( )

rstEmployces.LastName.Value=strName

Dim dbsSales As Database

Dim rstEmp As RecordSet, fldTitle As Field

Dim wspCurrent As WorkSpace

Set wspCurrent As WorkSpace

Set wspCurrent=dbEngine WorkSpace(0)

Set dbsSales=OpenDatabnase (“Nwind.mdb”

Set rstEmp=dbsSales.Open RecordSet(“Employes”, dbOpenTable)

Set fldTitle=rstEmp.Fields(“Title”)

rst Emp.MoveFirst

Do Until rstEmp.EOF

If fldTitle=“Ком. предст.” Then

rstEmp.Edit

fldTitle=“Ком. агент”

rstEmp.Update

End If

rstEmp.MoveNext

Loop

rstEmp.Close

dbsSales.Close

End Sub

Создание запросов

Методв CreateQueryDef:

Set запрос = БД.CreateQueryDef ([имя] [, строка SQL])

- запрос - объектная переменная, в которых будет храниться ссылка на вновь создаваемый объект типа QueryDef

- БД - объектная переменная, хранящая ссылку на объект Database, в коором будет храниться создаваемый объект QueryDef

- имя - имя запроса

- строка SQL - выражение SQL, ..... объект QueryDef

Например,

Dim dbs As Database

Dim myqdf As QueryDef

SQL str = “Select * From Products”

SQL str = SQl str & “Where price >1000 and price <2000”

SQL str = SQL str “Order by ProductName”

Set myqdf = dbs Create QueryDef (“NewProducts”, SQL str)

Связь с другими приложениями Windows

VB позволяет использовать многозадачность Windows, позволяя активировать любое из заданных приложений, либо посылать напрямую команды активному приложению из проекта VB. Обмен информацией между приложениями Windows средствами VB осуществляется одним из трех способов:

1) использование буфера обмена Clipboard;

2) технологии DDE - динамический обмен данных;

3) технологии OLE - связывание и встраивание объектов.

Буфер обмена

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

Методы объекта Clipboard

Метод Clear - очищает буфер обмена перед его использованием, Clipboard.Clear

Метод SetText - посылает текстовую информацию, содержащуюся в строковой переменной или строковом выражении в буфер, уничтожая старую информацию.

Clipboard.SetText.StringData

Метод GetText - возвращает копию текста, хранящегося в буфере обмена (операция вставки). Этот метод используется как обычная функция:

txtUser.SelText= Clipboard.GetText( ) - вставляет содержимое буфера в текстовое поле.

При работе с буфером обмена и полями ввода используются операции выделения текста. Выделенному тексту присущи три свойства:

SelStart - номер позиции текста, с которой начинается выделение.

txt.User.SelStart = 0 - выделение текста с начала поля ввода.

SelLength - количество символов в выделенном фрагменте текста.

txtUser. SelLength = Len (txt.User.Text) - выделены все символы поля ввода.

SelText - выделенный фрагмент текста. Если текст не выделен, то = “ “

A$ = txtUser.SelText - переменная A$ примет значение выделенной строки.

Пример. Процедура копирования в буфер выделенного текста

Private Sub Copy_Click ()

Clipboard.SetText txtUser.SelText

Enb Sub

Операция вырезать:

Private Sub Cut_Click

Clipboard.SetText txtUser.SelText

txtUser.SelText = “ ”

Enb Sub

Операция вставки:

Private Sub Paste_Click

txtUser.Text = Clipboard.GetText( )

Enb Sub

Перенос графических изображений с помощью буфера обмена.

Чтобы правильно восстановить графическое изображение из буфера обмена, VB должен знать его тип.

Таблица типов данных буфера.

 

Символьные константы Значение Формат
VbCFText 1 текст .txt
VbCFBitmap 2 побитовое изображение .bmp
VbCFMetafile 3 побитовое изображение .wmf
VbCFDib 8 побитовое изображение .dib
VbCFPalette 9 цветовая палитра

Можно узнать тип данных в буфере с помощью метода GetFormat:

Clipboard GetFormat (Format %), где Format % - значение или константа из таблицы. Возвращает значение True, если данные из буфера имеют соответствующий формат.

If Clipboard.GetFormat (2) Then MsgBox “Побитовое изображение”.

Для получения изображения из буфера используется метод GetData:

Clipboard. GetData (Format %), где Format %

Пример.

If Clipboard. GetFormat (VbCFText) Then

txtUser.Text = Clipboard.GetText ( )

Else If Clipboard.GetFormat (VbCFBitmap) Then

pic My.Picture = Clipboard. GetData(VbCFBitmap)

Else If Clipboard.GetFormat (VbCFMetafile) Then

pic My.Picture = Clipboard. GetData(VbCFMetafile)

Else If Clipboard.GetFormat (VbCFDib) Then

pic My.Picture = Clipboard. GetData(VbCFDib)

Else MsgBox “Не определн графический объект”

End If

Копирование изображения из графического окна в буфер обмена в формате побитового изображения:

Private Sub PictureCopy_Click( )

Clipboard.Clear

Clipboard.SetData Pic.My.Picture,2

DDE

При использовании метода DDE одно приложение Windows (клиент) запрашивает у другого приложения (сервера) какую-либо информацию. Для VB в качестве сервера может выступать текстовая форма, а клиентами могут быть поля ввода, графические окна или надписи. Однако элементы управления на форме могут также передавать информацию с помощью своих свойств. Любое приложение может выступать одновременно и как клиент и как сервер: Excel?VB?WinWord.

Для установки связи нужно знать имя соответствующего приложения, например, WinWord, Excel, имя DDE для формы VB соответствующего имени исполняемого файла, либо имени проекта без расширения, если в среде разработки.

Кроме того, задается предмет DDE-связи, в частности, специфические имена файлов. Например для Excel это .xls и .xle.

И третье, указывается, какая информация передается - элемент данных DDE-связи. Например для Excel-сервера DDE элементом данных будет ячейка ... Для VB как сервера DDE элементом данных будут графические окна, поля ввода, надписи.

Свойства DDE.

LinkTopic формат: имя сервера \ имя приложения, например

Excel\ C:\ EXCEL\ Sheet1.xls

Можно устанавливать значение этого свойства для поля ввода, графического окна, надписи. Изменение значения свойства приводит к закрытию всех связей с данным приложением. Это позволяет приложению-клиенту переключаться на другие объекты.

LinkItem - определяет конкретные данные, которые будут передаваться от сервера к клиенту. Например, содержание ячейки первого столбца первой строки листа Excel Ric1/

Синтаксис: [имя формы, ] имя элемента управления.LinkItem = Item $

Item $ - строкове выражение, которое определяет элемент данных сервера.

LinkMode - режимя связи: LinkMode = 1 - горячая связь, LinkMode = 2 - холодная связь, LinkMode = 0 нет (связь разрывается)

Горячая связь - сервер посылает данные, содержащиеся в элементе связи DDE, когда эти данные изменяются в приложении-сервере; холодная - клиент должен требовать новой передачи данных.

События DDE

LinkOpen - генерируется всякий раз при установлении связи (например, информация пользователю)

Private Sub picMy_LinkOpen (Cancel As Integer)

M$ = “DDE связь установлена с” + PicMy.LinkTopic “поданным”+

M$ = M$ + PicMy.LinkItem

MsgBox

End Sub

LinkClose - завершение сеанса DDE;

для формы - Private Sub frmMy_LinkClose( ),

для элемента управления Private Sub txtMy_LinkClose(Index As Integer)

LinkExecute - если клиенту необходима какая-либо информация от сервера, когда клиент посылает команду серверу.

Private Sub Form_LinkExcecute(Command As String, As Integer )

LinkError - для обработки ошибок в сеансе связи

Private Sub FormMy_LinkError(LinkErr As Integer )

Методы DDE

LinkExecute - для посылки команд серверу DDE

элемент управления.LinkExecute Командная строка

LinkPoke - пересылка содержимого любого элемента управления DDE-клиента серверу.

Например, txtMy.LinkPoke (посылает содержание .Text)

LinkRequest - посылка запроса DDE-серверу.

LinkMode = 2

txtMy.LinkRequest - запрос на пересылку информации в свойство Text

LinkSend - если форма выступает в качестве DDE-сервера и необходимо послать содержание окна изображения.

picMy.LinkSend (при внесении существенных изменений в изображении).

OLE

OLE, сокращение от object linking and embedding (связывание и встраивание объектов), сначала рассматривалась как технология, дополняющая и расширяющая динамический обмен данными DDE. Впоследствии она далеко ушла от своего начального предназначения. В частности, сейчас этот термин рассматривается отдельно от других и имеет собственное предназначение.

Одним из отличий OLE от DDE является то, что переданный объект полностью сохраняет свой внешний вид и свойства, которыми он обладал в создавшем его приложении. Т.е. электронные таблицы представляются как электронные таблицы, текстовые документы выглядят так же, как они выглядели в текстовом процессоре и т.д. После того как в проект Visual Basic добавляется контейнерный элемент OLE, по сути дела создается мост, связывающий пользователя с другим приложением Windows, и этот элемент выглядит точно так же, как он выглядел в другом приложении.

При работе с OLE первым и самым важным понятием является объект. Объект представляет собой данные, которые поставляются приложением Windows, поддерживающим OLE, например, для Excel это электронная таблица (или ее часть). Для работы с объектами OLE необходимо использовать переменные типа Object (см. главу II), а для передачи информации в эти объекты используется тип данных Variant.

Для понимания смысла связывания представим себе группу, совместно работающую над этой книгой. Кроме автора, в работе принимают участие технический редактор, помощник редактора, корректор и многие другие. Наиболее эффективным способом работы над книгой для такой группы будет использование единого экземпляра документа с возможностью внесения изменений в текст книги каждым участником рабочей группы. Заметим, что необходимо использовать один экземпляр книги (например, на центральном сервере); в этом случае группе не придется беспокоиться о том, что какие-то важные исправления будут пропущены. (Выражаясь на жаргонном языке, это позволяет работать в большей степени параллельно, чем последовательно, нескольким участникам группы.) В случае со связанными объектами данные остаются в приложении, которое их создало. Представим себе процесс связывания как прикрепление связи к уже существующим данным. Технически при связывании в приложение Visual Basic вставляется значок, указывающий на связь, а изображение данных cохраняется в элементе управления OLE.

Идея встраивания находит применение в том случае, когда создается документ, объединяющий различные приложения Windows "под одной крышей". Встраивание в OLE позволяет пользовательским элементам встраивать внутрь себя данные. Когда Visual Basic обращается к управляющему элементу OLE, элемент переключается обратно в приложение, в котором он был создан, что позволяет использовать возможности "родного" приложения для внесения в элемент необходимых изменений.

Одной из основных задач, возложенных фирмой Microsoft на технологию OLE, являлось разрушение у пользователей стереотипов, при которых приложение рассматривалось в качестве важнейшей составляющей работы пользователя. Вместо этого на первое место было поставлено понятие документа. Например, предположим, что разрабатывается сложный отчет, включающий в себя табличные данные и графические объекты. При этом надо при работе с одной из частей документа использовать текстовый редактор, а с другой - систему управления электронными таблицами. При использовании технологии OLE другое приложение временно получает управление при работе со специфическими данными, встроенными в элемент управления. При встраивании объекта в клиентский управляющий элемент OLE ни одно другое приложение не может получить доступ к этим данным (напротив, в случае связывания другие приложения могут получить доступ к этим данным). Более того, приложение, которое создало встроенные данные, будет автоматически запускаться в тот момент, когда пользователь начнет работу с этими данными.

Другая часть OLE, называемая OLE Automation, позволяет управлять другим приложением. Несомненно также и то, что приложения Visual Basic могут управляться из других приложений. Например, из Visual Basic можно управлять приложением Excel, используя его встроенную версию языка Visual Basic, или можно управлять редактором Word, опять же используя встроенную в него версию Visual Basic. (В системе Office'97 присутствует унифицированная версия языка для всех его приложений, которая основывается на Visual Basic for Application Version 5.0.)

И, наконец, необходимо отметить, что в настоящий момент OLE является составной частью более общей технологии, которую очень часто называют COM/OLE (сокращение СОМ происходит от component object model). Суть идеи основывается на важности понятия объекта для современного программирования. В 90-х годах стало ясно, что все большее количество людей считает пересылку объектов по сети Internet достаточно легким делом, поэтому они вовсю выступают за политику, которую можно условно назвать "объекты везде". Использование COM/OLE представляется достаточно удобным способом пересылки объектов по сети и даже, в скором времени, между различными платформами.

Использование OLE

Когда пользователь добавляет клиентский элемент управления OLE в проект Visual Basic, фактически создается то, что фирма Microsoft называет составным документом OLE (OLE compound document). (При создании клиентского элемента управления Visual Basic выводит на экран диалоговую панель, в которой запрашивается имя приложения, объект которого предполагается вставить.) Клиентский элемент управления OLE поставляется со всеми версиями Visual Basic. Его значок обычно находится в нижней части панели инструментов и представляет собой сетку с надписью "OLE" внутри.

Точно так же, как и в случае с DDE, проект Visual Basic может выступать как в роли приложения-клиента (или контейнера), которое получает информацию, так и в роли приложения-сервера (или источника), которое посылает информацию. В большинстве случаев при работе с OLE приложение Visual Basic получает информацию, т.е. выступает в роли клиента. В любом случае элемент управления OLE, который поставляется с Visual Basic, является клиентским элементом управления и не позволяет приложению Visual Basic выступать в роли OLE-ñåðâåðà (хотя Visual Basic 5.0 позволяет это: все, что необходимо, это написать код или свой собственный элемент, который будет выступать в роли OLE-ñåðâåðà).

 

 

Создание OLE-îáúåêòîâ

Как уже было отмечено ранее, OLE-îáúåêò представляет собой данные, с которыми может работать элемент управления OLE. Это может быть графическая диаграмма, группа ячеек, вся электронная таблица или часть документа текстового процессора. Любое приложение, поддерживающее OLE, имеет библиотеку объектов, каждый из которых может быть "отдан" другому приложению. (Слово "отдан" является жаргонным и означает следующее: "вот вещь, с которой можно работать. Кроме того, можно работать с ней следующими установленными путями: ...") Перед тем как приступить к дальнейшему описанию технологии ÎLE, необходимо дать определение следующему термину: класс OLE (OLE-class). Это приложение, которое предоставляет OLE-îáúåêò. Любое приложение, поддерживающее технологию OLE, имеет уникальное имя класса OLE, например, "WordDocument" или "ExcelWorksheet". (Необходимо отметить, что в названии класса учитывается регистр символов.) Можно получить список доступных имен классов, нажав на изображение эллипса в свойстве Class в окне Properties для управляющего элемента OLE.

Существует четыре способа создания объектов OLE. Простейшим из них является:

Встроить или установить связь с объектом для контейнерного элемента OLE. Такой способ позволяет изменять объекты на форме во время выполнения приложения и просто добавлять связанные объекты.

Описание более сложных методов приведено ниже.

Создание OLE-îáúåêòà при помощи панели инструментов

 

Для добавления OLE-îáúåêòà к панели инструментов необходимо выполнить следующие шаги:


Информация о работе «Курс лекций по V B 5.0»
Раздел: Информатика, программирование
Количество знаков с пробелами: 94257
Количество таблиц: 19
Количество изображений: 0

Похожие работы

Скачать
293733
5
0

... метод доступа с передачей полномочия. Охарактеризовать метод множественного доступа с разделением частоты. Какие существуют варианты использования множественного доступа с разделением во времени? Лекция 5.ЛВС и компоненты ЛВС Компьютерная сеть состоит из трех основных аппаратных компонент и двух программных, которые должны работать согласованно. Для корректной работы устройств в сети их нужно ...

Скачать
245763
0
5

... университет П. Е. Матвеев ЭТИКА. Основы хозяйственной этики Владимир 2003 Министерство образования Российской Федерации Владимирский государственный университет П.Е. Матвеев ЭТИКА. Основы хозяйственной этики Курс лекций Ч а с т ь в т о р а я Владимир 2003 ББК 87.715.4 М 33 Рецензенты:Доктор философских наук, доктор юридических наук, профессор Владимирского юридического института ...

Скачать
209470
9
2

... . М., НОРМА,2003. 10. Теория государства и права. Учебник./ Под ред. В.М. Корельского, В.Д.Перевалова. М., НОРМА, 2001. 11. Теория государства и права. Курс лекций./ Под ред. М.Н.Марченко. М., Зерцало, 1998. 12.Правоведение. Учебник./ Под ред О.Е.Кутафина. М., Юристъ,2001. 13.Варывдин В.А. Право.Курс лекций. М.,1999. ДОПОЛНИТЕЛЬНАЯ ЛИТЕРАТУРА 14. Козлова Е.Н., ...

Скачать
534689
13
0

... платы. 4.Расширение общественных фондов потребления снижало заинтересованность личности в результатах своего труда. 1 В Полном собрании сочинений В.И.Ленина нет никаких высказываний, о которых говорит И.В.Сталин. В.Н. Гузаров и Н.И. Гузарова Курс лекций «История России: 1861-1995 гг. Томск - 1999Глава 1. Введение к курсу «Истории России» Территория современной России, огромной страны, ...

0 комментариев


Наверх