MDI-формы. Как узнать номер дочерней формы или имя?
От: Cyberya  
Дата: 17.12.03 19:07
Оценка:
Надо узнать номер активной дочерней формы или имя...
Как?
Суть в чем: хочу сохранить данные из MSFlexGrid в файл.
Как я все это организовываю:

'======Объявляю свой тип переменных====

Private Type CyberyaTable
CellText As String 'содержимое ячейки
CellAlignment As Integer 'хранит значение выравнивания текста в ячейке (по левому краю, по центру, по правому краю)
CellFontName As String 'содержит имя шрифта, который будет использоваться в ячейке
CellFontType(1 To 4) As Boolean 'массив, содержащий информацию о типе шрифта (жирный, наклонный и т.д.)
CellFontSize As Integer 'хранит в себе размер шрифта
CellCeWidth As Integer 'хранит ширину ячеек
CellCeHeight As Integer 'хранит высоту ячеек
End Type

'======Объявляю переменные и массивы========
Private cTable(1 To 255, 1 To 24) As CyberyaTable 'Массив, содержащий в себе информацию о каждой ячейке в таблице
Private cTableVar As CyberyaTable 'Временная переменная для внесения информации в ячейку
Private cTableTemp As CyberyaTable 'Временная переменная для считывания информации из ячейки

'======Конец объявления переменных=======

'======Вот идет сохранение=======
'Процедура сохранения таблицы в файл
Sub TableSave()
'идет проверка на совпадение имен сохраняемого файла с существующими, если таковые есть
If Len(frmTableEditMDI.strPathTemp) = 0 Then
frmSaveAs.Show 1, frmTableEditMDI
Else
If frmTableEdit.flagOfKolvoZapuskov = True Then
Open "temp.tmp" For Binary As #2 'Создаем временный файл

'=====Вот здесь у меня затык происходит, но о нем ниже=====
Put #2, , cTable
'=====Вот здесь у меня затык происходит=====

If frmSaveAs.flagOfExictingFile = False Then
Kill frmTableEditMDI.strPathTemp 'удаляем его
End If
Close #2 'закрываем временный файл
Name "temp.tmp" As frmTableEditMDI.strPathTemp 'переименовываем временный файл в редактируемый
End If
End If
End Sub

В общем, в чем заключается проблема. Проблема в том, что при перемещении по таблице я всегда считываю данные о ячейке в переменную моего типа, а потом эту перменную вношу в массив, опять же моего типа с индексами row и col, т.е.:
cTable(frmTableEditMDI.ActiveForm.fxgTable.Row, frmTableEditMDI.ActiveForm.fxgTable.Col)

Все пока идет ок. В каждой дочерней форме есть свой массив пользовательского типа и из него данные нормально считываются и заносятся. НО! При сохранении, данные записываются в файл из массива, принадлежащего самой первой форме, а не активной. Нужно, чтобы данные хотя бы записыались во временный массив, но объявить его Public я не могу, поскольку он пользоавтельского типа. Что делать?
Re: MDI-формы. Как узнать номер дочерней формы или имя?
От: black hermit Россия  
Дата: 18.12.03 07:47
Оценка:
Здравствуйте, Cyberya, Вы писали:


C>Private Type CyberyaTable

C>CellText As String 'содержимое ячейки
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
C>CellAlignment As Integer 'хранит значение выравнивания текста в ячейке (по левому краю, по центру, по правому краю)
C>CellFontName As String 'содержит имя шрифта, который будет использоваться в ячейке
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Хоть и не по теме... Вот эти места смущают. Тут у тебя указатель на String. IMHO правильнее было бы, для сохранения в файле делать так:
CellText As String * MAX_LENGHT
CellFontName As String * MAX_LENGHT
Т.е. явно зарезервировать память для строк, Но если ты говоришь, что всё равно сохраняет то ладно... хотя мне это кажется странным, структура всётаки

C>CellFontType(1 To 4) As Boolean 'массив, содержащий информацию о типе шрифта (жирный, наклонный и т.д.)

C>CellFontSize As Integer 'хранит в себе размер шрифта
C>CellCeWidth As Integer 'хранит ширину ячеек
C>CellCeHeight As Integer 'хранит высоту ячеек
C>End Type

C>'=====Вот здесь у меня затык происходит, но о нем ниже=====

C>Put #2, , cTable
C>'=====Вот здесь у меня затык происходит=====

Если Child формы ты создаешь через (а скорее всего это так, ну возможны варианты конечно)
    Dim frm as New MyChildForm
    frm.Show


Попробуй так:
    Put #2, , Me.cTable 'Укажем сами на себя
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....
Re: frmTableEditMDI.ActiveForm
От: Vi2 Удмуртия http://www.adem.ru
Дата: 18.12.03 11:08
Оценка: 2 (1)
Здравствуйте, Cyberya, Вы писали:

C>...
C>Все пока идет ок. В каждой дочерней форме есть свой массив пользовательского типа и из него данные нормально считываются и заносятся. НО! При сохранении, данные записываются в файл из массива, принадлежащего самой первой форме, а не активной. Нужно, чтобы данные хотя бы записыались во временный массив, но объявить его Public я не могу, поскольку он пользоавтельского типа. Что делать?

Если cTable находится в каждой форме, то объяви там же функцию или подпрограмму, которая будет доступна в глобальной, не зависимой от форм, TableSave, и передавай туда, например, номер файла.. Например:
Sub TableSave(ByVal iPipe as Long)
  Put #iPipe, , cTable
End Sub

И вызов в TableSave — глобальной
C>'=====Вот здесь у меня затык происходит=====
C>' Put #2, , cTable
Vi2>  Call frmTableEditMDI.ActiveForm.TableSave( 2 ) ' это твоя #2
C>'=====Вот здесь у меня затык происходит=====

Если cTable находится в одном экземпляре глобально, то можно узнать имя активной формы, данные которой записываются frmTableEditMDI.ActiveForm.Name и записать в файл дополнительно к cTable. А при чтении попытиться активировать эту форму, если она не активна, или сравнить эти имена и не грузить данные, если они не совпадают.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: MDI-формы. Как узнать номер дочерней формы или имя?
От: Cyberya  
Дата: 19.12.03 00:21
Оценка:
Put #2, , Me.cTable 'Укажем сами на себя

нет — не канает можно писать только имя массива. без я вного указния, где она лежит. cTable — Private
Re[2]: frmTableEditMDI.ActiveForm
От: Cyberya  
Дата: 19.12.03 01:15
Оценка:
Не совсе сработало, но на верные мысли натолкнуло. Спасибо большое. На основе твоего варианта сделал свой — рабочий. Правда так опять проблема возникла Но с ней я сам разберусь. Еще раз спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.