Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433

Почему нельзя так делать? Конструктор перемещения?

17.07.2019, 13:37. Показов 4482. Ответов 52
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня возникла проблема с хранением объектов класса в векторе векторов, объявленном в другом классе. Класс, объекты которого пытаюсь хранить в векторе, генерируется автоматически мастером MFC, но суть не в этом.
Вот этот класс.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// NOTE: This class must remain a binary-compatible subset
// of CEditView. Do not add data members or virtual functions
// directly to this class.
class CEdit : public CWnd
{
    // DECLARE_DYNAMIC virtual OK - CWnd already has DECLARE_DYNAMIC
    DECLARE_DYNAMIC(CEdit)
 
// Constructors
public:
    CEdit();
    BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
 
// Attributes
    BOOL CanUndo() const;
    int GetLineCount() const;
    BOOL GetModify() const;
    void SetModify(BOOL bModified = TRUE);
    void GetRect(LPRECT lpRect) const;
    DWORD GetSel() const;
    void GetSel(int& nStartChar, int& nEndChar) const;
    HLOCAL GetHandle() const;
    void SetHandle(HLOCAL hBuffer);
    void SetMargins(UINT nLeft, UINT nRight);
    DWORD GetMargins() const;
    void SetLimitText(UINT nMax);
    UINT GetLimitText() const;
    CPoint PosFromChar(UINT nChar) const;
    int CharFromPos(CPoint pt) const;
 
    // NOTE: first word in lpszBuffer must contain the size of the buffer!
    // NOTE: may not return null character
    int GetLine(_In_ int nIndex, _Out_ LPTSTR lpszBuffer) const;
    // NOTE: may not return null character
    int GetLine(_In_ int nIndex, _Out_writes_to_(nMaxLength, return) LPTSTR lpszBuffer, _In_ int nMaxLength) const;
 
    AFX_ANSI_DEPRECATED BOOL SetCueBanner(_In_z_ LPCWSTR lpszText, _In_ BOOL fDrawIfFocused = FALSE);
    AFX_ANSI_DEPRECATED BOOL GetCueBanner(_Out_writes_z_(cchText) LPWSTR lpszText, _In_ int cchText) const;
 
#if defined(UNICODE)
    CString GetCueBanner() const;
 
    BOOL ShowBalloonTip(_In_z_ LPCWSTR lpszTitle, _In_z_ LPCWSTR lpszText, _In_ INT ttiIcon = TTI_NONE);
    BOOL ShowBalloonTip(_In_ PEDITBALLOONTIP pEditBalloonTip);
    BOOL HideBalloonTip();
#endif  // (UNICODE)
 
#if defined(UNICODE)
    // REVIEW: Sets the characters in the edit control that are highlighted.
    void SetHighlight(_In_ int ichStart, _In_ int ichEnd);
 
    // REVIEW: Retrieves the characters in the edit control that are highlighted.
    BOOL GetHighlight(_Out_ int* pichStart, _Out_ int* pichEnd) const;
#endif  // defined(UNICODE)
 
// Operations
    void EmptyUndoBuffer();
    BOOL FmtLines(BOOL bAddEOL);
 
    void LimitText(int nChars = 0);
    int LineFromChar(int nIndex = -1) const;
    int LineIndex(int nLine = -1) const;
    int LineLength(int nLine = -1) const;
    void LineScroll(int nLines, int nChars = 0);
    void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE);
    void SetPasswordChar(TCHAR ch);
    void SetRect(LPCRECT lpRect);
    void SetRectNP(LPCRECT lpRect);
    void SetSel(DWORD dwSelection, BOOL bNoScroll = FALSE);
    void SetSel(int nStartChar, int nEndChar, BOOL bNoScroll = FALSE);
    BOOL SetTabStops(int nTabStops, LPINT rgTabStops);
    void SetTabStops();
    BOOL SetTabStops(const int& cxEachStop);    // takes an 'int'
 
    // Clipboard operations
    BOOL Undo();
    void Clear();
    void Copy();
    void Cut();
    void Paste();
 
    BOOL SetReadOnly(BOOL bReadOnly = TRUE);
    int GetFirstVisibleLine() const;
    TCHAR GetPasswordChar() const;
 
