(Часть 1) (*Закрыта*)Я начинающий, подскажите пожалуйста, как...
Если вы только начинаете осваивать среду разработки ВСВ - предлагаю возникающие вопросы размещать в данной теме. Не создавайте пожалуста отдельные темы - типа "Как мне запустить свое приложение на другом компьютере", "Как перевести String в char*" и тому подобное. Такие темы будут закрываться с отсылку в эту. Не обижайтесь.
Кроме того, не брезгуйте плиз, пользоваться поиском хотя бы, по нескольким критериям. Иногда бывает так, вопрос который возник у вас не столь оригинален - вполне возможно, кто то уже спрашивал его до вас :) Поверьте, отвечать на одни и теже вопросы тоже не всегда интересно.
Если вы задаете свой вопрос на форуме - что бы получить наиболее эффективный ответ - следуйте пожалуйста несложным правилам. Они просты:
0. Опишите чего вы хотели добиться.
1. Опишите ошибку которая у вас возникла, по возможности с текстом самой ошибки.
2. Если вы считаете это необходимым - приведите фрагмент(пожалуста не помещайте в свой вопрос весь листинг) кода, на который жалуется компилятор, коротко описав переменные которые используются, и как они инициализируются. Исходники высылайте или выкладывайте только в том случае, если вас об этом просят.
3. Если проблема связана с функцией какой либо библиотеки - не стесняйтесь залезть в хелп и найти там ее описание. То чтовы не рубите в английском, зато читаете Рабле в оригинале - отнюдь не оправдание. Людей для которых английский - родной, здесь немного. Пользуйтесь словарем, это дает результаты :)
4. Не забывайте - может быть ВСВ и имеет раширения по сравнению со стандартом - но тем не менее это С++. Не забывайте проверить, что в ваш проект подключены все необходимые заголовочные файлы, а так же файлы библиотек.
5. Если вы задали вопрос один раз - не нужно его повторять или дублировать, или размещать посты типа "Ну что никто не знает" и т.д. Вы рискуете узнать много разных путей, но так и не получить нужный вам ответ.
6. Форум - дело сугубо добровольное. Здесь ни кто НЕ ОБЯЗАН искать ответы на ваши вопросы. Если вам отвечают - то это только исключительно из любви к вам. :)
7. Исходя из выше сказанного, если вам не отвечают - ну возможно вас не любят :)
8. Для тех, кому нужно написать курсовую, программу, решить контрольную или тому подобное - существует раздел форума Студентам
Размещайте, плиз, свои посты там. Сообщения размещенные в данной теме - не будут перемещаться - они будут удаляться.
9. Если вы хотите пообщаться, обсудить тему, не связанную с ВСВ - милости просим: В "Отдохнем". Флуд в данном разделе не приветствуется.
Ну вроде все. Если что забыл - или не так - поправьте.
Удачи.
Объясни мне пожалуйста по подробнее как ее описать. У меня не получается он выдаёт ту же ошибку.
Желательно пример кода выложить если не трудно.
если:
то компилятор выдаёт ошибку
Перелопатил всю справку в Билдере так и не понял как этого сделать.
В поиск то же не отпраляйте, трудновато просмотреть 76 страниц.... :(
#include <string> .... std::string FName;
#include <vcl.h>
#include<string.h>
#pragma hdrstop
#include "GlForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int flag;
AnsiString FName;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FileNewExecute(TObject *Sender)
{
if (RichEdit1->Modified)
{
flag=MessageDlg("ñîõðàíèòü èçìåíåíèÿ?",mtConfirmation,mbYesNoCancel,0);
if (flag == mrNo)
{
Form1->Caption="Untitled";
RichEdit1->Lines->Clear();
RichEdit1->Modified = False;
FName="";
}
if (flag == mrYes)
{
saveClick ();
Form1->Caption="Untitled";
RichEdit1->Lines->Clear();
RichEdit1->Modified = False;
FName="";
}
}
else
{
Form1->Caption ="Untitled";
RichEdit1->Lines->Clear();
RichEdit1->Modified = False;
FName="";
}
}
//---------------------------------------------------------------------------
Вот ошибки какие он мне выдает:
[C++ Error] GlForm.cpp(36): E2247 'TComponent::FName' is not accessible
[C++ Error] GlForm.cpp(44): E2247 'TComponent::FName' is not accessible
[C++ Error] GlForm.cpp(44): E2247 'TComponent::FName' is not accessible
[C++ Error] GlForm.cpp(52): E2247 'TComponent::FName' is not accessible
[C++ Error] GlForm.cpp(52): E2247 'TComponent::FName' is not accessible
Я рад что тебе весело... Но мне как-то не очень. Я нечто похожее (в общем процедура была той же) писал на Делфях, там у меня никаких проблем не было. Да и в С никогда их не было пока не столкнулся со строками...
2 GIZMO Пробовал как посоветовал ты, но результат тот же один в один...
Извиняюсь конечно, я тоже ламер еще тот, но я всегда использовал AnsiString, и никогда проблем не было. Более того никогда не возникало необходимости использовать именно string. Чем этот тип лучше?
Мой совет таков: убери строку
И переменную FName задекларируй как:
Что мы имеем?
Мы имеем глобальную переменную FName и закрытое поле базового класса FName. Естественно, по всем законам ООП, компилятор в методе класса видит только поле, и по этим же самым законам не может получить к нему доступ (оно же private)
О чём и сообщает "программисту"
Извиняюсь конечно, я тоже ламер еще тот, но я всегда использовал AnsiString, и никогда проблем не было. Более того никогда не возникало необходимости использовать именно string. Чем этот тип лучше?
Мой совет таков: убери строку
И переменную FName задекларируй как:
Сделал как посоветовал ты, но результат тот же.
Я больше склоняюсь к мнению el scorpio, но есть два НО:
1. Как сказал desivers он ведь не ругается на flag описанный тем же макаром.
2. el scorpio объясни тогда как правильно ее описывать? И вообще где лучше описывать глобальные переменные?
Я именно так у себя всегда описывал глобальные переменные - все работало.
Я вообще ничего не вижу такого, что не дало бы процедуре видеть эту глобальную переменную.
И еще, что это? TComponent::FName. Что за TComponent? Может у тебя на форме лежит какой-нибудь TComponent?
И на всякий случай поменяй имя переменной :)
Легко, объяви ее AnsiString FCaption например и я могу догадаться, что тебе скажет компиллятор...
И еще, что это? TComponent::FName. Что за TComponent? Может у тебя на форме лежит какой-нибудь TComponent?
И на всякий случай поменяй имя переменной :)
У TComponent есть поле FName - TComponent::FName, форма в итоге рождена от TComponent - чего не ясно?
По моему надо только четыре точки поставить перед FName?
::FName="";
Сработал и второй способ с 4-мя точками
2. el scorpio объясни тогда как правильно ее описывать? И вообще где лучше описывать глобальные переменные?
1. Что такое "область видимости" знаете? Их три: глобальная, классовая и локальная. Все имена ищутся сначала в объявлениях внутри функции, затем внутри класса, и только потом среди глобальных.
В данном случае класс УЖЕ имеет идентификатор FName, посему в его методах получить доступ к глобальному объекту с аналогичным именем можно только явно указав "глобальную область видимости" (::Fname). А идентификатора flag в ни в классе TForm1, ни в базовых классах нет, посему доступ к глобальному возможен без уточнения области.
2. Глобальные переменные лучше не описывать ВООБЩЕ - во избежание аналогичных ситуаций. Если требуется что-либо использовать в нескольких методах объекта (в данном случае - форма), то нужно эти данные объявить полями класса
{
published: // Здесь объявлены элементы управления
private: // Здесь расположены закрытые методы и данные
AnsiString FMyName;
protected: // Здесь объявлены методы и данные,
// доступные производным классам
public:: // Здесь объявлены открытые методы и данные
};
вопрос задавался неоднократно. используй поиск.
в чем разница? :cool: Используй sprintf или методы класса AnsiString и поиск по форуму.
S.sprintf("%x \0",'c');
Label1->Caption = S;
А вот есть иакой вопрос:
У меня есть TListView, в котором четыре колонки, у одной колонки есть рисунок в шапке, но он почемуто добавляется в каждую строчку, и мне приходится писать так:
ListView->Items->Item->ImageIndex=-1;
но это меня не устраивает,т.к при выделение остается белый квадрат, что делать?
Если пользователь вводит в табличку StringGrid значения руками, как их потом оттуда считать (я так понимаю, они получатся в виде матрицы) каждое и вывести на экран в виде матрицы?!...
Подскажите, как попроще (без написания новой компоненты или же подскажите готовую компоненту ) сделать, чтобы некий метод, связанный с TrackBar, выполнялся при событии OnMouseUp? А то на OnChange выходит плохо.
Если пользователь вводит в табличку StringGrid значения руками, как их потом оттуда считать (я так понимаю, они получатся в виде матрицы) каждое и вывести на экран в виде матрицы?!...
String Text = StrindGrid1->Cells[Col][Row];
Что-то в таком духе:
CmdLine.c_str(),
NULL,
NULL,
FALSE,
CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS,
NULL,
WorkDir.Length()? WorkDir.c_str() : NULL,
&si,
&pi) == TRUE)
{
WaitForInputIdle(pi.hProcess, INFINITE);
WaitForSingleObject(pi.hProcess, INFINITE);
GetExitCodeProcess(pi.hProcess, &ExitCode);
CloseHandle(pi.hProcess);
}
Можно также воспользоваться поиском:
http://forum.codenet.ru/showthread.php?t=21991&highlight=CreateProcess+ShellExecuteEx
http://forum.codenet.ru/showthread.php?t=20044&highlight=CreateProcess+ShellExecuteEx
http://forum.codenet.ru/showthread.php?t=16108&highlight=CreateProcess+ShellExecuteEx
http://forum.codenet.ru/showthread.php?t=15556&highlight=CreateProcess+ShellExecuteEx
http://forum.codenet.ru/showthread.php?t=16069&highlight=CreateProcess+ShellExecuteEx
http://forum.codenet.ru/showthread.php?t=22455&highlight=CreateProcess+ShellExecuteEx
http://forum.codenet.ru/showthread.php?t=24587&highlight=CreateProcess+ShellExecuteEx
http://forum.codenet.ru/showthread.php?t=26405&highlight=CreateProcess+ShellExecuteEx
http://forum.codenet.ru/showthread.php?t=23867&highlight=CreateProcess+ShellExecuteEx
http://forum.codenet.ru/showthread.php?t=28487&highlight=CreateProcess+ShellExecuteEx
http://forum.codenet.ru/showthread.php?t=28658&highlight=CreateProcess+ShellExecuteEx
http://forum.codenet.ru/showthread.php?t=28745&highlight=CreateProcess+ShellExecuteEx
OnPaint?
В юнит.h добавляю: int Save1 (int start,int end,char * file);
В юнит.cpp пишу:
int Save1(int start,int end,char * file){
int x;
int count=0;
int head;
char * save=new char[end-start+1];
for(x=start;x<end;x++)
{
if(file[x]==0x00)
x++;
save[count]=file[x];
count++;
}
head=FileCreate("exit.bin");
FileWrite(head,save,count);
FileClose(head);
delete [] save;
return count;
}
Функция вызывается раз 20 а потом прога виснет на несколько сек и вываливается без ошибки.Борландовский отладчик выкидывает ошибку и пишет в верхнем левом окошке адрес push 0x0000400 и в правом нижнем 00000000. Что я делаю не так?
можно также попробовать
if(file[x]==0x00)
{x++;
return ;
}
поиск юзай по форуму и будет тебе счастье.
($BCB)\Examples\Apps\ProcView
($BCB)\Examples\Apps\ProcView
я нашел несколько способов отобразить список процессов и пути к их исполняемым файлам отдельно, и список приложений отдельно. проблема в том как бы это объеденить.
1)в одном случае есть хэндлы на процесс и его модули и при помощи функции GetModuleFileNameEx я могу получить путь к файлу.
2)в другом случае есть только хэндл окна приложения.
можно ли используя хэндл окна определить хэндл процесса для этого окна или наоборот, по хэндлу процесса узнать какие ему принадлежат окна?
Для самого допотопного изображения линий квадратиков и прочего, но не считать же вручную координаты точки. Я хочу вывести прямую, но где-то в центре, то есть можно как-нибудь узнать коодрдинаты точки, которая изображена на Form?
рисуй все там. потом задавай смещение по х и у и будет тебе счастье.
Мне, например, понадобилось нарисовать 13 стрелочек на форме. да еще и разнонаправленых, да еще и цвета их менять. Итог
//х - смещение по х
//у - смещение по у
//current - направление стрелки (верх, низ, право, лево)
//color - цвет стрелки
{ TPoint points[7];
switch (current)
{
case up:
points[0] = Point(x+0,y+10);
points[1] = Point(x+10,y+0);
points[2] = Point(x+20,y+10);
points[3] = Point(x+15,y+10);
points[4] = Point(x+15,y+20);
points[5] = Point(x+5,y+20);
points[6] = Point(x+5,y+10);
break;
case down:
points[0] = Point(x+05,y+0);
points[1] = Point(x+15,y+0);
points[2] = Point(x+15,y+10);
points[3] = Point(x+20,y+10);
points[4] = Point(x+10,y+20);
points[5] = Point(x+0,y+10);
points[6] = Point(x+5,y+10);
break;
case left:
points[0] = Point(x+0,y+5);
points[1] = Point(x+10,y+5);
points[2] = Point(x+10,y+0);
points[3] = Point(x+20,y+10);
points[4] = Point(x+10,y+20);
points[5] = Point(x+10,y+15);
points[6] = Point(x+0,y+15);
break;
case right:
points[0] = Point(x+10,y+0);
points[1] = Point(x+10,y+5);
points[2] = Point(x+20,y+5);
points[3] = Point(x+20,y+15);
points[4] = Point(x+10,y+15);
points[5] = Point(x+10,y+20);
points[6] = Point(x+0,y+10);
break;
}
Image2->Canvas->Brush->Color = color;
Image2->Canvas->Polygon(points, 6);
}
если на форме еще разместить два TEdit`а, где задавать х и у и кнопку Button1 по которой эти х и у передадутся той функции, то задача сильно упрощается.
---------------------------
---------------------------
Project Project1.exe raised exception class EDBEngineError with message 'Table does not support this operation because it is not uniquely indexed.'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
Так вот вопрос)) А как ее индексировать?!
Я пишу в первой форме:
void __fastcall TForm1::Button3Click(TObject *Sender)
{Form2->Show();
Form2->Label1->Caption=Form1->Label12->Caption;
}
и во второй:
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
Form2->Label2->Caption=Form2->Label1->Caption;}
первая процедура выводит на экран(во вторую форму),то что хранится в Form1->Label12,
а вторая выводит Caption который был первоначально задан в Label1 (во вторую форму).
т.е (на Form2) значение из Label1 не заносится в Label2,в него заносится первоначальное значение Label1.
Как сделать чтобы все корректно заносилось,помогите пожалуйста, ну просто очень надо
это надо сделать по какому-нибудь событию. Перемести ее например в функцию
void __fastcall TForm1::Button3Click(TObject *Sender)
и все заработает.
Да он и стоит по событию нажатия клавиши.
Там в другом дело:
В первой форме в Label12 заносится значение по нажатию клавиши,после чего открывается другая форма и я хочу передать во вторую форму значение которое занеслось в Label12,а оно не заносится,
вернее когда я в первой форме пишу:
Form2->Label1->Caption=Form1->Label12->Caption;
во второй форме Label1 принимает значение Label12(из второй формы)
НО если я хочу написать:
Form2->Label2->Caption=Form2->Label1->Caption;
в Label2 не будет того значения которое есть в label1 во второй форме, в ем будет первоначальное значение Label1;
И как сделать так чтобы значение из Label12 корректно передалось
во вторую форму я не знаю((((
Постараюсь обьяснить получше:
Суть программы в следующем:
Есть определенные характеристики которые выбирает пользователь,
Пользователь выбирает 3 характеристики,
после этого этот запрос отправляется в БД и по этим трем хар-кам выбирается число, которое затем записывается в Label12(допустим 18)
На первой форме есть кнопка,
По нажатию этой кнопки открывается вторая форма и Я по нажатию этой кнопки хочу взять значенние из Label12(=18) на первой форме и записать в Label1 на второй форме,
в первой форме я пишу(по событию нажатие клавиши):
void __fastcall TForm1::Button3Click(TObject *Sender)
{Form2->Label1->Caption=Form1->Label12->Caption;
Form2->Show();}
во второй форме я пишу:
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
Form2->Label2->Caption=Form2->Label1->Caption;
Form2->label2->Caption=Form2->label1->Caption;}
При запуске программы происходит следующее:
на форме 2 значения становятся такими:
Label1=18
Label2=Label1
А я хочу чтоб Label2=18!и сделать это не могу;
это надо сделать по какому-нибудь событию. Перемести ее например в функцию
void __fastcall TForm1::Button3Click(TObject *Sender)
и все заработает.
Не подскажете ли литературу по сетевому программированию, для начало хотелось бы сделать подобие чата.
Дайте плиз ссылочки!