Надо узнать номер активной дочерней формы или имя...
Как?
Суть в чем: хочу сохранить данные из 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-формы. Как узнать номер дочерней формы или имя?
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....
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. А при чтении попытиться активировать эту форму, если она не активна, или сравнить эти имена и не грузить данные, если они не совпадают.
Не совсе сработало, но на верные мысли натолкнуло. Спасибо большое. На основе твоего варианта сделал свой — рабочий. Правда так опять проблема возникла Но с ней я сам разберусь. Еще раз спасибо!