// Implementation
public:
    // virtual OK here - ~CWnd already virtual
    virtual ~CEdit();
};
Насколько я понимаю тут есть только конструктор по умолчанию CEdit(); и нет некоего перемещающего конструктора.
И вот мой класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class CMatrix : public CDialogEx
{
    DECLARE_DYNAMIC(CMatrix)
 
public:
    CMatrix(CWnd* pParent = nullptr);   // стандартный конструктор
    virtual ~CMatrix();
 
// Данные диалогового окна
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_MATRIX_DIALOG };
#endif
 
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // поддержка DDX/DDV
    
    
// Реализация
protected:
    HICON m_hIcon;
    // Созданные функции схемы сообщений
    virtual BOOL OnInitDialog();
 
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void SelectFirstMatrixSizeRow();
    afx_msg void SelectFirstMatrixSizeCol();
    afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
private:
    CComboBox m_firstMatrixSizeRow;
    CComboBox m_firstMatrixSizeCol;
    CEdit m_firstMatrix40;
// Поля первой матрицы
protected:
    
    // 0-ая строка
    CEdit m_firstMatrix00;
    CEdit m_firstMatrix01;
    CEdit m_firstMatrix02;
    CEdit m_firstMatrix03;
    CEdit m_firstMatrix04;
    CEdit m_firstMatrix05;
    CEdit m_firstMatrix06;
    CEdit m_firstMatrix07;
    CEdit m_firstMatrix08;
    // 1-ая строка
    std::vector<std::vector<CEdit>> EditArea = { {m_firstMatrix00}, { m_firstMatrix01} };
};
Ругается на строку std::vector<std::vector<CEdit>> EditArea = { {m_firstMatrix00}, { m_firstMatrix01} };

Думаю иерархия классов не важна, но всё же CWnd -> CEdit и CWnd -> CDialog -> CDialogEx -> CMatrix, то есть оба эти класса имеют одного потомка.

Ошибка компилятора:
1>c:\users\host\source\repos\calcgpd\cal cgpd\cmatrix.h(53): error C2280: "CEdit::CEdit(const CEdit &)": предпринята попытка ссылки на удаленную функцию
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.1 4.26428\atlmfc\include\afxwin.h(3907): note: в этом месте создано компилятором: "CEdit::CEdit"


Что тут происходит? Почему нельзя так делать? Если в вектор накидывал бы числа, то проблем вообще никаких нет...

Добавлено через 10 минут
Опечатался.
Думаю иерархия классов не важна, но всё же CWnd -> CEdit и CWnd -> CDialog -> CDialogEx -> CMatrix, то есть оба эти класса имеют одного -парента.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.07.2019, 13:37
Ответы с готовыми решениями:

Объясните, почему так нельзя делать?
using namespace std; uint32_t foo(uint32_t c, uint32_t a, const vector&lt; uint32_t&gt; &amp; data) { } int main() { uint32_t...

Почему не вызывается конструктор перемещения?
#include &lt;iostream&gt; #include &lt;vector&gt; class Object { public: Object() { std::cout &lt;&lt; &quot;Object()&quot; &lt;&lt; std::endl; ...

Почему не вызывается конструктор перемещения? И есть ли ошибки в коде?
Если вы увидели здесь что-то, что на приличной работе бы не пропустили по ревью, так как там С стиль, то напишите об этом. Мне интересно,...

52
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.07.2019, 22:50
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Timurs Посмотреть сообщение
oleg-m1973, понял)) А как понять, что он им воспользовался?
Обработать соответствующее сообщение, например https://docs.microsoft.com/en-... /en-change
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
23.07.2019, 12:29  [ТС]
oleg-m1973, проверил, работает, но проблема в том, что сообщение требует айди поля, а у меня их 2*81...
Механизм примерно следующий
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
BEGIN_MESSAGE_MAP(CMatrix, CDialogEx)
    ON_CBN_SELCHANGE(IDC_FIRST_MATRIX_SIZE_ROW, &CMatrix::SelectFirstMatrixSizeRow)
    ON_CBN_SELCHANGE(IDC_FIRST_MATRIX_SIZE_COL, &CMatrix::SelectFirstMatrixSizeCol)
    ON_CBN_SELCHANGE(IDC_SECOND_MATRIX_SIZE_ROW, &CMatrix::SelectSecondMatrixSizeRow)
    ON_CBN_SELCHANGE(IDC_SECOND_MATRIX_SIZE_COL, &CMatrix::SelectSecondMatrixSizeCol)
       /* Проблема в явном указании айди тут */
    ON_EN_CHANGE(IDC_EDIT_FIRST_MATRIX_00, &CMatrix::OnChangeEditFirstMatrix) 
