Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 1
Регистрация: 16.03.2015
Сообщений: 46

Действительно ли сейчас считается нормальным писать код в хидере?

16.03.2015, 21:59. Показов 3079. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пробую сделать простейшую формочку на VS2008.
Основной элемент - PictureBox. Ну и кнопка ещё.
Сгенерился скелет прожекта, в котором практически весь код сосредоточен в .h-файле (Form1.h), ну вы наверное представляете.
Вопросы в следующем:
1) Действительно ли сейчас считается нормальным писать код в хидере?
2) Если я всё же пытаюсь размещать код в других файлах, то не могу понять, как добраться до элементов формы.
Например, в самом Form1.h, точнее, в нэймспэйсе, который там объявляется, я могу объявить Bitmap^ MyImage1; и затем отобразить его: pictureBox1->Image = MyImage1;
Но как правильно сделать это из другого места?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.03.2015, 21:59
Ответы с готовыми решениями:

Тип возвращаемого значения перечисление в хидере, которое описывается в другом хидере
Всем привет. У меня внутри хидера модуля есть объявление функции, которая возвращает тип перечисления, который ОПРЕДЕЛЁН в другом хидере. ...

"Не нашел где писать" освоил с++, сейчас учу java. Какой язык сейчас более востребован?
Учу два языка одновременно. С++ около 9 месяцев и практически освоил. В java дошел уже до многопоточности по герберт шилд. За 3 месяца. ...

Что сейчас востребованнее: делать сайты или писать программы?
Что сейчас востребованнее: делать сайты или писать программы?

20
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.03.2015, 11:33
Цитата Сообщение от провинцыалекс Посмотреть сообщение
1) Действительно ли сейчас считается нормальным писать код в хидере?
Понятие нормы зависит от условий для которых формулируется. С++/cli неподдерживаемый язык и применять его в больших проектах вряд ли уместно. Для новичка и небольшого проекта всё можно написать в одном заголовочном файле.
Однако, никто не заставляет это делать. Вы легко можете написать cpp и использовать хедер как перечень директив и объявлений, а реализации разместить в cpp. Тут есть нюансы. Если Вы легко пишете код проекта без шаблона, (а учитывая:
Цитата Сообщение от провинцыалекс Посмотреть сообщение
не могу понять, как добраться до элементов формы.
это не так), то Вы можете разнести даже реализацию функции, инициализирующей форму или сам конструктор (в котором она вызывается)) в cpp. Однако, если использование дизайнера форм для Вас актуально, то не выносите их реализации и методы ими вызываемые (если они есть) в cpp иначе, скорее всего, дизайнер перестанет работать. Всё остальное можно. Разместить код метода, на который устанавливается делегат Button_Click, например, можно так:
C++
1
2
//form.h
private: System::Void button1_Click(....);
C++
1
2
3
4
5
//form.cpp
private: System::Void Form1::button1_Click(....)
{
//something happens
}
Ваши методы которые Вы оборачиваете в обработчики тоже можно разделить.
ps проблемы видимости решаются вполне стандартно. Помимо инклуд в cpp должен быть name space проекта и полные имена
0
0 / 0 / 1
Регистрация: 16.03.2015
Сообщений: 46
17.03.2015, 17:01  [ТС]
Спасибо. Но похоже зря я взялся за этот Forms. Случайно на него наткнулся и подумал, что это теперь вместо MFC :-))))
0
2 / 2 / 0
Регистрация: 18.07.2015
Сообщений: 47
26.07.2015, 21:42
IGPIGP, можно поподробней насчет этого:
Цитата Сообщение от IGPIGP Посмотреть сообщение
в cpp должен быть name space проекта и полные имена
Вот мой основной .cpp:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "sqlite3.h"
#include <stdio.h>
#include <windows.h>
#include "MyForm.h"
using namespace System;
using namespace System::Windows::Forms;
#pragma comment(lib, "user32.lib")
 
