Doc/View - сохрание сразу при изменении в документе
От: Аноним  
Дата: 25.08.03 19:06
Оценка:
Программа всегда работает с одним документом. Хочу, чтобы при изменении в документе изменения сразу записывались на диск (естественно, без запрашивания имени файла — так как оно не меняется).
В принципе, можно псле каждого изменения писать

...
OnSaveDocument("C:\\file.dat");
...

Но это как-то не слишком хорошо — писать эту строку надо во многих местах. Нельзя ли это написать только в одном месте — что-то вроде:

void CMyDoc::OnDocChanged() 
{
OnSaveDocument("C:\\file.dat");
}
Doc/View - сохрание сразу при изменении в документе
От: Serguei666 Беларусь  
Дата: 26.08.03 02:53
Оценка: -1
#Имя: FAQ.mfc.docview.setmodifiedflag
А>Программа всегда работает с одним документом. Хочу, чтобы при изменении в документе изменения сразу записывались на диск (естественно, без запрашивания имени файла — так как оно не меняется).
А>В принципе, можно псле каждого изменения писать

А>
А>...
А>OnSaveDocument("C:\\file.dat");
А>...
А>

А>Но это как-то не слишком хорошо — писать эту строку надо во многих местах. Нельзя ли это написать только в одном месте — что-то вроде:
А>

А>void CMyDoc::OnDocChanged() 
А>{
А>OnSaveDocument("C:\\file.dat");
А>}


В документе есть функция SetModifiedFlag. Вот ее и перекройте, и там сохраняйте документ
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[2]: Doc/View - сохрание сразу при изменении в документе
От: Аноним  
Дата: 26.08.03 19:42
Оценка:
Здравствуйте, Serguei666, Вы писали:
S>В документе есть функция SetModifiedFlag. Вот ее и перекройте, и там сохраняйте документ
В каком смысле перекрыть? Она же не виртуальная. В смысле вызвать или что?
Re[3]: Doc/View - сохрание сразу при изменении в документе
От: Vadim B  
Дата: 26.08.03 21:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Serguei666, Вы писали:

S>>В документе есть функция SetModifiedFlag. Вот ее и перекройте, и там сохраняйте документ
А>В каком смысле перекрыть? Она же не виртуальная. В смысле вызвать или что?

Она виртуальная.
Re[4]: Doc/View - сохрание сразу при изменении в документе
От: Serguei666 Беларусь  
Дата: 26.08.03 22:21
Оценка:
Здравствуйте, Vadim B, Вы писали:

VB>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Serguei666, Вы писали:

S>>>В документе есть функция SetModifiedFlag. Вот ее и перекройте, и там сохраняйте документ
А>>В каком смысле перекрыть? Она же не виртуальная. В смысле вызвать или что?

VB>Она виртуальная.

MSDN говорит, что нет
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[3]: Doc/View - сохрание сразу при изменении в документе
От: Serguei666 Беларусь  
Дата: 26.08.03 22:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Serguei666, Вы писали:

S>>В документе есть функция SetModifiedFlag. Вот ее и перекройте, и там сохраняйте документ
А>В каком смысле перекрыть? Она же не виртуальная. В смысле вызвать или что?

Невиртуальные функции тоже можно перекрывать
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[5]: Doc/View - сохрание сразу при изменении в документе
От: Vadim B  
Дата: 26.08.03 22:37
Оценка:
Здравствуйте, Serguei666, Вы писали:

S>>>>В документе есть функция SetModifiedFlag. Вот ее и перекройте, и там сохраняйте документ

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

VB>>Она виртуальная.

S>MSDN говорит, что нет

А мне говорит, что виртуальная. Здесь

MFC Library Reference

CDocument::SetModifiedFlag
Call this function after you have made any modifications to the document.

virtual void SetModifiedFlag(
BOOL bModified = TRUE
);


Не говоря уже о том, что я ее в своем проекте перекрывал, как виртуальную, и в CDocument (afxwin.h) она тоже описана как virtual.
Re[6]: Doc/View - сохрание сразу при изменении в документе
От: Serguei666 Беларусь  
Дата: 27.08.03 18:33
Оценка:
Здравствуйте, Vadim B, Вы писали:

VB>Здравствуйте, Serguei666, Вы писали:


S>>>>>В документе есть функция SetModifiedFlag. Вот ее и перекройте, и там сохраняйте документ

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

VB>>>Она виртуальная.

S>>MSDN говорит, что нет

VB>А мне говорит, что виртуальная. Здесь

VB>

VB>MFC Library Reference

VB>CDocument::SetModifiedFlag
VB>Call this function after you have made any modifications to the document.

VB>virtual void SetModifiedFlag(
VB> BOOL bModified = TRUE
VB>);


VB>Не говоря уже о том, что я ее в своем проекте перекрывал, как виртуальную, и в CDocument (afxwin.h) она тоже описана как virtual.


Ну и ладненько. В исходники мне было лень смотреть. Ксати, что значит "проекте перекрывал, как виртуальную"? Вы писали слово 'virtual'?
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[7]: Doc/View - сохрание сразу при изменении в документе
От: Vadim B  
Дата: 27.08.03 19:25
Оценка:
Здравствуйте, Serguei666, Вы писали:

VB>>Не говоря уже о том, что я ее в своем проекте перекрывал, как виртуальную, и в CDocument (afxwin.h) она тоже описана как virtual.


S>Ну и ладненько. В исходники мне было лень смотреть. Ксати, что значит "проекте перекрывал, как виртуальную"? Вы писали слово 'virtual'?


