Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

За 2005-04-17

Re: Нефиксированная длина

Здравствуйте, Alexo.

Вы писали 17 апреля 2005 г., 9:11:17:
A> A> type
A> TDocType=(TP_TEXT, TP_BITMAP);
A> TAnswer=record
A> AnswerText: TStringList;
A> AnswerBitmap: TBitmap;
A> Queue: integer;
A> Name: string;
A> end;
A> TAnswers=array of TAnswer;
A> TQuestion=record
A> QueType: TDocType;
A> AnsType: TDocType;
A> QuestionText: TStringList;
A> QuestionBitmap: TBitmap;
A> Answers: TAnswers;
A> Queue: integer;
A> Name: string;
A> end;
A> TQuestions=array of TQuestion;
A> TDocument=record
A> Name,
A> Author,
A> Version: string;
A> Max: integer;
A> Comments: TStringList;
A> Questions: TQuestions;
A> end;

A> A> Как TDocument сохранить в файл?
A> Я знаю, что нужны типы данных с фиксированной длиной, но всё-таки...
A> Можно сохранить не TDocument, а несколько TQuestion, тогда не будет
A> информации о документе...
A> Я так пробовал, но вместо TStringList сохраняется, естественно,
A> ерунда, а не сами строки.
A> Возможно ли вообще сохранить тип с нефиксированной длиной?

Если решать "в лоб", то нужно использовать или нетипизированные файлы,
или файловые потоки. И там, и там придется записывать все поля записей
"руками", списочные и массивные поля записывать поэлементно, а для полей
строчечного типа и типа TBitmap нужно еще и их размер в байтах
записывать в тот же самый файл - чтобы потом можно восстановить было
из файла. Неудобно все это.

А если без мороки все это делать, и если задача позволяет свободу в
выборе методов решения, то лучше написать базу данных.

   vadim_sheshunov 2005-04-17 23:30:19 (#352797)

Нефиксированная длина

Здравствуйте, comp!

В Delphi программировать начал недавно.
У меня небольшой вопрос...
Имеется тип:

type
TDocType=(TP_TEXT, TP_BITMAP);
TAnswer=record
AnswerText: TStringList;
AnswerBitmap: TBitmap;
Queue: integer;
Name: string;
end;
TAnswers=array of TAnswer;
TQuestion=record
QueType: TDocType;
AnsType: TDocType;
QuestionText: TStringList;
QuestionBitmap: TBitmap;
Answers: TAnswers;
Queue: integer;
Name: string;
end;
TQuestions=array of TQuestion;
TDocument=record
Name,
Author,
Version: string;
Max: integer;
Comments: TStringList;
Questions: TQuestions;
end;

Как TDocument сохранить в файл?
Я знаю, что нужны типы данных с фиксированной длиной, но всё-таки...
Можно сохранить не TDocument, а несколько TQuestion, тогда не будет
информации о документе...
Я так пробовал, но вместо TStringList сохраняется, естественно,
ерунда, а не сами строки.
Возможно ли вообще сохранить тип с нефиксированной длиной?

   2005-04-17 14:18:48 (#352616)

Re: MFC+гоячие клавиши

Здравствуйте !

> Ситуация такова: написал заготовку класса наследуемого от CDialog и
> захотелось добавить реакцию на нажатие клавиш. Поставил реакцию на
> WM_CHAR, WM_KEYDOWN/UP - ни один из методов не вызывается (окно в
> фокусе). Решил пойти через Accelerator, но обнаружил, что
> LoadAccelTable есть только у CFrameWnd. Каким образом обрабатывать
> нажатие клавиш и как их отлавливать? Заранее спасибо!

Для WM_KEYDOWN/UP обычно делают в PreTranslateMessage:

BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
if(((int) pMsg->wParam) == VK_DELETE)
{
MessageBox("VK_DELETE");
return TRUE;
}
}

return CDialog::PreTranslateMessage(pMsg);
}

Но ! Тут будут обрабатываться также все сообщения WM_KEYDOWN с кодом
виртуальной клавиши VK_DELETE дочерних окон диалога (кнопок, и.т.д.),
поэтому надо проверять pMsg->hwnd на соответствие дескриптору
конкретного окна.

С акселераторами немного больше сделать надо.

В самом классе объявить дескриптор акселераторов:

class CMyDlg : public CDialog
{
...
HACCEL m_hAccel;

В конструкторе инициализируем:

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/) : CDialog(CMyDlg::IDD, pParent)
{
...
m_hAccel = NULL;


В OnCreate - загружаем, в OnDestroy - удаляем акселераторную таблицу:


int CMyDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;

m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDR_ACCELERATOR1));

#ifdef _DEBUG
if(m_hAccel == NULL)
TRACE("акселераторы не загружены\n");
#endif

return 0;
}

void CMyDlg::OnDestroy()
{
if(m_hAccel != NULL)
{
::DestroyAcceleratorTable(m_hAccel);
m_hAccel = NULL;
}

CDialog::OnDestroy();
}


Ну, а в PreTranslateMessage - обрабатываем:

BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
if( (WM_KEYFIRST <= pMsg->message) &&
(WM_KEYLAST >= pMsg->message))
{
if (m_hAccel &&
::TranslateAccelerator(GetSafeHwnd(), m_hAccel, pMsg))
return TRUE;
}

return CDialog::PreTranslateMessage(pMsg);
}

Я в таблицу акселераторов IDR_ACCELERATOR1 добавил один акселератор
на кнопку VK_DELETE с ID = ID_MY_DELETE. После этого ID_MY_DELETE становится

виден в класс визарде. Обычным путем добавляется обработчик в класс диалога.

Ну... и все работает :)

void CMyDlg::OnMyDelete()
{
MessageBox("OnMyDelete");
}

--
С уважением, Вахтуров Виктор.

Номер выпуска : 4371
Возраст листа : 574 (дней)
Количество подписчиков : 517
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/352535
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

   2005-04-17 10:15:08 (#352535)