» Обучение и начало програмирования на С++
Имееться обьект класса
Цитата:
Следующим участком кода реализуеться печать(TPrinter *Prntr;)
Цитата:
Как сделать, что при обьеме печатаемой информации больше чем на страницу печать осуществлялась на новую(в моем варианте все лишнее обрезает)
Заранее огромное спасибо за помощь.
Цитата:
class CDocTemplate
{
public:
CDocRows *TopRows;
CDocRows *TableRows;
CDocRows *AfterTableRows;
CDocRows *BottomRows;
public:
CDocTemplate(){
TopRows = new CDocRows;
TableRows = new CDocRows;
AfterTableRows = new CDocRows;
BottomRows = new CDocRows;
}
~CDocTemplate(){
delete TopRows ;
delete TableRows ;
delete AfterTableRows ;
delete BottomRows ;
}
Следующим участком кода реализуеться печать(TPrinter *Prntr;)
Цитата:
Prntr->Printers->Strings[Prntr->PrinterIndex]+" "+IntToStr(Prntr->PrinterIndex);
Prntr->PrinterIndex = cbPrinters->ItemIndex;
Prntr->Orientation = poPortrait;
Prntr->Copies = StrToIntDef(edCopies->Text,1);
pbPrintProgress->Position = 0;
pbPrintProgress->Visible = true;
tmrShow->Enabled = true;
SDrawData DrawData = {Prntr->PageWidth/210, Prntr->PageHeight/297};
if(Templ!=NULL)
{
Prntr->BeginDoc();
Prntr->Canvas->Brush->Style = bsClear;
Templ->Draw(Prntr->Canvas, &DrawData);
Prntr->EndDoc();
}
Как сделать, что при обьеме печатаемой информации больше чем на страницу печать осуществлялась на новую(в моем варианте все лишнее обрезает)
Заранее огромное спасибо за помощь.
Люди, неужели никто не может помочь? . Очень нужно.
люди хелп.
Дайте плз ссылочки на простые книги о С++ (типа про Visual Studio .NET 2003 - 2005).
Я тут немного почитал от автора С++, так основы понял, но дальше...
Дайте плз ссылочки на простые книги о С++ (типа про Visual Studio .NET 2003 - 2005).
Я тут немного почитал от автора С++, так основы понял, но дальше...
iMMortal_Inc
Про книги лучше спрашивать в теме http://forum.ru-board.com/topic.cgi?forum=93&bm=1&topic=0892&start=1000
Про книги лучше спрашивать в теме http://forum.ru-board.com/topic.cgi?forum=93&bm=1&topic=0892&start=1000
Имеется следующая задача:
В таблице в одном поле хранится номер группы, а во втором номер родительской группы для данной(если конкретизовать, то это группы товара).
Нужно сделать выборку номеров группы вместе с всеми ее подгруппами.
Как это правильно сделать?
Одним из вариантов решения вижу графы, обход в глубину.
Но не совсем четко представляю как реализовать их с динамическими масивами.
В таблице в одном поле хранится номер группы, а во втором номер родительской группы для данной(если конкретизовать, то это группы товара).
Нужно сделать выборку номеров группы вместе с всеми ее подгруппами.
Как это правильно сделать?
Одним из вариантов решения вижу графы, обход в глубину.
Но не совсем четко представляю как реализовать их с динамическими масивами.
простейший вариант -- берем std::map<int, std::set<int> > и строим дерево.
потом рекурсивно его обходим и добавляем все номера в список
потом рекурсивно его обходим и добавляем все номера в список
dyr farot
Цитата:
Можно немного подробнее?
Цитата:
простейший вариант -- берем std::map<int, std::set<int> > и строим дерево.
потом рекурсивно его обходим и добавляем все номера в список
Можно немного подробнее?
делается выборка всех групп.
первым параметром в мапу пишется родительская группа, во второй добавляются ее дети.
потом берем из мапы все группы, у которых нет родителя ( группы верхнего уровня ) -- у них parent 0 ( или -1 ( как напишеш ) )
и проходиш по полученному set' у вызывая рекурсивную функцию
первым параметром в мапу пишется родительская группа, во второй добавляются ее дети.
потом берем из мапы все группы, у которых нет родителя ( группы верхнего уровня ) -- у них parent 0 ( или -1 ( как напишеш ) )
и проходиш по полученному set' у вызывая рекурсивную функцию
Вопрос в следующем. У меня Visual Studio 2005. Как мне в основном окне созданной программы (windows application), сделать кнопку. Те. в созданой по умолчанию Студией виндовс программе в главном окне (этой программы) нужно вывести кнопку. Как это сделать. Подскажите пожалуйста по доходчивей. Я полный чайник в програмировании на С++ под виндоус.
ЗЫ Посоветуйте, пожалуйста где можно почитать на русском, о виндоус програмировании на С++. Только чтоб книга была написанна "на человеческом", т.е. чтоб даже чайник понял.
ЗЫ Посоветуйте, пожалуйста где можно почитать на русском, о виндоус програмировании на С++. Только чтоб книга была написанна "на человеческом", т.е. чтоб даже чайник понял.
NNS
Ну если впервые на си, попробуй создать MFC-приложение - там и сориентируешься.
А ссылки на литературу начинали постить с первых веток, полистай.
Ну если впервые на си, попробуй создать MFC-приложение - там и сориентируешься.
А ссылки на литературу начинали постить с первых веток, полистай.
Есть отрывок кода:
.......
char n;
ifstream fin("my.txt");
while (n!='*') {
fin.get(n);
}
.......
При запуске программы выводит следующее
Run-time check Failure #3 - The variable 'n' is being used without being defined.
Сосбсно что ему не нравится, ведь переменная n определенна.
.......
char n;
ifstream fin("my.txt");
while (n!='*') {
fin.get(n);
}
.......
При запуске программы выводит следующее
Run-time check Failure #3 - The variable 'n' is being used without being defined.
Сосбсно что ему не нравится, ведь переменная n определенна.
NNS
Попробуй перед циклом написать fin.get(n);
Попробуй перед циклом написать fin.get(n);
EZH
О! Спасибо! Только вот странно почему переменной должно быть присвоенно значение до ее использования в цикле...
Еще вопрос: в файл test.txt запмсан следующий текст:
Строка 1
Строка 2
Вот текст программы
....
char a[225], b[255];
ifstream fin("test.txt");
fin.getline(a,255);
fin.getline(b,255);
cout << a << endl;
cout << b << endl;
....
В результате на экран выводится
Строка 1
А вместо "Строка 2" выводится "пустое место". Я думаю надо каким то образом после первого чтения строки, переидти на новую строчку и только после этого читать "Строка 2". Я прав? Если да, то как это сделать.
О! Спасибо! Только вот странно почему переменной должно быть присвоенно значение до ее использования в цикле...
Еще вопрос: в файл test.txt запмсан следующий текст:
Строка 1
Строка 2
Вот текст программы
....
char a[225], b[255];
ifstream fin("test.txt");
fin.getline(a,255);
fin.getline(b,255);
cout << a << endl;
cout << b << endl;
....
В результате на экран выводится
Строка 1
А вместо "Строка 2" выводится "пустое место". Я думаю надо каким то образом после первого чтения строки, переидти на новую строчку и только после этого читать "Строка 2". Я прав? Если да, то как это сделать.
Цитата:
Только вот странно почему переменной должно быть присвоенно значение до ее использования в цикле...
потому что ты используешь значение переменной в условии цикла, а она при первом проходе не инициализирована.
Цитата:
А вместо "Строка 2" выводится "пустое место". Я думаю надо каким то образом после первого чтения строки, переидти на новую строчку и только после этого читать "Строка 2". Я прав? Если да, то как это сделать.
Вообщето нет. более того у меня под gcc выводится так как ты хотел:
Строка1
Строка2
Ты каким компилятором пользуешься?
wInuX
Цитата:
Visual Studio.
Я допустил ошибку.
в файле записанно
Строка 1
22 33
Строка 2
А текст программы следующий:
char a[225], b[255];
long c, d;
ifstream fin("test.txt");
fin.getline(a,255);
fin >> c;
fin >> d;
fin.getline(b,255);
cout << a << endl;
cout << c << endl;
cout << d << endl;
cout << b << endl;
Он выводит массив а, числа с и d, а массив "b" не выводит.
Цитата:
Ты каким компилятором пользуешься?
Visual Studio.
Я допустил ошибку.
в файле записанно
Строка 1
22 33
Строка 2
А текст программы следующий:
char a[225], b[255];
long c, d;
ifstream fin("test.txt");
fin.getline(a,255);
fin >> c;
fin >> d;
fin.getline(b,255);
cout << a << endl;
cout << c << endl;
cout << d << endl;
cout << b << endl;
Он выводит массив а, числа с и d, а массив "b" не выводит.
Так происходит потому что после чтения двух чисел указатель еще не перешел на новую строчку. считай еще раз строку в b. Или считай вторую строку с помощью getline. потом создай потой и считай из нее два числа
Спасибо! Помогло!
Помогите кто-нибудь!!!
Мне в универе задали написать прогу на С++ Builder 6.0 для обработки цифрофой фотографии. Меня интересует если в С++ Builder функции для вызова RGB-матриц для пикселя?
Если их нет, то как подключить функцию mpixel() из MatLab, что бы она производила считывание с с рисунка, который находится на форме.
Заранее благодарен!
Мне в универе задали написать прогу на С++ Builder 6.0 для обработки цифрофой фотографии. Меня интересует если в С++ Builder функции для вызова RGB-матриц для пикселя?
Если их нет, то как подключить функцию mpixel() из MatLab, что бы она производила считывание с с рисунка, который находится на форме.
Заранее благодарен!
Подскажите пожалуйста, как мне вывести в консоли на синем экране желтые буквы? И как рисовать псевдографику в консоли (таблицы разные, кнопочки и т.д.).
Заранее спасибо!
Заранее спасибо!
Это тебе лучше напрямую в видеопамять рисовать. В своё время ещё под ДОСом так делали. Здесь, думаю, технология та же. Надо лишь получить выход на экранный буфер с текстом.
Xarde
А ты проблем с access violation не боишься? Кто в виндах в консольном приложении тебя к видеопамяти пустит?
NNS
Смотри системные вызовы SetConsoleTextAttribute и WriteConsole
А ты проблем с access violation не боишься? Кто в виндах в консольном приложении тебя к видеопамяти пустит?
NNS
Смотри системные вызовы SetConsoleTextAttribute и WriteConsole
Mickey_from_nsk
Спасибо. А как при помощи этих функций сделать так, чтоб экран был синим а в его середине вывелся определенный текст?
И еще вопрос. Есть файл со следующим содержимым:
22 23
33 67
97 38
41 53
66 78
Строка_1
61 45
82 31
96 00
45 77
57 89
Строка_2
Нужно между 66 78 и "Строка_1" и между 57 89 "Строка_2" поместить по 2 числа. Напрмер между 66 78 и "Строка_1" поместить 32 45, а между 57 89 и "Строка_2" вписать 87 21. Ка это реализовать?
Спасибо. А как при помощи этих функций сделать так, чтоб экран был синим а в его середине вывелся определенный текст?
И еще вопрос. Есть файл со следующим содержимым:
22 23
33 67
97 38
41 53
66 78
Строка_1
61 45
82 31
96 00
45 77
57 89
Строка_2
Нужно между 66 78 и "Строка_1" и между 57 89 "Строка_2" поместить по 2 числа. Напрмер между 66 78 и "Строка_1" поместить 32 45, а между 57 89 и "Строка_2" вписать 87 21. Ка это реализовать?
NNS
Цитата:
В винде при работе с консолью много разных функций. В том числе, есть некий аналог работы с видеопамятью. То есть, создаешь экранный буфер, каждый элемент его - структура CHAR_INFO, в которой один из элементов - маска цветов, другой - символ.
Заполняешь его чем хочешь, потом, просто делаешь его активным.
Пример из MSDN:
Код:
#include <windows.h>
VOID main(void)
{
HANDLE hStdout, hNewScreenBuffer;
SMALL_RECT srctReadRect;
SMALL_RECT srctWriteRect;
CHAR_INFO chiBuffer[160]; // [2][80];
COORD coordBufSize;
COORD coordBufCoord;
BOOL fSuccess;
// Get a handle to the STDOUT screen buffer to copy from and
// create a new screen buffer to copy to.
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
hNewScreenBuffer = CreateConsoleScreenBuffer(
GENERIC_READ | // read/write access
GENERIC_WRITE,
0, // not shared
NULL, // no security attributes
CONSOLE_TEXTMODE_BUFFER, // must be TEXTMODE
NULL); // reserved; must be NULL
if (hStdout == INVALID_HANDLE_VALUE ||
hNewScreenBuffer == INVALID_HANDLE_VALUE)
{
MyErrorExit("CreateConsoleScreenBuffer");
}
// Make the new screen buffer the active screen buffer.
if (! SetConsoleActiveScreenBuffer(hNewScreenBuffer) )
MyErrorExit("SetConsoleActiveScreenBuffer");
// Set the source rectangle.
srctReadRect.Top = 0; // top left: row 0, col 0
srctReadRect.Left = 0;
srctReadRect.Bottom = 1; // bot. right: row 1, col 79
srctReadRect.Right = 79;
// The temporary buffer size is 2 rows x 80 columns.
coordBufSize.Y = 2;
coordBufSize.X = 80;
// The top left destination cell of the temporary buffer is
// row 0, col 0.
coordBufCoord.X = 0;
coordBufCoord.Y = 0;
// Copy the block from the screen buffer to the temp. buffer.
fSuccess = ReadConsoleOutput(
hStdout, // screen buffer to read from
chiBuffer, // buffer to copy into
coordBufSize, // col-row size of chiBuffer
coordBufCoord, // top left dest. cell in chiBuffer
&srctReadRect); // screen buffer source rectangle
if (! fSuccess)
MyErrorExit("ReadConsoleOutput");
// Set the destination rectangle.
srctWriteRect.Top = 10; // top lt: row 10, col 0
srctWriteRect.Left = 0;
srctWriteRect.Bottom = 11; // bot. rt: row 11, col 79
srctWriteRect.Right = 79;
// Copy from the temporary buffer to the new screen buffer.
fSuccess = WriteConsoleOutput(
hNewScreenBuffer, // screen buffer to write to
chiBuffer, // buffer to copy from
coordBufSize, // col-row size of chiBuffer
coordBufCoord, // top left src cell in chiBuffer
&srctWriteRect); // dest. screen buffer rectangle
if (! fSuccess)
MyErrorExit("WriteConsoleOutput");
Sleep(10000);
// Restore the original active screen buffer.
if (! SetConsoleActiveScreenBuffer(hStdout))
MyErrorExit("SetConsoleActiveScreenBuffer");
}
Цитата:
А как при помощи этих функций сделать так, чтоб экран был синим а в его середине вывелся определенный текст?
В винде при работе с консолью много разных функций. В том числе, есть некий аналог работы с видеопамятью. То есть, создаешь экранный буфер, каждый элемент его - структура CHAR_INFO, в которой один из элементов - маска цветов, другой - символ.
Заполняешь его чем хочешь, потом, просто делаешь его активным.
Пример из MSDN:
Код:
#include <windows.h>
VOID main(void)
{
HANDLE hStdout, hNewScreenBuffer;
SMALL_RECT srctReadRect;
SMALL_RECT srctWriteRect;
CHAR_INFO chiBuffer[160]; // [2][80];
COORD coordBufSize;
COORD coordBufCoord;
BOOL fSuccess;
// Get a handle to the STDOUT screen buffer to copy from and
// create a new screen buffer to copy to.
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
hNewScreenBuffer = CreateConsoleScreenBuffer(
GENERIC_READ | // read/write access
GENERIC_WRITE,
0, // not shared
NULL, // no security attributes
CONSOLE_TEXTMODE_BUFFER, // must be TEXTMODE
NULL); // reserved; must be NULL
if (hStdout == INVALID_HANDLE_VALUE ||
hNewScreenBuffer == INVALID_HANDLE_VALUE)
{
MyErrorExit("CreateConsoleScreenBuffer");
}
// Make the new screen buffer the active screen buffer.
if (! SetConsoleActiveScreenBuffer(hNewScreenBuffer) )
MyErrorExit("SetConsoleActiveScreenBuffer");
// Set the source rectangle.
srctReadRect.Top = 0; // top left: row 0, col 0
srctReadRect.Left = 0;
srctReadRect.Bottom = 1; // bot. right: row 1, col 79
srctReadRect.Right = 79;
// The temporary buffer size is 2 rows x 80 columns.
coordBufSize.Y = 2;
coordBufSize.X = 80;
// The top left destination cell of the temporary buffer is
// row 0, col 0.
coordBufCoord.X = 0;
coordBufCoord.Y = 0;
// Copy the block from the screen buffer to the temp. buffer.
fSuccess = ReadConsoleOutput(
hStdout, // screen buffer to read from
chiBuffer, // buffer to copy into
coordBufSize, // col-row size of chiBuffer
coordBufCoord, // top left dest. cell in chiBuffer
&srctReadRect); // screen buffer source rectangle
if (! fSuccess)
MyErrorExit("ReadConsoleOutput");
// Set the destination rectangle.
srctWriteRect.Top = 10; // top lt: row 10, col 0
srctWriteRect.Left = 0;
srctWriteRect.Bottom = 11; // bot. rt: row 11, col 79
srctWriteRect.Right = 79;
// Copy from the temporary buffer to the new screen buffer.
fSuccess = WriteConsoleOutput(
hNewScreenBuffer, // screen buffer to write to
chiBuffer, // buffer to copy from
coordBufSize, // col-row size of chiBuffer
coordBufCoord, // top left src cell in chiBuffer
&srctWriteRect); // dest. screen buffer rectangle
if (! fSuccess)
MyErrorExit("WriteConsoleOutput");
Sleep(10000);
// Restore the original active screen buffer.
if (! SetConsoleActiveScreenBuffer(hStdout))
MyErrorExit("SetConsoleActiveScreenBuffer");
}
Mickey_from_nsk
Спасибо.
По поводу второго вопроса.
Цитата:
Я вообще хотел не переписовать файл полностью, но раз это будет сложнее, то тогда лучше простым методом. Там куда его резервировать? по массивам?
Спасибо.
По поводу второго вопроса.
Цитата:
Тебе как надо? Просто или с извратами?
Я вообще хотел не переписовать файл полностью, но раз это будет сложнее, то тогда лучше простым методом. Там куда его резервировать? по массивам?
Mickey_from_nsk
Цитата:
Так это по сути то же самое переписывание получится. Только, как верно подмечено, с извратами.
Цитата:
В принципе - через маппирование файлов на память можно и это решить.
Так это по сути то же самое переписывание получится. Только, как верно подмечено, с извратами.
Объясните, плиз, толком как это написать. А то я уже замучался
NNS
Открываешь исходный файл, создаёшь новый. Считываешь строку из исходного, записываешь в новый. В месте, где нужно добавить строку - сначала записываешь добавляемую строку, затем строку из исходного. Повторяешь, пока исходный файл не кончится. Всё.
Открываешь исходный файл, создаёшь новый. Считываешь строку из исходного, записываешь в новый. В месте, где нужно добавить строку - сначала записываешь добавляемую строку, затем строку из исходного. Повторяешь, пока исходный файл не кончится. Всё.
Страницы: 12345678910111213141516171819202122
Предыдущая тема: DELPHI. Счетчик ячеек со значенями, значений ячеек
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.