Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Обучение и начало програмирования на С++

Автор: KADABRA
Дата сообщения: 14.11.2005 21:21
WWWovan
http://bcb.fud.ru/bcb/Sreda/Borland/Bcb5/object/TPaintBox/TPaintBox.shtml
А начинать отсюда
Автор: WWWovan
Дата сообщения: 23.11.2005 15:20
Имееться обьект класса

Цитата:
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();
}

Как сделать, что при обьеме печатаемой информации больше чем на страницу печать осуществлялась на новую(в моем варианте все лишнее обрезает)
Заранее огромное спасибо за помощь.
Автор: WWWovan
Дата сообщения: 02.12.2005 10:24
Люди, неужели никто не может помочь? . Очень нужно.
Автор: KADABRA
Дата сообщения: 02.12.2005 11:37
WWWovan
На сколько я понимаю, это в Борланд С++ Билдере.
Тогда это должно помочь.
И тут ещё.
Автор: iMMortal_Inc
Дата сообщения: 27.12.2005 01:50
люди хелп.
Дайте плз ссылочки на простые книги о С++ (типа про Visual Studio .NET 2003 - 2005).

Я тут немного почитал от автора С++, так основы понял, но дальше...
Автор: mmiichae
Дата сообщения: 27.12.2005 02:23
iMMortal_Inc
Про книги лучше спрашивать в теме http://forum.ru-board.com/topic.cgi?forum=93&bm=1&topic=0892&start=1000
Автор: WWWovan
Дата сообщения: 13.02.2006 17:27
Имеется следующая задача:
В таблице в одном поле хранится номер группы, а во втором номер родительской группы для данной(если конкретизовать, то это группы товара).
Нужно сделать выборку номеров группы вместе с всеми ее подгруппами.
Как это правильно сделать?
Одним из вариантов решения вижу графы, обход в глубину.
Но не совсем четко представляю как реализовать их с динамическими масивами.
Автор: dyr farot
Дата сообщения: 14.02.2006 11:25
простейший вариант -- берем std::map<int, std::set<int> > и строим дерево.
потом рекурсивно его обходим и добавляем все номера в список
Автор: WWWovan
Дата сообщения: 15.02.2006 09:17
dyr farot

Цитата:
простейший вариант -- берем std::map<int, std::set<int> > и строим дерево.
потом рекурсивно его обходим и добавляем все номера в список

Можно немного подробнее?
Автор: dyr farot
Дата сообщения: 15.02.2006 11:53
делается выборка всех групп.
первым параметром в мапу пишется родительская группа, во второй добавляются ее дети.
потом берем из мапы все группы, у которых нет родителя ( группы верхнего уровня ) -- у них parent 0 ( или -1 ( как напишеш ) )
и проходиш по полученному set' у вызывая рекурсивную функцию
Автор: NNS
Дата сообщения: 03.03.2006 12:33
Вопрос в следующем. У меня Visual Studio 2005. Как мне в основном окне созданной программы (windows application), сделать кнопку. Те. в созданой по умолчанию Студией виндовс программе в главном окне (этой программы) нужно вывести кнопку. Как это сделать. Подскажите пожалуйста по доходчивей. Я полный чайник в програмировании на С++ под виндоус.

ЗЫ Посоветуйте, пожалуйста где можно почитать на русском, о виндоус програмировании на С++. Только чтоб книга была написанна "на человеческом", т.е. чтоб даже чайник понял.
Автор: Stroodder
Дата сообщения: 04.03.2006 07:01
NNS
Ну если впервые на си, попробуй создать MFC-приложение - там и сориентируешься.
А ссылки на литературу начинали постить с первых веток, полистай.
Автор: NNS
Дата сообщения: 06.03.2006 20:15
Есть отрывок кода:

.......

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 определенна.
Автор: EZH
Дата сообщения: 06.03.2006 20:23
NNS
Попробуй перед циклом написать fin.get(n);
Автор: NNS
Дата сообщения: 07.03.2006 16:15
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". Я прав? Если да, то как это сделать.
Автор: wInuX
Дата сообщения: 07.03.2006 16:37

Цитата:
Только вот странно почему переменной должно быть присвоенно значение до ее использования в цикле...

потому что ты используешь значение переменной в условии цикла, а она при первом проходе не инициализирована.


Цитата:
А вместо "Строка 2" выводится "пустое место". Я думаю надо каким то образом после первого чтения строки, переидти на новую строчку и только после этого читать "Строка 2". Я прав? Если да, то как это сделать.

Вообщето нет. более того у меня под gcc выводится так как ты хотел:
Строка1
Строка2

Ты каким компилятором пользуешься?
Автор: NNS
Дата сообщения: 07.03.2006 17:05
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" не выводит.
Автор: wInuX
Дата сообщения: 07.03.2006 17:29
Так происходит потому что после чтения двух чисел указатель еще не перешел на новую строчку. считай еще раз строку в b. Или считай вторую строку с помощью getline. потом создай потой и считай из нее два числа
Автор: NNS
Дата сообщения: 07.03.2006 21:02
Спасибо! Помогло!
Автор: Tantalov
Дата сообщения: 14.03.2006 09:32
Помогите кто-нибудь!!!
Мне в универе задали написать прогу на С++ Builder 6.0 для обработки цифрофой фотографии. Меня интересует если в С++ Builder функции для вызова RGB-матриц для пикселя?
Если их нет, то как подключить функцию mpixel() из MatLab, что бы она производила считывание с с рисунка, который находится на форме.
Заранее благодарен!
Автор: dyr farot
Дата сообщения: 14.03.2006 11:03
http://forum.sources.ru/index.php?showtopic=64033
Автор: NNS
Дата сообщения: 14.03.2006 22:38
Подскажите пожалуйста, как мне вывести в консоли на синем экране желтые буквы? И как рисовать псевдографику в консоли (таблицы разные, кнопочки и т.д.).
Заранее спасибо!
Автор: Xarde
Дата сообщения: 15.03.2006 09:18
Это тебе лучше напрямую в видеопамять рисовать. В своё время ещё под ДОСом так делали. Здесь, думаю, технология та же. Надо лишь получить выход на экранный буфер с текстом.
Автор: Mickey_from_nsk
Дата сообщения: 15.03.2006 13:05
Xarde
А ты проблем с access violation не боишься? Кто в виндах в консольном приложении тебя к видеопамяти пустит?
NNS
Смотри системные вызовы SetConsoleTextAttribute и WriteConsole
Автор: NNS
Дата сообщения: 16.03.2006 18:07
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. Ка это реализовать?
Автор: Mickey_from_nsk
Дата сообщения: 17.03.2006 06:42
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");

}
Автор: NNS
Дата сообщения: 17.03.2006 18:44
Mickey_from_nsk
Спасибо.

По поводу второго вопроса.


Цитата:
Тебе как надо? Просто или с извратами?


Я вообще хотел не переписовать файл полностью, но раз это будет сложнее, то тогда лучше простым методом. Там куда его резервировать? по массивам?
Автор: Abs62
Дата сообщения: 17.03.2006 19:42
Mickey_from_nsk

Цитата:
В принципе - через маппирование файлов на память можно и это решить.

Так это по сути то же самое переписывание получится. Только, как верно подмечено, с извратами.
Автор: NNS
Дата сообщения: 18.03.2006 17:13
Объясните, плиз, толком как это написать. А то я уже замучался
Автор: Abs62
Дата сообщения: 18.03.2006 19:08
NNS
Открываешь исходный файл, создаёшь новый. Считываешь строку из исходного, записываешь в новый. В месте, где нужно добавить строку - сначала записываешь добавляемую строку, затем строку из исходного. Повторяешь, пока исходный файл не кончится. Всё.

Страницы: 12345678910111213141516171819202122

Предыдущая тема: DELPHI. Счетчик ячеек со значенями, значений ячеек


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.