Доброго всем времени суток.
AK74 wrote:
А зачем нужна возможность редактировать лог?
Конечно только режим read-only, с возможность сохранить в файл.
ONEEYEMAN wrote:
Судя по всему из-за сохранения в файл и произошло наследование от wxTextCtrl. Птому что сбрасывать в файл поточно строки из листа утомительно.
Я имел ввиду, что логу, имхо, не нужны возможности редактирования. Только возможность очистить или скинуть в файл.
Да и зачем каждую строчку сбрасывать в файл? Можно ведь собрать все строки в буфер и затем скинуть уже его в файл.
Или я чего-то не понял?
AK74 wrote:
1. Фрейм лога никак не хочет "рождаться" в родительском фейме, а веде себя как независимый фрейм. Появляется в стороне от родительского окна, собственно и оригинал себя вел так же. Может это такое ограничение, что фрейм не может содержать в себе фрейм?
ONEEYEMAN wrote:
1. Не совсем понял: у вас есть главное окно приложения и вы в нем создаете еще одно окно где-то там внизу которое должно отображать Ваш лог? Зачем? Не проще ли положить лог в главное окно напрямую?
Основной фрейм это только отладочный фрейм. Там только чекбокс (скрыть/показать лог) и три кнопки, имитирующие события (Info, warning, Error).
Т.е нажимая какую-либо из кнопок, я отсылаю в лог соответствующее сообщение (через wxLogMessage/wxLogWarning/wxLogError).
Так вот, по моей задумке, лог должен родиться в основном фрейме и быть одним из окон. А у меня получается, что он "самостоятельный" фрейм (можно переключаться Alt+Tab)
AK74 wrote:
2. Иконки не появляются, но цвет сообщений меняется. Может иконки не могут "жить" в одной колонке с текстовым сообщением?
ONEEYEMAN wrote:
Посмотрите как это реализовано в примере listctrl. И еще - если есть желание выводить иконку не в первой колонке - работать не булет. Если я правильно помнб был тикет на эту тему и большая дискуссия.
Смотрел и даже куски кода стырил, но видимо, чего-то "не догнал".
Вот кусок моего быдло-кода:
Code: Select all
// log all kinds of messages
void TColoredLogFrame::ShowLogMessage(wxLogLevel level, const wxString& msg)
{
// preset default values
wxString message= ""; wxColor m_color; m_color.Set(0xFF,0xFF,0xFF); int m_icon= 0;
// choose background color and StatusBar if enabled
switch ( level )
{
case wxLOG_Info: message.append(_(wxS("INFO: ")));
case wxLOG_Message: m_color.Set(0x80,0xFF,0x80);
message.append(_(wxS("MESSAGE: ")));
m_icon= 1;
break;
case wxLOG_Error: m_color.Set(0xFF,0x80,0x80);
message.append(_(wxS("ERROR: ")));
m_icon= 2;
break;
case wxLOG_Warning: m_color.Set(0xE6,0xE7,0x00);
message.append(_(wxS("WARNING: ")));
m_icon= 3;
break;
case wxLOG_Debug: message.append(_(wxS("DEBUG: ")));
case wxLOG_Trace: message.append(_(wxS("TRACE: ")));
break;
case wxLOG_FatalError: m_color.Set(0xFF,0x00,0x00);
message.append(_(wxS("FATAL ERROR: ")));
m_icon= 2;
default: m_color.Set(0xE7,0xE6,0xFF);
message.append(_(wxS("Unknown log reason: ")));
}
message.append(msg);
//add log string and icon if it is enabled & has valid value
if (m_UseIcons && (m_icon != 0))
m_Canvas->InsertItem(0,message,m_icon);
else //add message to log string only
m_Canvas->InsertItem(0,message);
//add background color if enabled
if (m_UseColors) m_Canvas->SetItemBackgroundColour(0,m_color);
m_Canvas->SetColumnWidth(0,wxLIST_AUTOSIZE);
m_Canvas->Update();
}
Так вот, цвет меняется, текстовая часть выводится как надо, нет только иконок.
ЗЫ. По шагам проходил дебагером, все условия срабатывают.