int main(array<String^>^ arg) {
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false);
        WinForm::MyForm form;   //WinForm - name of your project
    Application::Run(%form);
    }
static int callBack(void *NotUsed, int argc, char **argv, char **azColName)
{
    WinForm::MyForm object; //создаю объект класса
    object.comboBoxBaseLocs->Items->Clear(); //попытка очистить комбо в форме
    object.comboBoxBaseLocs->Items->Add("987");//попытка добавить в комбо в строку
    return 0;
}

Проект компилируется и форма запускается без единой ошибки, но с комбо ничего не происходит. Поясните, если есть свободная минутка.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.07.2015, 22:12
mAKS74, если callBack(...) вызывается из формы то имеет смысл объявить ее в "MyForm.h, а реализацию выполнить в "MyForm.cpp (его надо создать: правая кнопка на решении-> создать -> файл исходного кода->имя)
Поскольку комбобокс - член формы то логично что и callBack(...) (с названием погорячились)) будет членом а не статической функцией.
По коду:
Объявляйте ссылки:
MyForm ^form;
инициализируйте:
form=gcnew MyForm(/*args if present*/);

Вот типичная точка входа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// winFormHeaderCpp.cpp: главный файл проекта.
 
#include "stdafx.h"
#include "Form1.h"
 
using namespace winFormHeaderCpp;
 
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
    // Включение визуальных эффектов Windows XP до создания каких-либо элементов управления
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false); 
 
    // Создание главного окна и его запуск
    Application::Run(gcnew Form1());
    return 0;
}
В ней неймспейс проекта:using namespace winFormHeaderCpp;
безымянная ссылка на форму порождаемая оператором gcnew Form1() передаётся методу Application::Run в виде параметра. Ссылка инициализирована заметьте. То есть форма живёт не дольше чем до завершения метода Run.
1
2 / 2 / 0
Регистрация: 18.07.2015
Сообщений: 47
26.07.2015, 22:20
Спасибо, осмыслю и попробую позже, а callBack это не я придумал, это из стандартного запроса в SQLite,
C++
1
rc = sqlite3_exec(db, callDB, callBack, 0, &zErrMsg);
который таки-да
Цитата Сообщение от IGPIGP Посмотреть сообщение
вызывается из формы
но вот функцию callBack я так и не смог сделать методом класса, поэтому пришлось вынести в основной .cpp
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.07.2015, 22:36
Цитата Сообщение от mAKS74 Посмотреть сообщение
так и не смог сделать методом класса
Для работы с sqllite в С++/cli нужно помучиться. Посмотрите вот тут, например:
https://dcravey.wordpress.com/... plication/
это при том, что в мастдаёныше c# всё есть:
https://msdn.microsoft.com/ru-... 63243.aspx
это одна из многих ссылок по запросу sqllite в c#
вот и думайте. Тут выбор платформы - первый вопрос.
0
2 / 2 / 0
Регистрация: 18.07.2015
Сообщений: 47
27.07.2015, 09:08
Цитата Сообщение от IGPIGP Посмотреть сообщение
неймспейс проекта:using namespace winFormHeaderCpp;
ошибка: необходимо использовать имя пространства имен (использую название своего .сpp)
Цитата Сообщение от IGPIGP Посмотреть сообщение
* * Application::Run(gcnew Form1());
* *
ошибка: требуется спецификатор типа (использую имя своей формы).

https://dcravey.wordpress.com/... plication/
Отличная ссылка... вставил код в проект - ни одного подчеркивания в редакторе, запустил - 53 ошибки, руки опустились