END_MESSAGE_MAP()
 
/* какой-то код*/
/* затем раз*/
void CMatrix::OnChangeEditFirstMatrix()
{
    // TODO: добавьте свой код обработчика уведомлений
    GetNumberArea(m_firstMatrixArea, first);
    GetNumberArea(m_secondMatrixArea, second);
}
/* два*/
void CMatrix::GetNumberArea(CWnd* pWnd, NameMatrix switch_on)
{
    CString Str = _T("");
    std::vector<std::vector<double>> one;
    std::vector<std::vector<double>> two;
    std::vector<double> value;
    for (row = 0; row < 9; row++) {
        for (col = 0; col < 9; col++) {
            switch (switch_on)
            {
            case first: { 
                pWnd = GetDlgItem(1022 + 8 * row + col + row % 9); 
                pWnd->GetWindowText(Str);
                Str.Format(_T("%f"), value);
                one.push_back(value);
                break; 
            }
            case second: { 
                pWnd = GetDlgItem(1105 + 8 * row + col + row % 9); 
                pWnd->GetWindowText(Str);
                Str.Format(_T("%f"), value);
                two.push_back(value);
                break; 
            }
            default: { break; }
            }
        }
    }
}
Мне надо все поля обрабатывать...
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
23.07.2019, 12:45
Цитата Сообщение от Timurs Посмотреть сообщение
oleg-m1973, проверил, работает, но проблема в том, что сообщение требует айди поля, а у меня их 2*81...
Ничего оно не требует. С ним вместе приходит и id контрола и его HWND.
Добавь в диалого обработчик WM_COMMAND
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
BOOL CTestDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
    // TODO: Add your specialized code here and/or call the base class
    if (HIWORD(wParam) == EN_CHANGE)
    {
        CString s;
        GetDlgItemText(LOWORD(wParam), s);
        
        wchar_t buf[1024] = {0};
        ::GetWindowText((HWND)lParam, buf, std::size(buf));
    }
    return CDialogEx::OnCommand(wParam, lParam);
}
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
23.07.2019, 12:53  [ТС]
oleg-m1973, сейчас попробую, с карты убираю тогда строку
ON_EN_CHANGE(IDC_EDIT_FIRST_MATRIX_00, &CMatrix::OnChangeEditFirstMatrix)
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
23.07.2019, 13:17  [ТС]
oleg-m1973, что-то не могу этот обработчик нормально добавить
Миниатюры
Почему нельзя так делать? Конструктор перемещения?  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
23.07.2019, 13:23
Цитата Сообщение от Timurs Посмотреть сообщение
oleg-m1973, что-то не могу этот обработчик нормально добавить
Там не нужно. Это не обработчик а виртуальная функция virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
Посмотри в class wizard
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
23.07.2019, 14:16  [ТС]
oleg-m1973, сделано. Eсли есть изменения полей извне (со стороны пользователя), то отправляется сообщение WM_COMMAND, которое обрабатывает функция OnCommand по макросу EN_CHANGE правильно понимаю?

