Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2009, 09:32   #1
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию StringGrid или нет?(С++)

Возник такой вопрос.Нужна форма,для ввода данных в массив.фиксированное количество строк и разное количество столбцов(в зависимости от параметров математической модели).Это просто сделать через StringGrid,но необходимо,чтобы для каждого элемента столбца выпадала менюшка(вроде ComboBox) со списком допустимых значений,а по строкам менюшка оставалась постоянной.Как это лучше реализовать?...(я бы сделал и через ComboBox,но не знаю сколько столбцов может потребоваться...(
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 10.09.2009, 17:56   #2
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
Как это лучше реализовать?...(я бы сделал и через ComboBox,но не знаю сколько столбцов может потребоваться...(
Так и сделай через ComboBox, неважно сколько столбцов/строк.
Просто, по выделенной в данный момент ячейке, загружай в ComboBox определенные данные (допустимые значения) и отображай ComboBox рядом или над этой ячейкой.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 10.09.2009, 23:21   #3
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Надо пробовать,думаю можно сделать появление окошка с боксом по щелчку мыши и выбор....будем стараться)

Возникла проблема с обработчиком правильности ввода данных в StringGrid1:
Код:
String Number;//глобальная переменная
//Встроенный редактор запрашивает значение ячейки
void __fastcall TForm4::StringGrid1SetEditText(TObject *Sender, int ACol,
      int ARow, const AnsiString Value)
{
	Number=Value;//копируем значение ячейки
}
//---------------------------------------------------------------------------
//Получает значение ячейки
void __fastcall TForm4::StringGrid1GetEditText(TObject *Sender, int ACol,
      int ARow, AnsiString &Value)
{
	  if(Value=="+"||Value=="-")//проверка знака
      	{
			Number=Value;
		}
	  else
		{
			try
				{
					if(Value !=" ")//Если не пусто
					{
						StrToFloat(Value);//Делаем попытку преобразования(подразумеваем,что в ячейке должно быть число float
						Number=Value;//запоминаем новое значение
					}
				}

			 catch(...)//Если же не преобразование не удалось перехватываем сообщение об ошибке
				{
					Application->MessageBox("Неверное число","Ошибка",MB_ICONSTOP|MB_OK);//даем сообщение об ошибке
					StringGrid1->Cells[ACol][ARow]=Number;//возвращаем старое значение ячейки
				}
		}
}
//---------------------------------------------------------------------------
Ошибка состоит в том,что сначала выбивает на Break,если жмакаем продолжить,то появляется Сообщение(наше) и опять break,продолжаем,наше сообщение....в общем зацикливается...Что делать?(
Не давай организму поблажки, каждый день тренируй его в шашки..

Последний раз редактировалось Stilet; 16.09.2009 в 09:14.
Скарам вне форума Ответить с цитированием
Старый 16.09.2009, 09:26   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я бы поступил примерно так:
Код:
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow,
		  bool &CanSelect)
{
 TRect r=StringGrid1->CellRect(ACol,ARow);
 ComboBox1->Left=r.left+StringGrid1->Left;
 ComboBox1->Top=r.top+StringGrid1->Top;
 ComboBox1->Width=r.Width();
 ComboBox1->Height=r.Height();
 ComboBox1->Visible=true;
 ComboBox1->DroppedDown=true;
}
Вот только естесственно тут нужно анализировать строку и колонку и наполнять согласно им Комбик.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.09.2009, 19:21   #5
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Насколько я понял combobox не будет выпадать,сама ячейка будет растягиваться?..
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 17.09.2009, 09:01   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Насколько я понял combobox не будет выпадать,сама ячейка будет растягиваться?..
Наоборот, если речь идет о моем предложении. как раз в кликнутой ячейке раскроется комбик.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.09.2009, 19:58   #7
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Возник вопрос.Хочу сделать так,чтобы по нажатию Enter значение ячейки записывалось в массив.Но почему-то при трассировке на точках остановок исполнение не останавливается,но дело не в этом,не могли бы вы посмотреть правильно ли я написал функцию?(это конечно пробный вариант)Правильно ли всё написано по логике или есть другие варианты написания?
Код:
#include <vcl.h>
#pragma hdrstop

#include "Grid.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
int a[2][2];
int Col;
int Row;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
	: TForm(Owner)
{
        StringGrid1->Options<<goEditing;
	for(int i=0;i<2;i++)
		for(int j=0;j<2;j++)
			a[j][i]=i+j;
	StringGrid1->RowCount=3;
	StringGrid1->ColCount=3;
	StringGrid1->Cells[0][1]="i1";
	StringGrid1->Cells[0][2]="i2";
	StringGrid1->Cells[1][0]="j1";
	StringGrid1->Cells[2][0]="j2";
	for(int i=0;i<2;i++)
		for(int j=0;j<2;j++)
			StringGrid1->Cells[j+1][i+1]=IntToStr(a[i][j]);

}
void __fastcall TForm2::StringGrid1SetEditText(TObject *Sender, int ACol,
	  int ARow, const AnsiString Value)
{
//запоминаем координаты текущей ячейки
	   Col=ACol;
	   Row=ARow;
}
void __fastcall TForm2::StringGrid1KeyPress(TObject *Sender, char &Key)
{
//если нажали Enter
	 if(&Key=='\r')
		{
		     a[Col-1][Row-1]=StringGrid1->Cells[Col][Row].ToInt();
		}
}
Приходиться практически методом тыка и хелпом в помосЧь разбираться)
Не давай организму поблажки, каждый день тренируй его в шашки..

Последний раз редактировалось Скарам; 20.09.2009 в 11:13.
Скарам вне форума Ответить с цитированием
Старый 19.09.2009, 19:58   #8
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Да,скиньте,пожалуйста, ссылочку на события(желательно с примерами) StringGrid
Не давай организму поблажки, каждый день тренируй его в шашки..

Последний раз редактировалось Скарам; 19.09.2009 в 20:08.
Скарам вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вирус или нет? RealSHELS Безопасность, Шифрование 1 20.05.2009 12:09
Совпадение или нет? lastochka Свободное общение 14 10.01.2009 23:02
правильно или нет FreeZZZ Паскаль, Turbo Pascal, PascalABC.NET 9 26.12.2008 09:39
Есть или нет MAcK SQL, базы данных 3 27.05.2008 14:45
Лицензионное ПО или нет? pures Свободное общение 1 02.12.2007 06:34