Добавлено через 6 минут
Причем первая же строка:
C++
1
2
// Create The Connection Object
SQLiteConnection ^db = gcnew SQLiteConnection();
при компиляции выдает, что SQLiteConnection не определен, но в редакторе он определен (ref class System:ata::SQLite::SQLiteConnection)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.07.2015, 09:09
Цитата Сообщение от mAKS74 Посмотреть сообщение
ошибка: необходимо использовать имя пространства имен
Ошибка у кого? При создании проекта визард создания сразу помещает его в собственный неймспейс. По умолчанию, это скромненько, но со вкусом. Имени себя то есть.
Цитата Сообщение от mAKS74 Посмотреть сообщение
ошибка: требуется спецификатор типа (использую имя своей формы).
этого вообще не понял. Какой проект Вы создали?
Цитата Сообщение от mAKS74 Посмотреть сообщение
Отличная ссылка...
Хех... Я же говорил, что в C++/cli это героический путь, в данном разе. Ну что же. Безумству храбрых поём мы соответствующую песню.
0
2 / 2 / 0
Регистрация: 18.07.2015
Сообщений: 47
27.07.2015, 09:17
Цитата Сообщение от IGPIGP Посмотреть сообщение
Какой проект Вы создали?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// main.cpp: главный файл проекта.
#include "stdafx.h" // ошибка, не удается открыть источник
#include "MyForm.h"
 
using namespace main; //ошибка, необходимо использовать имя пространства имен
 
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
    // Включение визуальных эффектов Windows XP до создания каких-либо элементов управления
    Application::EnableVisualStyles(); //ошибка, имя, закоторым соедует выражение :: должно определять класс или пространство имен
    Application::SetCompatibleTextRenderingDefault(false); 
 
    // Создание главного окна и его запуск
    Application::Run(gcnew MyForm()); //ошибка: требуется спецификатор типа
    return 0;
}
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.07.2015, 09:22
Цитата Сообщение от mAKS74 Посмотреть сообщение
Код C++
Создайте проект мастером: Visual C++ -> Winows Forms и посмотрите что получится. Вообще, если то что Вы делаете не учёба, а как-то связано со сроками, советую придумать что-то другое. C++/cli придётся учить с нуля. Профит в случае с sqllite достаточно сомнительный. Оно Вам надо?
0
2 / 2 / 0
Регистрация: 18.07.2015
Сообщений: 47
27.07.2015, 09:40
Цитата Сообщение от IGPIGP Посмотреть сообщение
Проект мастером. Visual C++ -> Winows Forms и посмотрите что получится
Вы имеете в виду не CLR, а Win32 создать проект? Так там страшный WIN32 API и, главное, почему-то нет конструктора.
Гм.. не учеба и не сроки, так - хобби. Ок, будем рыть дальше.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.07.2015, 09:49
Цитата Сообщение от mAKS74 Посмотреть сообщение
Вы имеете в виду не CLR,
Нет. Вы можете (если боитесь страшного API/MFC) сделать создать->-проект->visual С++->CLR->windows forms
но если на шаге visual С++ сразу выбрать windows forms то будет то же самое так как windows forms это только управляемый C++ и никак иначе. Впрочем, я вошёл в тему по вопросу о хедэрах, а выяснилось, что Вы еще хелловорд в форме не написали, а сразу решили использовать сторонние библиотеки. Посему не вижу чем ещё могу помочь. Всего хорошего.
Цитата Сообщение от mAKS74 Посмотреть сообщение
Ок, будем рыть дальше.
Успехов.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
27.07.2015, 09:52
mAKS74, а вы подключили дополнительные зависимости(ссылки)?
0
2 / 2 / 0
Регистрация: 18.07.2015
Сообщений: 47
27.07.2015, 09:56
Цитата Сообщение от IGPIGP Посмотреть сообщение
сделать создать->-проект->visual С++->CLR->windows forms
Типичная ситуация. У меня нет такого выбора: только Библиотека классов, Консольное приложение CLR и Пустой проект CLR (VS Express 2013 для Desktop), поэтому и подумал, что не CLR. Hello world писал, не злитесь
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
27.07.2015, 10:01
Цитата Сообщение от mAKS74 Посмотреть сообщение
(VS Express 2013 для Desktop)
В новых версиях VS по-умолчанию нет шаблона для C++/CLI WF,так что делайте вручную:
Создание графического приложения (Windows Forms) в Visual Studio
0
2 / 2 / 0
Регистрация: 18.07.2015
Сообщений: 47
27.07.2015, 10:14
S_el, я изначально использовал метод с включением sqlite3.c и sqlite3.h из sqlite-amalgamation. Все получилось, есть возможность работы с БД, но там возникают определенные трудности, о которых мельком выше сказал - почему-то невозможно включить функцию callBack (sqlite3_exec(db, callDB, callBack, 0, &zErrMsg); ) в тело класса формы и приходится выносить ее в основной .cpp. Но из основного .cpp не могу получить контроль над элементами формы (combobox, в частности). Даже если я передам значение строки в специально созданный метод в форме, то и оттуда я почему-то не могу передать строку в combobox.
Если речь идет о вот этом методе https://dcravey.wordpress.com/... plication/, то да - в ссылках подключен System.Data.SQLite.dll