И ещё вопрос
C++
1
2
CString s;
GetDlgItemText(LOWORD(wParam), s);
Если изменения какого-то поля wParam происходит, то из сообщения мы извлекаем айди этого поля при помощи LOWORD(wParam) и получаем текст внутри этого поля при помощи GetDlgItemText(айди, s).
Тогда что делает этот кусок кода?
C++
1
2
wchar_t buf[1024] = { 0 };
::GetWindowText((HWND)lParam, buf, std::size(buf));
Оператор :: перед GetWindowText что показывает, зачем он нужен?
wchar_t buf[1024] = { 0 }; в buf 1024 нуля будут или только ноль вначале?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
23.07.2019, 14:23
Цитата Сообщение от Timurs Посмотреть сообщение
oleg-m1973, сделано. Eсли есть изменения полей извне (со стороны пользователя), то отправляется сообщение WM_COMMAND, которое обрабатывает функция OnCommand по макросу EN_CHANGE правильно понимаю?
EN_CHANGE это одно из сообщений нотификации, которое контрол посылает родителю. Там их много разных.
Цитата Сообщение от Timurs Посмотреть сообщение
Тогда что делает этот кусок кода?
Показывает тебе, что к контролу можно обращаться не только по ид, но и по HWND

Цитата Сообщение от Timurs Посмотреть сообщение
Оператор :: перед GetWindowText что показывает, зачем он нужен?
Чтобы показать, что это глобальная функция. Я их всегда пишу перед апишными функциями - там имена могут совпадать с методами.
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
23.07.2019, 14:53  [ТС]
oleg-m1973, спасибо, понятно.

Не по теме:

Всё же про инициализацию буфера интересно, если мне не изменяет память, то такая запись инициализирует элемент с индексом 0, а не весь массив. В принципе это неважно насколько понимаю, так как всё равно туда потом запись строки идет, но, с другой стороны, раз неважно, то вроде как можно и просто объявление без определения сделать...


Мне эти общие символы wchar_t не очень нравятся ибо сути их введения не понимаю, чем чар обычный не устроил майкрософт. Понятно, что есть просто строки, а есть asciiz строки. Но зачем под те же asciiz строки городить whar_t и т.п. неясно, то ли под кодировку ascii или юникода, то ли что вообще. Это первое, что непонятно, а второе что-то типа "ну, ок, я сейчас возьму этот вэчар тайп, считаю в него текст, а как из вэчара получить тот же дабл неясно".
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
23.07.2019, 14:57
Цитата Сообщение от Timurs Посмотреть сообщение
Мне эти общие символы wchar_t не очень нравятся ибо сути их введения не понимаю, чем чар обычный не устроил майкрософт.
wchar_t - это 2-байтовый символ, юникод.
Цитата Сообщение от Timurs Посмотреть сообщение
Это первое, что непонятно, а второе что-то типа "ну, ок, я сейчас возьму этот вэчар тайп, считаю в него текст, а как из вэчара получить тот же дабл не ясно".
А как ты из char * его получаешь? Здесь точно таже, только используешь функции для юникода, например wtof() вместо atof()
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
23.07.2019, 16:30  [ТС]
oleg-m1973, понятно.
Вначале установил единицы во все поля.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void CMatrix::SetNumberArea(CWnd* pWnd, NameMatrix switch_on)
{
    for (row = 0; row < 9; row++) {
        for (col = 0; col < 9; col++) {
            switch (switch_on)
            {
            case first: { pWnd = GetDlgItem(1022 + 8 * row + col + row % 9);  break; }
            case second: { pWnd = GetDlgItem(1105 + 8 * row + col + row % 9); break; }
            default: break;
            }
            pWnd->SetWindowText(_T("1"));
        }
    }
}
Проверил, отрабатывает.
Затем хочу на каждое изменение поля пересобирать массивы.
Соответственно пишу
C++
1
2
3
4
5
6
7
8
9
10
11
12
BOOL CMatrix::OnCommand(WPARAM wParam, LPARAM lParam)
{
    // TODO: добавьте специализированный код или вызов базового класса
    if (HIWORD(wParam) == EN_CHANGE)
        {
            LOWORD(wParam) < 1105 ?
                GetNumberArea(m_firstMatrixArea, first)
                :
                GetNumberArea(m_secondMatrixArea, second);
        }
    return CDialogEx::OnCommand(wParam, lParam);
}
Пока в функции GetNumberArea ничего нет всё работает. Как только в неё поместить цикл единицы показываются в обоих матрицах только в одном поле с индексом i=0, j=0. С чем связано?
C++
1
2
3
4
5
6
7
8
void CMatrix::GetNumberArea(CWnd* pWnd, NameMatrix switch_on)
{
    for (row = 0; row < 9; row++) {
        for (col = 0; col < 9; col++) {
 
        }
    }
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
23.07.2019, 16:55
Цитата Сообщение от Timurs Посмотреть сообщение
Пока в функции GetNumberArea ничего нет всё работает. Как только в неё поместить цикл единицы показываются в обоих матрицах только в одном поле с индексом i=0, j=0. С чем связано?
Помести этот цикл и покажи
0
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
23.07.2019, 19:52  [ТС]
oleg-m1973, какой именно цикл? Сам цикл пустой, т.е. в нем пока еще ничего нет.
Насколько я понимаю происходит следующее:
1. В функции BOOL CMatrix::OnInitDialog() вызываются SetNumberArea(m_firstMatrixArea, first); и SetNumberArea(m_secondMatrixArea, second);
2. Когда в функции SetNumberArea(m_firstMatrixArea, first); идет установка единицы pWnd->SetWindowText(_T("1")); то запускается функция OnCommand
3. В OnCommand проверяется HIWORD(wParam) == EN_CHANGE и вызывается GetNumberArea
4. Затем цикл SetNumberArea(m_firstMatrixArea, first); схлапывается почему-то...
А может и не так происходит

Добавлено через 2 часа 38 минут
oleg-m1973, да, так и происходит, переменные же row и col поля класса, они в функции SetNumberArea row = 0 и col = 0, затем
pWnd = GetDlgItem(1022 + 8 * row + col + row % 9);
pWnd->SetWindowText(_T("1"));
Затем как вы говорили EN_CHANGE это одно из сообщений нотификации, которое контрол посылает родителю. Получается, после установки 1 контрол посылает сообщение родителю, затем вызов функции GetNumberArea, в которой после цикла row = 9 и col = 9 и функция SetNumberArea схлапывается.
Тогда цикл
C++
1
2
3
4
5
6
7
8
9
10
void CMatrix::GetNumberArea(CWnd* pWnd, NameMatrix switch_on)
{
    if (row == 9 && col == 9) {
        for (int row = 0; row < 9; row++) {
            for (int col = 0; col < 9; col++) {
 
            }
        }
    }
}
И проблема пропадает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.07.2019, 19:52
Помогаю со студенческими работами здесь

Почему нельзя вызывать конструктор без аргументов?
В чем может быть ошибка? На Visual Studio все работает #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; class...

Ошибка в классе или так делать нельзя?
#include &lt;iostream&gt; using namespace std; class student { public: virtual void vvod (int a ,int b ,int c){pa=c;} virtual...

Почему в абстрактном классе можно вызвать конструктор но объект создать нельзя?
class A { protected: std::string str; public: A(std ::string s) :str(s) { std::cout &lt;&lt; &quot;const&quot;; }; virtual std::string...

Почему нельзя в конструкторе использовать параметр по умолчанию, если конструктор не встроен?
То есть честно говоря, вопрос так надо ставить: почему если конструктор встроенный, то можно использовать параметр (по умолчанию) шаблона...

Почему нельзя сделать так?
И как правильно сделать то, что я хочу сделать?) int num = 7; char ch = (char)num; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
53
Ответ Создать тему
Новые блоги и статьи
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru