Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » FAQ по Borland C++ Builder

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

Открыть новую тему     Написать ответ в эту тему

greenfox



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OdesitVadim

Цитата:
if (Col==3) StringGrid1->Canvas->Pen->Color = clRed; else StringGrid1->Canvas->Pen->Color = clBlack;  
посмотрел я этот вариант - к сожалению для типа TStringGrig такое похоже не прокатит Я у него не нашёл таких свойств... это у DrawGrid есть такое...
 
 
Ещё хотел спросить:
1. В паблике формы объявляется переменная
Код:
public:  
int i = 1;
и присваевается ей нач.значение - а бюлдер пишет что ошибка... если убрать присвоение нач.знач - то всё ок - где грабли!?
2. Есть форма, в настройках стоит что бы при появлении она рисовалась по центру родительской. Так и происходит, но! Только в первый раз - те первый раз она действительно вылазит по центру родит.формы, но если потом её закрыть, передвинуть родит. форму и снова вызвать дочернюю - то она вылазит на прежнем месте (где показалась в первый раз) - как пофиксить!?
3. Хочу вынести некоторый участок в функцию - в ней будет обращение к разным формам в проекте - как более грамотно сделать? Те где (в каком участке) объявить её и как прописать, что бы операторы из это функции могли обращаться к переменным в разных формах!?


----------
Три вещи вечны: смерть, налоги и потеря данных...

Всего записей: 4139 | Зарегистр. 29-07-2003 | Отправлено: 10:56 20-06-2005
dan2k5



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
public:  
int i = 1;

 
В классе нельзя инициализировать переменные, ипользуй инициалицию в конструкторе.

Всего записей: 190 | Зарегистр. 14-06-2005 | Отправлено: 21:21 20-06-2005
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
greenfox
Canvas у TStringGrid есть, т.к. она наследник TCustomControl
 
2. Форма позиционируется только при создании. Твоя дочерняя форма видимо создается один раз, автоматически при запуске приложения. Создавай её динамически.

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 21:50 20-06-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
greenfox

Цитата:
посмотрел я этот вариант - к сожалению для типа TStringGrig такое похоже не прокатит  Я у него не нашёл таких свойств... это у DrawGrid есть такое...

Смотри событие OnDrawCell. Сам точно знаю, что будет работать, делал не один раз.
Попробуй (Sender as TDrawGrid) и далее с ним работать. Хотя и напрямую должно работать.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3931 | Зарегистр. 29-07-2003 | Отправлено: 02:05 21-06-2005
greenfox



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dan2k5

Цитата:
В классе нельзя инициализировать переменные, ипользуй инициалицию в конструкторе.
да, странно... я вроде как читал в учебнике дпо С++ что можно... наверно что-то попутал...    
 
EZH

Цитата:
2. Форма позиционируется только при создании. Твоя дочерняя форма видимо создается один раз, автоматически при запуске приложения. Создавай её динамически.
прошу прощения за ламерсикй вопрос - а это как? Насколько я понимаю методом close() она только закрывается, а создаётся при создании всегоприложения (ну по умолчанию, вызываю я её show())!? Впринципе я конечно могу вызывать show() а потом просто мнять координаты окна в зависимости от того где родительская форма расположена - но может можно как попроще...
 
ShIvADeSt

Цитата:
Смотри событие OnDrawCell. Сам точно знаю, что будет работать, делал не один раз.
да я туда в общем то и пихал {StringGrid1->Canvas->Pen->Color = clRed} но что-то всё равно цвет не менялся... Пороюсь конечно ещё в справке на TCustomControl - может что откопаю...
 
 


----------
Три вещи вечны: смерть, налоги и потеря данных...

Всего записей: 4139 | Зарегистр. 29-07-2003 | Отправлено: 14:38 21-06-2005 | Исправлено: greenfox, 14:49 21-06-2005
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
greenfox
Значит она у тебя точно создается автоматически. Залезь в свойства проекта - там есть два списка форм - имеющиеся и автоматически создаваемые. Убери нужную форму из автоматических.
 
Потом в коде главной формы пиши примерно по такому образцу:

Код:
 