Добавлено через 7 минут
Цитата Сообщение от S_el Посмотреть сообщение
В новых версиях VS по-умолчанию нет шаблона для C++/CLI WF,так что делайте вручную
это да, именно так и сделал
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.07.2015, 10:49
mAKS74, вот наскоро 2 примера. один нарушает инкапсуляцию, так как передаёт контроль над членом на сторону. Лучше всего чтобы контроль оставался в форме так как событийно она и есть владелец всего происходящего. Тестбокс выбран для простоты. Принцип, я думаю, понятен.
Вложения
Тип файла: zip winFormHeaderCpp.zip (3.10 Мб, 3 просмотров)
1
2 / 2 / 0
Регистрация: 18.07.2015
Сообщений: 47
27.07.2015, 20:42
Может кому-то будет полезно.
Подключение SQLite к вот этому проекту, вот этим методом (спасибо IGPIGP за наводку).
VS Express 2013 для Desktop, Windows 7 x64.

1. Скачиваем и распаковываем путем установки вот эту плюху.
2. В папку проекта бросаем три файла из установленной плюхи (располагаются в - ...место установки\System.Data.SQLite\2012\bin\): System.Data.SQLite.dll, System.Data.SQLite.pdb и System.Data.SQLite.dll.config.
4. В папку проекта DEBUG оттуда же добавляем SQLite.Interop.dll и SQLite.Interop.pdb.
5. В свойствах проекта добавляем ссылку на System.Data.SQLite.dll (ту, которая в папке проекта).
6. Вставляем код, предлагаемый англоязычным коллегой, не забыв про
C++
1
2
using namespace System::Data::SQLite;
using namespace System::Text;
На все его бла-бла насчет Configuration File (app.config) не обращаем никакого внимания.
Важный момент, отнявший у меня 12 часов времени и три огнетушителя - если вы установили System.Data.SQLite x64, то файлы SQLite.Interop.dll и SQLite.Interop.pdb должны быть взяты из x86-версии.

Посмотрим насколько такой вариант удобней подключения с использованием sqlite-amalgamation.
1
2 / 2 / 0
Регистрация: 18.07.2015
Сообщений: 47
29.07.2015, 12:43
Посмотрел. Прощай кириллица. В топку.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Принцип, я думаю, понятен
Да, принцип понятен и... не годен. Там внешняя функция вызывается изнутри с передачей нужного объекта формы.
В вышеупомянутую callBack невозможно передать ничего лишнего... Нашел решение с другой стороны. Теперь могу делать все по Вашему совету внутри формы, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.07.2015, 12:43
Помогаю со студенческими работами здесь

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

Как сделать данный код нормальным?
В общем написал код ... но он оказался уж очень галимым((( вот он using System; namespace laba2 { class Program { ...

Плохой калькулятор: как его сделать нормальным? (улучшить код)
Как его сделать нормальным ? :cry: #include &lt;functional&gt; #include &lt;iostream&gt; #include &lt;sstream&gt; #include &lt;string&gt; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru