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

» Вопросы по программированию на C/С++

Автор: Red Planet
Дата сообщения: 18.08.2011 13:18
Добрый день! Хочу сохранить в файл через TSaveDialog данные из TMemo.

Цитата:
void __fastcall TmForm::saveLogButtonClick(TObject *Sender) {
    FILE *FOpen;

    if (saveLog->Execute()) {
        ofstream saveLogStream (saveLog->FileName.c_str(), ios::app);
        saveLogStream << dataMemo->Lines->GetText();
    }
    else {
return;
    }
}


В выделенной строке возникает ошибка. Вместо текста записывается что-то в духе "4f21ab". Адрес первой строки TMemo?

Просто текст записывается.

Цитата:
saveLogStream << "Lorem ipsum...";


saveLog - мой TSaveDialog.

Была идея пройтись по строкам TMemo циклом, но не сообразил как. Как здесь правильно сделать?

Проблема решена.


Цитата:
void __fastcall TmForm::saveLogButtonClick(TObject *Sender) {
    if (saveLog->Execute())
        dataMemo->Lines->LoadFromFile(saveLog->FileName)
    else
return;
}

Автор: ne_viens
Дата сообщения: 18.08.2011 15:59
Может кто знает, как собрать такую ф-ю в длл:

Код:
__stdcall setsockopt(s, level, optname, optval, optlen)
{
//тут манипуляции с аргументами
//...

return setsockopt(s, level, optname, optval, optlen); //эта setsockopt() берётся из WS2_32.lib
}
Автор: KF121
Дата сообщения: 18.08.2011 18:30
только не

Цитата:
void __fastcall TmForm::saveLogButtonClick(TObject *Sender) {
if (saveLog->Execute())
dataMemo->Lines->LoadFromFile(saveLog->FileName)
else
return;
}

а

Цитата:
void __fastcall TmForm::saveLogButtonClick(TObject *Sender) {
if (saveLog->Execute())
dataMemo->Lines->SaveToFile(saveLog->FileName)
else
return;
}

Автор: ItsJustMe
Дата сообщения: 18.08.2011 19:32
ne_viens
Как вериант, можно wsock32.dll грузить через LoadLibrary. Свою же - как хочешь. Работать будет.
Автор: ValidolX
Дата сообщения: 18.08.2011 20:12

Цитата:
Может кто знает, как собрать такую ф-ю в длл:

в чем проблема?
ето ведь функция из WinAPI? тогда а) подключить нужный хидер б) подключить нужную либу (.lib) для линкера
или как уже указали - через LoadLibrary/GetProcAddress (имхо зачем?)
Автор: ne_viens
Дата сообщения: 18.08.2011 20:23
Проблема в том, что вторая setsockopt() вызывает первую setsockopt() и получается рекурсия. Надо каким-то образом указать линкеру, что вторая setsockopt() лежит в WS2_32.lib, а не пару строчек выше.
Автор: ValidolX
Дата сообщения: 18.08.2011 20:31
ne_viens
если сигнатура функции 1 в 1 как в виндовсе - будеш ошибка линкера (дубль функций)
вам точно надо название 1 в 1? если да - тогда видимо надо через LL/GPA
Автор: ne_viens
Дата сообщения: 19.08.2011 09:24
Разобрался на свежую голову. Пишем:

Код:
int __stdcall _setsockopt(int s, int level, int optname, char* optval, int optlen)
{
//...
return setsockopt(s, level, optname, optval, optlen);
}
Автор: deman_ru
Дата сообщения: 25.08.2011 14:18
Ребят, подскажите пожалуйста как лучше, быстрее и проще сделать отчет, описание всего прилагаю ниже…все это абстрактно, но в полной мере описывает то что нужно.
БД – Firebird 2.1
Среда - Borland C++ Builder 6
Язык – C++
Компоненты доступа - InterBase

Есть БД с таблицами: «Посещения», «Категория больных»
Посещения:
Код
Дата посещения
Пациент
Код категории

Категория больных:
Код
Наименование категории

Заполненные таблицы…
Посещения:

Код Дата посещения Пациент Код категории
1 12.03.2011 Иванов Иван Иванович 1
2 15.03.2011 Петров Петр Петрович 2
3 12.03.2011 Сидоров Сидор Сидорович 1

Категории:

Код Наименование категории
1     Категория 1
2     Категория 2


Нужно сделать отчет, который бы показывал сколько посетителей, было в определенную дату.
Пример отчета:

Дата | 12.03.2011 | 15.03.2011
-------------------------------------------------------------
Категория 1 | 2 | 0
Категория 2 | 0 | 1

Дайте совет пожалуйста, как лучше это реализовать? Использовать QuickReport или как то по другому…пожалуйста дайте совета.
Автор: Molniev
Дата сообщения: 25.08.2011 14:39
QuickReport или FastReport. Самый простой выход. Освоить можно минут за 30.
Автор: deman_ru
Дата сообщения: 29.08.2011 09:52

Цитата:
QuickReport или FastReport. Самый простой выход. Освоить можно минут за 30.

А можно чуть больше конкретики? Какие запросы выполнить, как настроить? Хотя бы наводку какю нибудь дайте мне пожалуйста.

Добавлено:
Не могу придумать как сделать этот отчет. В голове есть идея, но мне кажется она жутко бредовой: создать в базе еще одну таблицу, в которую я буду помещать данные для отчета. То есть в диапазоне дат в цикле, выбирать то что мне нужно и заносить построчно в таблицу, а потом просто вывести все записи. Но это будет трудно реализовать...может есть способ проще и лучше?
Автор: asi81
Дата сообщения: 29.08.2011 21:52
Добрый день!
Задача - примерно следующая.

У меня есть объекты различных типов, но условно все множество этих типов можно разделить на две категории: pod-данные(int,char ....) и потомки класса MyObj. Количество типов таких потомков не ограничено и может быть бесконечно большим. Можно ли создать такую шаблонную функцию(или конечное множество перегруженных функций), которая бы на выходе выдавала, является ли этот объект простым типом, либо потомком от класса MyObj;

если схематично

int a;
isMyObj(a) дает false;

class MyObj2: public MyObj2{};
MyObj2 b;
isMyObj(b) дает true;
Автор: Garrett
Дата сообщения: 29.08.2011 22:42
deman_ru
Fast Report решит все ваши проблемы.
Автор: Qraizer
Дата сообщения: 30.08.2011 03:04
asi81, а в чём сложность?
Код: bool isMyObj(const volatile MyObj&) { return true; }
bool isMyObj(...) { return false; }
Автор: asi81
Дата сообщения: 30.08.2011 09:51
Спасибо - это то, что надо. Сложность была в незнании volatile при определении аргумента функции.
Автор: Qraizer
Дата сообщения: 30.08.2011 16:03
volatile там на всякий случай. Если вдруг передаваемый параметр тоже имеет этот модификатор, то каст был бы неуспешным.
Автор: asi81
Дата сообщения: 31.08.2011 09:29
Qraizer
Как это на всякий случай? Если я убираю volatile, то isMyObj с потомками MyObj возвращает false. Только что проверил. При этом я не указывал volatile перед обьектами.

У тебя во втором примере есть определение функций check, но описание этих фунций я не нашел. Тоже самое с операторами приведения в Proxy.


Автор: deman_ru
Дата сообщения: 31.08.2011 13:52
Garrett, читал мануал, пробовал различные комбинации отчетов, группировки, двухуровневые отчеты, master-detail...не могу подобрать для своего примера( если у вас есть опыт в построении таких отчетов с помощью FastReport, расскажите как сделать пожалуйста!
Автор: Red Planet
Дата сообщения: 31.08.2011 17:42
Здравствуйте!

Есть вектор списков, нужно отсортировать по возрастанию первого элемента каждого списка вектора. Вот пример.

Цитата:
vector< list<int> > mVl (3, list<int>());
    mVl[0].push_back(20);
    mVl[0].push_back(7);
    mVl[0].push_back(17);

    mVl[1].push_back(1);
    mVl[1].push_back(12);
    mVl[1].push_back(34);

    mVl[2].push_back(13);
    mVl[2].push_back(12);
    mVl[2].push_back(34);

    for (int i = 0; i < mVl.size(); i++) {
        for (list<int>::iterator it = mVl[i].begin(); it != mVl[i].end(); ++it) {
            cout << *it << " ";
        }
        cout << endl;
    }

    for (int i = 1; i < mVl.size(); i++) {
        sort(mVl.begin(), mVl.end());
    }

cout << endl;

    for (int i = 0; i < mVl.size(); i++) {
        for (list<int>::iterator it = mVl[i].begin(); it != mVl[i].end(); ++it) {
            cout << *it << " ";
        }
        cout << endl;
    }

Сначала были списки (20, 7, 17), (1, 12, 34), (13, 12, 34).
После сортировки (1, 12, 34), (13, 12, 34), (20, 7, 17).

То есть стандартная сортировка работает здесь без дополнительного параметра. А если будет задача отсортировать по возрастанию второго, то как здесь сделать? Пробовал писать

Цитата:
bool mSort(int left, int right) {
    return left < right;
}

и применять

Цитата:
for (int i = 1; i < mVl.size(); i++) {
sort(mVl.begin(), mVl.end(), mSort(mVl[i-1].front(), mVl[i].front()));
}

Не работает, говорит об ошибке "Call of non-function" и высылаем в algorithm на строки

Цитата:
while (_First < _Pfirst
        && !_DEBUG_LT_PRED(_Pred, *(_Pfirst - 1), *_Pfirst)
        && !_Pred(*_Pfirst, *(_Pfirst - 1)))
        --_Pfirst;

В поле Memo баг такой что-ли, что нельзя писать

Цитата:
MyMemo->Lines->Add("\n\n\n")

И сколько угодно еще можно написать символов "\n", но переход будет только на одну строку. В это же время

Цитата:
MyMemo->Lines->Add("\n");
MyMemo->Lines->Add("\n");

работает.

А
Цитата:
MyMemo->Text = "\nLorem ipsum\ndolor sit amet..."

вообще игнорирует переходы.
Автор: Molniev
Дата сообщения: 31.08.2011 19:10
Red Planet
Как то у вас вообще странно сортировка сделана:

Код:     for (int i = 1; i < mVl.size(); i++) {
        sort(mVl.begin(), mVl.end());
    }
Автор: Qraizer
Дата сообщения: 01.09.2011 00:34

Цитата:
У тебя во втором примере есть определение функций check, но описание этих фунций я не нашел. Тоже самое с операторами приведения в Proxy.
Они не нужны. Это метафункция, её "исполняет" компилятор, когда генерирует код. Точнее даже, когда выполняет семантический разбор IsDerived<>::value, чтобы получить значение enum {value}. Он по Стандарту обязан это сделать при компиляции, т.к. значения идентификаторов перечисления являются константами периода компиляции. Когда он компилирует, ему достаточно прототипов, когда компиляция заканчивается, на месте ::value оказывается готовая константа. Так что вызовов нигде не будет, и линкеру никогда не потребуются их адреса.

А вот как именно он получает значение константы value, вопрос гораздо интереснее. Тут работают весьма тонкие правила разрешения перегрузки.

Добавлено:

Цитата:
Как это на всякий случай? Если я убираю volatile, то isMyObj с потомками MyObj возвращает false. Только что проверил. При этом я не указывал volatile перед обьектами.
Не знаю, как ты проверял. У меня работает и без, если не ставить. Покажи код, попробую понять. Мож что ещё не учёл.
Автор: asi81
Дата сообщения: 02.09.2011 10:11
Qraizer



Код:

class MyObj;


int arrSize(...){return 1;}
template <typename T,int size>
int arrSize(const T (&m)[size]){    return size;}



bool isMyObj(...) {return false;};
bool isMyObj(volatile const MyObj&) {return true;};
template <typename T, int size>
bool isMyObj(volatile const T (&n)[size]) {return isMyObj(n[0]);}


class VarInfo
{
public:
    bool m_bisMyObj;
    int m_elemCnt;

    template <typename T>
    VarInfo(const volatile T& v):m_bisMyObj(isMyObj(v)),m_elemCnt(arrSize(v)){};

    void print() {std::cout << "isMyObj = " << (m_bisMyObj?"yes":"no") << "\t\tElemCnt = " << m_elemCnt << "\r\n";}
};



class MyObj
{
    int y;
public:
    virtual void show()
    {
        std::cout << "y=" << y << "\r\n";
    }
};


class MyObjOffspring: public MyObj
{
    int m;
public:
    virtual void show()
    {
        std::cout << "m=" << m << "\r\n";
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    int y;
    VarInfo _y(y);
    _y.print();


    int x[10];
    VarInfo _x(x);
    _x.print();


    MyObj n;
    VarInfo _n(n);
    _n.print();


    MyObj g[10];
    VarInfo _g(g);
    _g.print();


    MyObjOffspring m;
    VarInfo _m(m);
    _m.print();


    MyObjOffspring h[10];
    VarInfo _h(h);
    _h.print();


    Sleep(100000);
    return 0;
}


Автор: Qraizer
Дата сообщения: 03.09.2011 00:30
asi81, должно работать. Значит, не везде удалял.

Добавлено:
Например, забыл удалить из конструктора VarInfo. Тогда, передавая ему, например, _m, в констукторе получится тип const volatile MyObjOffspring&, т.к. неявно cv-квалификаторы могут быть добавлены. Но вызов в инициализаторе конструктора isMyObj(v) уже не допустит каста из const volatile MyObjOffspring& к const MyObjOffspring& (чтобы затем неявно привестись к const MyObj&, то бишь ссылке на базовый класс), т.к. убраны cv-квалификаторы могут быть только явно. Поэтому isMyObj(const MyObj&) отвергается как неподходящая.
Автор: asi81
Дата сообщения: 06.09.2011 10:23
Qraizer
Так и есть! спасибо за помощь
Раньше я пытался делать

Код:
template <typename T>
bool isMyObj(const T &) {return false;}
bool isMyObj(const MyObj&) {return true;}
Автор: Qraizer
Дата сообщения: 07.09.2011 01:34

Цитата:
Раньше я пытался делать ...
И правильно, что не работало. Перегрузка работает после применения аргументов шаблона к шаблонным параметрам. Также при выводе аргументов шаблонной функции никакие преобразования типов не учитываются. Так что любые типы, даже производные от MyObj классы (и даже сам MyObj), всегда выводились для шаблонной функции как T, и при разрешении перегрузки удовлетворяли шаблонной функции наилучшим образом ввиду полного совпадения с типом аргумента, тогда как для второй, нешаблонной функции, требовалось как минимум стандартное преобразование. И только для самого MyObj обе функции удовлетворяли одинаково хорошо своему агрументу, и поэтому выбиралась нешаблонная, потому что она "более специализирована", чем шаблонная.
Эллипсис же изначально имеет наименьший приоритет в борьбе за перегрузку, поэтому удовлетворяет аргументу только если абсолютно нет других вариантов. В частности он не выберется, если в твоём MyObj наличествует не explicit конструктор, принимающий int, и ты вызовешь isMyObj с целочисленным аргументом. Так что подумаешь, будто бы int наследник MyObj
Автор: Master_Profi
Дата сообщения: 07.09.2011 20:00
Извините за ламерский вопрос, смотрел в гугле и книгах, пробовал но не помогло ничего, начал изучать приложения win32 api, когда только создаешь проект уже есть готовое окно при дэбаге, как мне изменить заголовок в этой окне? чтобы окно называлось так как я этого хочу, а не так как назвал сам проект при создании...
Автор: Molniev
Дата сообщения: 07.09.2011 21:10
Master_Profi
Хм. проявляю чудеса телепатии - предполагаю, что у вас Visual Studio и вы говорите про win32 project.
В функции InitInstance вызову CreateWindow третьим параметром передаеться текстовая строка szTitle - заголовок окна. Которая в свою очередь загружаеться в _tWinMain функцией LoadString из ресурса с идентификатором IDS_APP_TITLE.
Таким образом вам надо либо поменять вызов CreateWindow, либо открыть файл ресурсов (через редактор студии или как текст) и в String Table поменять значение ресурса IDS_APP_TITLE.
Еще как вариант можно через SetWindowText (если правильно помню) или через SendMessage/PostMessage - но это в большей степени для динамического изменения.
Автор: Master_Profi
Дата сообщения: 07.09.2011 21:31
Molniev

Цитата:
В функции InitInstance вызову CreateWindow третьим параметром передаеться текстовая строка szTitle - заголовок окна. Которая в свою очередь загружаеться в _tWinMain функцией LoadString из ресурсов.
Таким образом вам надо либо поменять вызов CreateWindow, либо открыть файл ресурсов (через редактор студии или как текст) и в String Table поменять значение ресурса IDS_APP_TITLE.

Да, спасибо за разьяснения! Я забыл почему-то вообще упомянуть про то, что VS 2008 стоит.. Я сделал как вы предложили во втором случае! помогло! но всетаки еще хочу это сделать программно! Все то, что вы описали(первый случай), я с этим уже ознакомился: гугл, книги..видел строку szTitle и знал, что она обозначает заголовок окна! Но вот я не знаю как этим воспользоваться...видел были примеры, что можно после szTitle ставить запятую и в двойных кавычках писать надобное тебе название, у меня не работало так, пытался вместо этого текста в двойных кавычках писать название, тоже не подходило, пробовал еще пару вариантов, в описании структуры пробовал исправлять, добавлять, ничего пока не подходит ... так что же нужно написать и где? хочу программно понять

Да, кстати, ще пробовал в самом начале создавать szTitle как глобальную переменную и присваивать название, тоже не помогло(
Автор: Molniev
Дата сообщения: 07.09.2011 23:06
Master_Profi
"но всетаки еще хочу это сделать программно" - ну как бы в ресурсах поменять это тоже программно...

Цитата:
видел строку szTitle и знал, что она обозначает заголовок окна! Но вот я не знаю как этим воспользоваться...видел были примеры, что можно после szTitle ставить запятую и в двойных кавычках писать надобное тебе название, у меня не работало так, пытался вместо этого текста в двойных кавычках писать название, тоже не подходило, пробовал еще пару вариантов, в описании структуры пробовал исправлять, добавлять, ничего пока не подходит ... так что же нужно написать и где? хочу программно понять

По коду проекта студии:

Код:
TCHAR szTitle[MAX_LOADSTRING];    
....
_tWinMain(...)
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
....
InitInstance(...)
....
InitInstance(...)
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
Автор: Master_Profi
Дата сообщения: 07.09.2011 23:47
Molniev
СПАСИБО ОГРОМНОЕ! ))
Теперь я спец по тому как менять заголовок в окне)) не думал даже, что есть столько способов изменения заголовка. Со всем разобрался, с функцией, с заменой szTitle. единственное правда почему-то не удалось создать глобальную переменную и заменить ей szTitle, не хочет дэбагериться.. ну да ладно пока, работает зато с другим) на счет того, что книги основа всего..
Цитата:
Р.М. Ганеев - Проектирование интерфейса пользователя средствами Win32 API
П.В. Румянцев - Азбука программирования в Win32 API
с этим согласен, и как раз
эти книги я сейчас и читаю, но вот как ни странно не нашел там того, что вы мне написали тут! остальные посоветованные книги скачаю, посмотрю!...спасибо!

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


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