TFrmAbout *frmAbout = new TFrmAbout(this);
try
{
  if (frmAbout->ShowModal()==mrOk)
  {
     // ...
  }
}
__finally { delete frmAbout; }
 

 
Это пример для модального открытия формы, можно просто Show(). Здесь после нажатия на OK/Отмена в дочерней форме (либо в OnClick пишется ModalResult = mrOk/mrCancel, либо у TButton задают ModalResult) форма удаляется. Так что все данные с неё ты должен считать внутри try/finally. Перед Show на форме можно проставить какие-то данные.

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 14:48 21-06-2005
greenfox



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EZH
суть метода ясна, но проблема в том, что при уничтожении\создании формы все переключатели на ней автоматом будут установлены в дефолтовое положение (наск я понял) - а у меня программа оттуда некоторые значения берёт (наверно неоптимально\направильно - но вот так вот я накодил ) Так что наверно мне будет проще show() а потом координаты окна править ...  
+ ещё вопрос по том методу что ты описал - а если мне надо после нажатия кнопки ОК сначало считать данные с формы а потом её закрыть - это как будет выглядеть!?

----------
Три вещи вечны: смерть, налоги и потеря данных...

Всего записей: 4139 | Зарегистр. 29-07-2003 | Отправлено: 14:58 21-06-2005
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
greenfox
Так ты и должен всё считать внути if (...), притом только если нажали OK, а форма удаляется только аж при delete frmAbout, до этого она доступна со всеми своими методами и свойствами.
 
По поводу считывания с формы - я ж тебе об этом и пишу. Хорошим стилем программирования считается хранить все данные отдельно от представления. Т.е. ты должен создавать свои какие-то структуры/классы, где и будешь хранить все рабочие данные. Перед вызовом формы надо устанавливать все её контролы из этих структур в нужное состояние, затем ShowModal, если юзер нажал OK, тогда считываешь инфу обратно в рабочую структуру, иначе ничего не считываешь.  
 
По началу может показаться заморочено, но на самом деле надо себя приучить к такому и в проектах всё будет четко и понятно, не будет бардака.

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 15:13 21-06-2005 | Исправлено: EZH, 15:15 21-06-2005
greenfox



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EZH
что то лыжи не едут
в главной форме пишу
Код:
 
TFormPrimers *FormPrimers = new TFormPrimers(this);
try {FormPrimers->ShowModal();}
 __finally { delete FormPrimers;}  

соответственно в форме FormPrimers при нажатии на кнопку ок (она там одна)
Код:
 
FormPrimers->Close();  
и что-то с ошибкой вываливается...

----------
Три вещи вечны: смерть, налоги и потеря данных...

Всего записей: 4139 | Зарегистр. 29-07-2003 | Отправлено: 16:03 21-06-2005
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
greenfox
Не надо Close, пиши просто ModalResult = mrOk или у кнопки такое свойство выставь.
 
Добавлено:
Ошибки в след раз цитируй.

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 16:43 21-06-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
greenfox
У StringGrid надо DefaultDrawing в False скинуть, тогда будет данное событие обрабатываться.

Цитата:
 
When DefaultDrawing is False, the cells should be painted using the DrawCell method. For TCustomGrid, DrawCell is an abstract method. Descendants of TCustomGrid use DrawCell to provide their own customized drawing code, or to generate an OnDrawCell event.
 



----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3931 | Зарегистр. 29-07-2003 | Отправлено: 01:41 22-06-2005
greenfox



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EZH
понял, спасибо.
 
ShIvADeSt

Цитата:
У StringGrid надо DefaultDrawing в False скинуть, тогда будет данное событие обрабатываться
нарисовал такое
Код:
 
//установлено StringGridErr->DefaultDrawing = false в проекте;
AnsiString S = StringGridErr->Cells[i][2];
if (i == 2){StringGridErr->Canvas->Font->Color = clRed;}
        else {StringGridErr->Canvas->Font->Color = clBlack;}
StringGridErr->Canvas->TextOut(Rect.Right-2-StringGrid->Canvas->TextWidth(S),Rect.Top+2,S);
те типа если столбец второй, то его в красный разукрасить... И облом - вообще не рисует ничего. Наверно всё же у меня слишком руки кривые пока для таких вещей...  

----------
Три вещи вечны: смерть, налоги и потеря данных...

Всего записей: 4139 | Зарегистр. 29-07-2003 | Отправлено: 13:06 22-06-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
greenfox
вот рабочий пример. DefaultDrawing в фалсе.

Цитата:
 
procedure TForm1.BitBtn1Click(Sender: TObject);
var     i:integer;
begin
     for i:=1 to 4 do StringGrid1.Cells[2,i]:='qqqqqqq';
     StringGrid1.Update;
end;
 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
      StringGrid1.Canvas.Font.Color:=clRed;
      StringGrid1.Canvas.Brush.Color:=clBlue;
      StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]);
end;
 

У меня есть подозрение, что была ошибка как у меня вначале, текст рисовался за пределами ячейки. В общем вначал мой кусок попробуй 100% рабочий, потом свой подгони.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3931 | Зарегистр. 29-07-2003 | Отправлено: 02:26 23-06-2005
greenfox



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
угу, за пример спасибо... как доберусь до програмулины сразу потестю его.
 
 
Ещё хотел спросить: как лучше функцию вынести - как метод одной из форм (те в заголовочном файле её описать) или в самом уже проектном файле (cpp) написать!? А то в первом варианте мне в этот метод не получается например засунуть некоторые операторы из другой формы, а во втором не могу правильно её определить - компилятор ругается ...

----------
Три вещи вечны: смерть, налоги и потеря данных...

Всего записей: 4139 | Зарегистр. 29-07-2003 | Отправлено: 10:56 27-06-2005
IGELSrus

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Люди добрые, помогите бедному ламеру...  
делаю программку в билдере: на экране образ клавиатуры, так вот как сделать чтобы после клика по кнопке она(кнопка) меняла цвет. Просмотрел свойства всех кнопок нигде цвета фона кнопки нет. Помогите кто сталкивался.

Всего записей: 3 | Зарегистр. 28-06-2005 | Отправлено: 08:05 28-06-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
IGELSrus
Цвет кнопки не меняется по умолчанию. Если тебе надо, чтобы кнопка меняла свой цвет, то  
1. Сам создавай кнопки с Owner Draw стилем и рисуй их как тебе надо
2. Используй TImage для имитации кнопок и грузи на нем нужную картинку с фоном который тебе нужен.
3. Используй TPanel у нее можно менять цвет, она имеет Caption и может быть выпуклой и вогнутой. Отслеживай события нажатия на клавиши в самой форме KeyPreview установи в true и следи за событием OnKeyDown OnKeyUp самой формы, и в зависимости от нажатой клавиши меняй свойства соответсвущей панели на Raised Или Lowered. Одновременно закрашивая ее в нужный цвет.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3931 | Зарегистр. 29-07-2003 | Отправлено: 01:55 29-06-2005
greenfox



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
при перекомпиляции программы она начала выдавать ошибку что мол класс TPanel (для примера) не найден и всё такое... После нескольких манипуляций выяснилось что мешают временные файлы проекта (*.~*) C чем подобные случаи могут быть связаны? Может где галочку надо поставить\убрать что бы он бюлдер сам чистил\правил!? Или это нормальная ситуация что билдер иногда так себя ведёт!?

----------
Три вещи вечны: смерть, налоги и потеря данных...

Всего записей: 4139 | Зарегистр. 29-07-2003 | Отправлено: 10:14 30-06-2005
IGELSrus

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Тогда по поводу создания кнопок, где найти туториал по этой теме.

Всего записей: 3 | Зарегистр. 28-06-2005 | Отправлено: 15:07 01-07-2005
greenfox



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А можно как готвый проект перенести на PoketPC!? (ну хотя бы на уровне уже исполн кода)

----------
Три вещи вечны: смерть, налоги и потеря данных...

Всего записей: 4139 | Зарегистр. 29-07-2003 | Отправлено: 16:34 01-07-2005
Darl

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
IGELSrus
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    FillRect(GetDC(((TButton *)Sender)->Handle), &(((TButton *)Sender)->ClientRect),
        (HBRUSH)CreateSolidBrush(clRed));
}
 
Best regards





Прекращаем писать Best Regards внизу, согласно правилам запрещена имитация подписи.

Всего записей: 139 | Зарегистр. 10-07-2002 | Отправлено: 02:02 02-07-2005 | Исправлено: ShIvADeSt, 10:15 02-07-2005
Открыть новую тему     Написать ответ в эту тему

Страницы: 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

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » FAQ по Borland C++ Builder

Имя:
Пароль:
Сообщение

Для вставки имени, кликните на нем.

Опции сообщенияДобавить свою подпись
Подписаться на получение ответов по e-mail
Добавить тему в личные закладки
Разрешить смайлики?
Запретить коды


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2018

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru