Вопрос № 61037: Уважаемые эксперты, подскажите, пожалуйста, как в MFC рисовать линии со стрелками на обоих концах?
например - http://img155.imageshack.us/img155/9075/examplees5.jpg...Вопрос № 61044: Здравствуйте уважаемые!
Пишу COM-компоненту с использованием ATL. Создал проект с помощью мастера в MSVS 6.0, включил поддержку MFC. Ну все как обычно, добавил ATL объект. Добавил в него метод. Проверил параметры, передаются корректно, вызов раб...Вопрос № 61053: Здравствуйте. Подскажите, можно ли в этом случае (в приложении) поменять malloc()/free() на new/delete? Если можно, то как. Сам я боюсь эксперементировать. Спасибо....Вопрос № 61070:
Здравствуйте, уважаемые эксперты! У меня вызвала затруднение такая задачка: нужно определить, является ли список зацикленным.
то есть каждый элемент указывает на следующий, и нужно определить, не указавает ли какой-либо из элементов на элемент эт...Вопрос № 61071: Здравствуйте уважаемые эксперты.
Пишу в Borland C++ Builder 6.0.
Столкнулся с такой проблемкой. Есть список определенных строковых значений. Приложение визуализирует данные таблици базы данных с помощью компонента DBGrid. Этот компонент облад...Вопрос № 61111: Здравствуйте.
У меня следующая задача: нужно изменить размер jpg-а. То есть я открываю, скажем, файл file.jpg (c высотой 1000 и шириной 2000 пикселей) и мне нужно уменьшить высоту до 640, ширину до 480 и сохранить.
Казалось бы нет ничего про...
Вопрос № 61.037
Уважаемые эксперты, подскажите, пожалуйста, как в MFC рисовать линии со стрелками на обоих концах?
например - http://img155.imageshack.us/img155/9075/examplees5.jpg
Отправлен: 02.11.2006, 14:53
Вопрос задала: Holidayinn (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Sergey A. Wedensky
Здравствуйте, Holidayinn!
В MFC никак. Да и вообще MFC здесь ни при чем. MFC - набор wrapper-классов для вызовов функций WinAPI. А в WinAPI (точнее в GDI API) нет средств рисования стрелок - только линии. Так что рисуйте сами ;)
Ответ отправил: Sergey A. Wedensky (статус: 7-ой класс)
Ответ отправлен: 02.11.2006, 15:29
Вопрос № 61.044
Здравствуйте уважаемые!
Пишу COM-компоненту с использованием ATL. Создал проект с помощью мастера в MSVS 6.0, включил поддержку MFC. Ну все как обычно, добавил ATL объект. Добавил в него метод. Проверил параметры, передаются корректно, вызов работает. Так вот компонент должен через протокол HTTP получать некую информацию с сайта. Использую MFC класс CSocket для обмена данными с сервером. Пробывал в обычном приложении кодуха работает, инициализацию вроде делаю. А вот в компоненте MFC начинает сыпаться как трухлявая старуха. Сбой идет
при вызове функции CSocket.Create(), пишет Debug Assertion failed. Хотя самое интересное в том что попытался во время отладки жать кнопку повтор, после двух нажатий все сработало данные удавалось скачать, а запускаю без отладки после нескольких нажатий повтора, контейнер просто падает! Access violation пишет нехороший. Если есть идеи буду благодарен.
Отправлен: 02.11.2006, 16:26
Вопрос задал: ATan (статус: 1-ый класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: estiGi
Здравствуйте, ATan!
Ну, самая первая идея, которая приходит в голову - зайти дебаггером внутрь CSocket.Create (), посмореть, где падает - класс же открытый - и посмотреть, какую ошибку генерирует АПИ. Если нет возможности пройти дебагом, скопировать этот кусок кода в обычное приложение и пройти дебаггером :))
А вообще используйте не МФС-обертку, а Windows Sockets напрямую, нифигули там сложного нет.
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 02.11.2006, 16:41 Оценка за ответ: 4 Комментарий оценки: Понимаешь, я там и дебаггером проходил в такую глубь залазил, что сам потерялся где я и кто я. А вылетает на функции AttachHandle в классе CAsyncSocket на коде CSocketWnd* pWnd = new CSocketWnd; pWnd->m_hWnd = NULL; if (!pWnd->CreateEx(0, AfxRegisterWndClass(0). С API возни больше, я хотел как говориться быка за рога. Не получилось :-(
Вопрос № 61.053
Здравствуйте. Подскажите, можно ли в этом случае (в приложении) поменять malloc()/free() на new/delete? Если можно, то как. Сам я боюсь эксперементировать. Спасибо.
Приложение:
Отправлен: 02.11.2006, 19:57
Вопрос задал: Lameruga (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Bob Johnson
Здравствуйте, Lameruga!
а зачем?
new предназначен для выделения типизированной памяти (вызывает конструктор если надо), а malloc - просто выделять память заданного объема. тебе тут больше подходит вариант с заданным объемом, т.к. единого типа у тебя нет (одна структура плюс несколько других).
знак "+" складывает размеры структур, которые тебе нужны
Ответ отправил: Bob Johnson (статус: Академик) Россия, Калуга WWW:Программирование ---- Ответ отправлен: 02.11.2006, 21:00 Оценка за ответ: 5 Комментарий оценки: Спасибо большое, все понятно.
Отвечает: Sergey A. Wedensky
Здравствуйте, Lameruga!
Полностью согласен с Bob Johnson, однако если очень надо, то можно, конечно:
region_data = (LPRGNDATA) new char[sizeof(RGNDATAHEADER) + num_rects * sizeof(RECT)];
...
delete [] (char*) region_data;
Ответ отправил: Sergey A. Wedensky (статус: 7-ой класс)
Ответ отправлен: 03.11.2006, 10:32 Оценка за ответ: 5
Вопрос № 61.070
Здравствуйте, уважаемые эксперты! У меня вызвала затруднение такая задачка: нужно определить, является ли список зацикленным.
то есть каждый элемент указывает на следующий, и нужно определить, не указавает ли какой-либо из элементов на элемент этого же списка. Если нет, то последний элемент содержит указатель на 0. Размера списка мы не знаем.
И еще требованием является минимальное использование дополнительной памяти, то есть вариант сохранить в массиве все пройденные элементы списка и потом сравнивать с последующим, не подходит :(
Помогите пожалуйста!
Отправлен: 02.11.2006, 22:09
Вопрос задала: Alena (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: n0name
Здравствуйте, Alena!
Если задача состоит только в том, чтобы проверить зациклен ли список, то я бы при прохождении очередного элемента занулял бы указатель на следующий. То есть примерно так.
LIST_ENTRY *cur, next;
while (cur->Next){
next = cur->Next;
cur->Next = NULL;
cur = next;
}
Ответ отправил: n0name (статус: 7-ой класс)
Ответ отправлен: 02.11.2006, 23:03
Отвечает: Madproger
Здравствуйте, Alena!
А если немного модифицировать предыдущий ответ чтобы не терять элементы списка, ведь мы его делали не просто так...
Для это примем что указатель имеет тип int (практически так оно и есть)
Тогда
LIST_ENTRY *cur, next;
for(int i=1;; i++)
{
next = cur->Next;
// Достигли конца списка
if(!next)
{
cout << "Не зациклен!" << endl;
break;
} // Указатель на след элемент списка
else if(next > 0)
{
// Метим что мы уже здесь были
cur->Next *= (-1);
cur = next;
}
else if(next < 0) // Мы здесь уже были
{
cur->next *= (-1);
cout << "Список зациклен! На элементе номер: " << i << endl;
break;
}
Не проверял но что то типа этого
И список проверяем и не теряем его
--------- И будет вам счАстиЕ!
Ответ отправил: Madproger (статус: 9-ый класс)
Ответ отправлен: 02.11.2006, 23:55
Отвечает: Хватов Сергей
Здравствуйте, Alena!
Без использования памяти - никак. Придется либо хранить список посещенных элементов, либо что-нибудь записывать в сами элементы, причем поле под запись должно быть проинициализировано заранее.
Только если у вас все элементы влезли в память, то дополнительный список указателей на них я думаю тоже влезет. :-)
Ответ отправил: Хватов Сергей (статус: 7-ой класс)
Ответ отправлен: 03.11.2006, 16:06
Отвечает: Bob Johnson
Здравствуйте, Alena!
не, что-то вы тут брет написали, ребята...
первому аффтару - невозможно будет определить зациклен ли список, т.к. в любом случае мы найдем null.
второму - указатель не имеет знака, его нельзя проверять на < 0 или > 0, и умножать на -1 тоже нельзя. даже если ты приведешь его к типу integer, он теоретически может быть больше 0x80000000, что будет выглядеть как отрицательное число.
применение дополнительной памяти, конечно, ситуацию исправит, но если в условии написано, что нельзя - значит нельзя.
мое предложение такое:
list_elem - это тип элемента списка. пусть у него будет свойство
list_elem *list_elem::next; - указатель на следующий элемент
т.е. алгоритм такой - мы идем по списку вперед, одновременно переворачивая его задом-наперед (т.е. текущий элемент начинает указывать на предыдущий, а не на следующий). если же встретится циклическая ссылка, то (за счет того, что направление пройденного списка мы перевернули) мы в конечном счете придем к самому первому элементу, что можно выяснить простым сравнением.
дополнительное преимущество данного метода - если список все же был нормальным (без циклических ссылок), то функция его не испортит (просто перевернет задом наперед) и вернет указатель на последний элемент.
Ответ отправил: Bob Johnson (статус: Академик) Россия, Калуга WWW:Программирование ---- Ответ отправлен: 03.11.2006, 18:26 Оценка за ответ: 5
Вопрос № 61.071
Здравствуйте уважаемые эксперты.
Пишу в Borland C++ Builder 6.0.
Столкнулся с такой проблемкой. Есть список определенных строковых значений. Приложение визуализирует данные таблици базы данных с помощью компонента DBGrid. Этот компонент обладает свойством PickList, который позволяет в некоторм роде автоматизировать ввод значений в DBGrid-е. Этот списочек можно задать вручную. Но как мне подгрузить в него мои строковые значения на этапе выполнения программы?
Пробовал использовать код указанный в приложении, но безрезультатно. Постоянно выдается ошибка "[C++ Error] _MainForm.cpp(26): E2193 Too few parameters in call to '_fastcall TDBGridColumns::GetColumn(int)"
Уже не знаю за что хвататся, помогите пожалуйста.
Если такую загрузку выполнить возможно, то хотелось бы получить ответ на еще один вопрос. Как сделать так, чтобы при вводе значения в поле, выполнялась подстановка и в упомянутом PickListе выбиралась строка которая больше всего подходит к тому, что вводит юзер? Есть ли какие-то стандартные ф-ции параметры или же нужно реализовывать такую вещь самому?
Буду оч признателен за любую помощь.
Приложение:
Отправлен: 02.11.2006, 22:29
Вопрос задал: Юра (статус: 2-ой класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: JohnP
Здравствуйте, Юра!
Определение Items выглядит так:
__property TColumn* Items[int Index] = {read=GetColumn, write=SetColumn};
Items является __property, и при его чтении вызывается метод GetColumn с параметром Index.
Т.е. обращаться нужно к примеру так:
Grid->Columns[0].Items[0]->PickList->Add( str );
Насчет автоматического выбора строки из PickList,
думаю, придется делать это самому. Хотя точно не уверен.
Могу только подсказать, что Windows использует подобную вещь,
реализованную оконным классом с именем "Auto-Suggest Dropdown".
Удачи!
Ответ отправил: JohnP (статус: 2-ой класс)
Ответ отправлен: 03.11.2006, 01:10
Вопрос № 61.111
Здравствуйте.
У меня следующая задача: нужно изменить размер jpg-а. То есть я открываю, скажем, файл file.jpg (c высотой 1000 и шириной 2000 пикселей) и мне нужно уменьшить высоту до 640, ширину до 480 и сохранить.
Казалось бы нет ничего проще, но не выходит каменный цветок. Желательно готовый код (наверняка я не единственный столкнулся с такой задачей) для CBuilder.
Отправлен: 03.11.2006, 09:43
Вопрос задал: Rusland (статус: Специалист)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Sergey A. Wedensky
Здравствуйте, Rusland!
Проще всего использовать GDI+ (в WinXP/2000/2003 входит в поставку ОС, для более ранних версий можно свободно распространять gdiplus.dll). Пример в приложении. Если нет header'ов и библиотек GDI+ (у меня в BCB5 их не оказалось), header'ы можно взять из VS либо скачать у Microsoft (придется подправить немного в паре мест), а библиотеку импорта создать IMPLIB'ом из gdiplus.dll.
Удачи!
Приложение:
Ответ отправил: Sergey A. Wedensky (статус: 7-ой класс)
Ответ отправлен: 03.11.2006, 10:35