Да.

В свою очередь: что в данном контексте означает "Невиртуальные функции тоже можно перекрывать"?
Re[8]: Doc/View - сохрание сразу при изменении в документе
От: Serguei666 Беларусь  
Дата: 28.08.03 16:06
Оценка:
Здравствуйте, Vadim B, Вы писали:

VB>Здравствуйте, Serguei666, Вы писали:


VB>>>Не говоря уже о том, что я ее в своем проекте перекрывал, как виртуальную, и в CDocument (afxwin.h) она тоже описана как virtual.


S>>Ну и ладненько. В исходники мне было лень смотреть. Ксати, что значит "проекте перекрывал, как виртуальную"? Вы писали слово 'virtual'?


VB>Да.

Так вот, если в классе-предке функция декларирована как невиртуальная, то пишите вы слово "virtual" или не пишете — значения не имеет, ибо функция так и останется невиртуальной при использовании указателя на класс-предок. Поэтому меня и смутила фраза "в своем проекте перекрывал, как виртуальную". Смысла в этом не вижу.

VB>В свою очередь: что в данном контексте означает "Невиртуальные функции тоже можно перекрывать"?

Это значит, что в классе-наследнике вы можете переопределять функции, даже если они невиртуальные.
Пример:

class A
{
  int F() { return 666; } // невиртуальная функция
};

class B : public A
{
  int F() // перекрытая невиртуальная функция
  { 
    int Result = A::F();
    DoSomethingElse();
    return Result; 
  }
};
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[9]: Doc/View - сохрание сразу при изменении в документе
От: Vadim B  
Дата: 28.08.03 16:35
Оценка:
Здравствуйте, Serguei666, Вы писали:

VB>>>>Не говоря уже о том, что я ее в своем проекте перекрывал, как виртуальную, и в CDocument (afxwin.h) она тоже описана как virtual.


S>>>Ну и ладненько. В исходники мне было лень смотреть. Ксати, что значит "проекте перекрывал, как виртуальную"? Вы писали слово 'virtual'?


VB>>Да.

S>Так вот, если в классе-предке функция декларирована как невиртуальная, то пишите вы слово "virtual" или не пишете — значения не имеет, ибо функция так и останется невиртуальной при использовании указателя на класс-предок. Поэтому меня и смутила фраза "в своем проекте перекрывал, как виртуальную". Смысла в этом не вижу.

Хм, я что, давал повод подозревать меня в элементарном незнании основ С++? Естественно, я перекрываю как виртуальные только те функции, которые были описаны в базовом классе как виртуальные.

VB>>В свою очередь: что в данном контексте означает "Невиртуальные функции тоже можно перекрывать"?

S>Это значит, что в классе-наследнике вы можете переопределять функции, даже если они невиртуальные.
S>Пример:

S>
S>class A
S>{
S>  int F() { return 666; } // невиртуальная функция
// добавим:
    void PrintSomething() { printf("%d", F()); }
S>};

S>class B : public A
S>{
S>  int F() // перекрытая невиртуальная функция
S>  { 
S>    int Result = A::F();
S>    DoSomethingElse();
S>    return Result; 
S>  }
S>};
S>


Смысла в данном контексте в этом нет. Потому что F() вызывается не только из методов класса B, но и из методов класса A, например, из PrintSomething(). Где при этом будет вызываться A::F(), а не перекрытый B::F(). Так что изначальная цель — "перехватить" все вызовы F() и изменить их работу — достигнута не будет.
Re[10]: Doc/View - сохрание сразу при изменении в документе
От: Serguei666 Беларусь  
Дата: 28.08.03 17:25
Оценка:
Здравствуйте, Vadim B, Вы писали:

VB>Здравствуйте, Serguei666, Вы писали:


VB>Хм, я что, давал повод подозревать меня в элементарном незнании основ С++? Естественно, я перекрываю как виртуальные только те функции, которые были описаны в базовом классе как виртуальные.


Фраза "Не говоря уже о том, что я ее в своем проекте перекрывал, как виртуальную, и в CDocument (afxwin.h) она тоже описана как virtual." дала мне такой повод. Потому что разницы между "перекрывать как виртуальную" или "перекрывать как невиртуальную" я не вижу.

VB>>>В свою очередь: что в данном контексте означает "Невиртуальные функции тоже можно перекрывать"?

S>>Это значит, что в классе-наследнике вы можете переопределять функции, даже если они невиртуальные.
S>>Пример:

S>>
S>>class A
S>>{
S>>  int F() { return 666; } // невиртуальная функция
VB>// добавим:
VB>    void PrintSomething() { printf("%d", F()); }
S>>};

S>>class B : public A
S>>{
S>>  int F() // перекрытая невиртуальная функция
S>>  { 
S>>    int Result = A::F();
S>>    DoSomethingElse();
S>>    return Result; 
S>>  }
S>>};
S>>


VB>Смысла в данном контексте в этом нет.

Ну да, смысла нет. Я просто примером объяснял фразу "Невиртуальные функции тоже можно перекрывать", как вы и попросили.

VB>Потому что F() вызывается не только из методов класса B, но и из методов класса A, например, из PrintSomething(). Где при этом будет вызываться A::F(), а не перекрытый B::F(). Так что изначальная цель — "перехватить" все вызовы F() и изменить их работу — достигнута не будет.

Теперь вы меня подозреваете в незнании основ C++?
Хотите сказать 'спасибо'? Тогда поставьте оценку
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.