(Часть 2) Я начинающий, подскажите пожалуйста как...
Прежде чем задать вопрос здесь, вы обязаны использовать
- Поиск по форуму, используя ключевые слова из вашего вопроса. Как правильно использовать поиск - читайте здесь
- Список наиболее часто задаваемых вопросов (FAQ)
- Поиск по предыдущей теме
Кроме того, прежде чем размещать сообщение, ознакомьтесь с правилами.
При размещении вопросов начинающих помимо указанной темы, будет выдаваться нарушение, а тема удаляться.
Обнаружил "особенность" совсем недавно.
Собственно проблема:
При разработке проекта, прототипы фунций складываем в хедер, а реализацию в сишник.
В последствии, к проекту присоединяем сишник, а хедер включаем в необходимое место с помощью директивы препроцессора #include...
Раньше всегда такие отдельные библиотечки (C файл реализации + хедер), размещал в одной папке с проектом. Все линковалось замечательно.
Но вот недавно, проект у меня лежал на одном диске, а библиотечка в на другом диске. Настроил я в опциях проекта пути. Добавил библиотечный Сшник к проекту... Включил хедер с помощью #include...
А компилятор ругается... Не хочет линковать проект. Пишет про библиотечные функции, что мол "Unresolved extrnal бла-бла-бла...".
Стоит те файлы скинуть в папку проекта и все нормально компилится и линкуется...
Я не пойму, что за фигня? Ведь к примеру те же самые стандартные Сишные библиотеки типа math.h тоже лежат в удаленной папке и для сборки их не нужно кидать в папку проекта. А со своими файлами вот такая фигня...
Может я неправильно пути настраиваю? Помогите разобратся...
Да... Забыл уточнить, что такая фигня происходит только с файлами с Сишными расширениями (*.h и *.c) соответственно. С С++ файлами (*.hpp и *.cpp) все компилится и линкуется во всех случаях.
Далее в Project->Add to project... включил в проект Сишник с реализацией, а к модулю, где я использую функции из этого сишника, подключил хедер, через #include <mylib.h>
Билдер все вроде и компилит и в автозаполнении кода подсказывает согласно прототипам функций из хедера. А вот при линковке пишет, что "Unresolved extrnal название_функции() бла-бла-бла...".
Причем в удаленной папочке и .obj файл появляется... А вот линковка не проходит.
TWriter *wrA = new TWriter(stA,512);
AnsiString aux = " Test String 1234567890";
int c = aux.Length();
wrA->WriteInteger(c);
wrA->WriteStr(aux);
delete wrA;
delete stA;
обьясните плиз , вот такой код
запись в файл числа и строки
содержимое файла:
ТРИ байта числа и затем текстовая строка:confused:
вопрос куда делся четвертый байт
Мне бы подтверждение данного факта получить хотя бы. В лучшем случае разрешить проблему.
Теперь по поводу записи в файл.
Вы файл просматриваете в текстовом редакторе? Посмотрите в HEXе. Все байты там наверняка будут.
просто класс как то оригинально числа в файл записывает , в зависимости от значения числа, число байт может быть различно
2 Gigahard
может быть забыли какой то файл к проекту добавить ?
специально сейчас раскидал исходники проги по разным дискам
затем добавил все файлы в проект , нормально компилит
2. Исходники с расширениями .h и .c? Билдер именно 6й?
У меня нормально компилит и линкует только если файлы с с++ расширениями, т.е .hpp и .cpp
А вот с Сишными расширениями (.h и .c), не линкуется :( Может потому что проект изначально как C++ объявлен?
Пробовал вставлять и в DrawItem , и в FormCreate реакции 0 В чем я ошибся?
2. Исходники с расширениями .h и .c?
1. разобрался , именно так он и их пишет
2. Я немного поторопился , нормально компилятся только .cpp файлы
как не старался нечиего не мог сделать с .h и .c файлами
однако вот так :
файл File1.c на другом диске , а .h - ка в этом случае нафиг не нужна
2. Я проверил версию, что косяк возникает при сборке С++ проекта. Да, действительно, если проект изначально создавался как Си приложение, то удаленные Сишные исходники линкуются без проблем. Если же проект Си++ный, то почему то нет...
А .h нужен. Без него никуда. Там константы и структуры :) А вот файлы .c не инклудятся напрямую. Подключаются к проекту через "Project->Add To Project"
{
#include <myClib.h>
}
Или же в самом хедере с помощью препроцессора, в зависимости от типа проекта, включать строчки extern "C".
Вопрос снят всем спасибо за обсуждение.
Есть Form2 и Form3
Есть функция:
На Form3 есть объект Edit1. Когда я мышкой клацаю на Эдите, то он не выбирается. Если перехожу на него при помощи клавиши "ТАВ", то все нормально.
Что сделать, что бы он без проблем выбирался?
Сударь - это вы о моем коде? Как по мне, так все замечательно, единственная проблемы только с Эдитом, а все остальные компоненты работают как надо.
Есть Form2 и Form3
Есть функция:
Form2, Form3 - это классы или экземпляры классов?
Меня как и Washington'а терзают сомнения...
Или есть другие варианты?
Меня как и Washington'а терзают сомнения...
Эмм... собственно то поэтому поводу сомнения не терзают. Раз автору удалось скомпилить строку
это явно экзэмпляры. :)
это явно экзэмпляры. :)
После такого топика, я понимаю, что "экземпляр" реально я!!! :)
Отвечайте, пожалуйста, поподробнее, с примером.
Заранее спасибо за ответы.
обработать событие OnDrawCell
пример - см. картинку
[COLOR="Gray"]код напишешь сам, обнаглели вконец[/COLOR]
Мой код не даёт никакого результата.
TRect &Rect, TGridDrawState State)
{
if(ACol==4&&sg_Table->Cells[ACol][ARow]=="0")
sg_Table->Canvas->Font->Color=clRed;
}
#include <stdlib.h>
#include <string.h>
#include <iostream.h>
#pragma hdrstop
class Person
{
private:
int number;
char * fio;
int pol;
double age;
Person() { number = 0; fio = ""; pol = 0; age = 0; };
public:
Person(int _number, char * _fio, int _pol, double _age);
void Print();
};
Person::Person(int _number, char * _fio, int _pol, double _age)
{
this->number = _number;
::strcpy(this->fio, _fio);
this->pol = _pol;
this->age = _age;
}
void Person::Print()
{
cout <<"Number: "<<number<<endl;
cout <<"Name: "<<fio<<endl;
cout <<"Sex: "<<pol<<endl;
cout <<"Age: "<<age<<endl;
}
#pragma argsused
int main()
{
Person P(1, "Ivanov F.D.", 0, 34);
P.Print();
Person *P3 = new Person(1, "Petrov D.A.", 0, 31); // здесь появляется ошибка
}
Полагаю что вот из-за чего:
{
// ...
::strcpy(this->fio, _fio);
// ...
}
Вы пытаетесь записать строку по указателю, который до этого не был проинициализирован, и соответственно указывает неизвестно куда - скорее всего, на какую-то область памяти, не принадлежащую программе, и к которой она соответственно не имеет доступа. Необходимо проинициализировать указатель, причем выделить для записываемой строки достаточно места:
{
// ...
this->fio = new char[::strlen(_fio) + 1];
::strcpy(this->fio, _fio);
// ...
}
P.S. Какая-то странная у Вас манера вызывать в конструкторе переменные класса через this... Неужели в Билдере нельзя обращаться к переменным класса напрямую? Вот так например:
{
// ...
fio = new char[::strlen(_fio) + 1];
::strcpy(fio, _fio);
// ...
}
не могу, он на (ахтунъг!) Delphi а тема по билдер. Уберите св-во DefaultDrawing и рисуйте текст самостоятельно, см. исходники TStringGrid.
есть компонент TSringGrid - таблица
нужно как то отлавливать момент когда пользователь мышкой изменяет размеры ячеек - ширину столбцов или высоту строк
есть компонент TSringGrid - таблица
нужно как то отлавливать момент когда пользователь мышкой изменяет размеры ячеек - ширину столбцов или высоту строк
Если в тупую ... замечено, что при нажатии левой кнопки мыши на сетке в шапке грида (режим изменения размера) OnMousedown не происходит (в отличие от OnMouseUp).
1. Заводишь флаг для нажатия левой кнопки мыши, ставишь его в false,
2. в OnMousedown ставишь его в true,
3. а в OnMouseUp проверяешь флаг true - нажали хзгде, флаг false нажали(отпустили) при изменении размера колонки,
4. флаг обратно в false
и т.д.
У меня для 2009-го так прокатывает, но это так сказать студенческий вариант или метод тыка (кому как удобней) А по=хорошему надо исходнички посмотреть как там все организовано, но это уже тебе д/з.
есть компонент TSringGrid - таблица
нужно как то отлавливать момент когда пользователь мышкой изменяет размеры ячеек - ширину столбцов или высоту строк
можно сделать обработчик сообщения WM_PAINT в котором проверять старые размеры (предварительно запомненные) с текущими, и если различаются, то вызывать свой самописный обработчик этого события.
А по=хорошему надо исходнички посмотреть как там все организовано, но это уже тебе д/з.
тогда уж совсем тупой вопрос , а где их взять ?
в Grids.hpp одни обьявления классов , а куда аффторы быдлера дели реализацию я так и не нашел
в Grids.hpp одни обьявления классов , а куда аффторы быдлера дели реализацию я так и не нашел
см. файлы с расширением *.pas
Пытаюсь открыть файл на запись в консольном приложении:
#include <iostream.h>
#pragma argsused
using namespace std;
int main()
{
char* filename = "y:\temp\list.txt";
FILE *in;
in = fopen (filename, "wt");
if (in == 0) {
cout << "File not found !!!" << endl;
fclose(in);
}
fputs( "string", in );
fclose(in);
}
При выполнении вылетает с ошибкой:
First chance exception at $75CE42EB. Exception class EAccessViolation with message 'Access Violation'. Process Project3.exe (4768)
Извините, уже решилось
Пытаюсь открыть файл на запись в консольном приложении:
#include <iostream.h>
#pragma argsused
using namespace std;
int main()
{
char* filename = "y:\temp\list.txt";
FILE *in;
in = fopen (filename, "wt");
if (in == 0) {
cout << "File not found !!!" << endl;
fclose(in);
return 1;
}
fputs( "string", in );
fclose(in);
}
имхо, вот так вернее
Подскажите пожалуйста, есть ли возможность передать подобной функции (func) в качестве параметра элемент структуры?
Как альтернативу рассматриваю двухмерный массив, но хотелось бы массивом из структур.
{
int i = 0;
while (i < n) {
M./*элемент структуры*/ = "a";
i += 1;
}
}
void main()
{
struct prop {
int type;
AnsiString name;
};
int n = 100;
prop M[n];
func(/*элемент структуры (например name)*/, M, n);
}
Заранее спасибо!
Подскажите пожалуйста, есть ли возможность передать подобной функции (func) в качестве параметра элемент структуры?
Как альтернативу рассматриваю двухмерный массив, но хотелось бы массивом из структур.
В данном контексте нет.
Подскажите пожалуйста как получить сведения возвращаемые функцией NetFileEnum.
В MSDN сказано что функция возвращает определенный набор сведений в зависимости от указанного значения, я указал "3" и предполагаю, что функция вернет значения в виде структуры _FILE_INFO_3.
Пока не смог найти примера получения данных возвращаемых этой функцией.
Вот функция:
{
LMSTR serv = "\\\\localhost";
LMSTR path = "Users\\user\\Documents";
LPBYTE* buf
LPDWORD num;
LPDWORD totalnum;
NetFileEnum(serv, path, NULL, 3, buf, MAX_PREFERRED_LENGTH, num, totalnum, NULL);
NetApiBufferFree(buf);
}
Cтруктура _FILE_INFO_3 (из MSDN):
DWORD fi3_id;
DWORD fi3_permissions;
DWORD fi3_num_locks;
LMSTR fi3_pathname;
LMSTR fi3_username;
} FILE_INFO_3,
*PFILE_INFO_3,
*LPFILE_INFO_3;
Подскажите пожалуйста как получить сведения возвращаемые функцией NetFileEnum.
В MSDN сказано что функция возвращает определенный набор сведений в зависимости от указанного значения, я указал "3" и предполагаю, что функция вернет значения в виде структуры _FILE_INFO_3.
Пока не смог найти примера получения данных возвращаемых этой функцией.
В MSDN есть пример (правда в нем сказано что для систем Windows 95/98/Me, и в нем используется структура file_info_50, но может нактолкнет на мысль как вам нужно с этой функцией работать):
http://msdn.microsoft.com/en-us/library/bb720835.aspx
Пример помог, отчасти, Чтобы узнать какое значение вернула функция (насколько успешно выполнилась) надо создать переменную типа NET_API_STATUS и ей присвоить значение, возвращаемое функцией NetFileEnum.
при компиляции возникает ошибка: Cell не является членом класса TMainForm. причем в методах класса, которые используют Сell (TMainForm дружественный для этого класса)
курю гугл. безрезультатно.
извините, если подобный вопрос уже задавали, но поиск мне ничего не дал. если эта проблема уже обсуждалась, дайте, пожалуйста ссылку. буду очень благодарна.