Поиск:

Ответ в темуСоздание новой темы Создание опроса
> StringGrid, удаление строки 
:(
    Опции темы
Гость_Инна
Дата 17.11.2005, 14:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Подскажите как правильно удалить строку с известным номером из StringGrid?
Спасибо.
  Вверх
_hunter
Дата 17.11.2005, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



поднимаем все строки под этой на одну вверх и уменьшаем RowCount на 1


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Гость_Инна
Дата 17.11.2005, 15:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Пытаюсь убрать все строки у который во второй колонке пусто. Как правильно поднимать строки?
int u = Form1->StringGrid1->RowCount;
for (int i = 0; i<u ; i++)
{
if(Form1->StringGrid1->Cells[1][i] == "")
//поднять как?

Form1->StringGrid1->RowCount = Form1->StringGrid1->RowCount-1;
}
  Вверх
_hunter
Дата 17.11.2005, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



поднять -- это перенести значения всех ячеек строки


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Гость_Инна
Дата 17.11.2005, 16:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











int yborka = Form1->StringGrid1->RowCount;
for (int i = 0; i<yborka ; i++)
{
if(Form1->StringGrid1->Cells[1][i] == "")
{
for (int i = 0; i<yborka ; i++)
{
Form1->StringGrid1->Cells[0][i]=Form1->StringGrid1->Cells[0][i+1];
Form1->StringGrid1->Cells[1][i]=Form1->StringGrid1->Cells[1][i+1];
}
Form1->StringGrid1->RowCount = Form1->StringGrid1->RowCount-1;
}
}
Не работает. Где ошибка?
  Вверх
_hunter
Дата 17.11.2005, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



на вопрос
Цитата
Где ошибка?

я могу ответить только "там".

что значит "Не работает"?
Добавлено @ 16:36
P.S.
не стесняемся на кнопку "Код" тыкать...

P.P.S.
два цикла с одной переменной -- не есть гут...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Гость_Инна
Дата 17.11.2005, 16:43 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











СтрингГрид состоит из двух колонок. Во второй колонке есть пустые ячейки. Строки в которых присутствуют пустые значения во второй колонке надо убрать из СтрингГрид. Код выше с этим не справляется. Остаются пустые строки во второй колонке.
Еще подскажите: при старте приложения всегда выделена первая ячейка в первой колонке СтрингГрида, как сделать, чтобы этого выделения не было. И как менять размеры колонок, установила goColSizing в true, но поменять размер колонок не удается курсором мыши.
У меня СтрингГрид без фиксированных колонок и строк.
Спасибо.

  Вверх
Vyacheslav
Дата 17.11.2005, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Надо нежнее, еще нежнее
Код


void __fastcall TForm1::Button2Click(TObject *Sender)
{


class TPublicGrid: public  TStringGrid
{
    public:
        using TStringGrid::DeleteRow;
};
((TPublicGrid*)StringGrid1)->DeleteRow(1);


}



Добавлено @ 16:51
Код


class TPublicGrid: public  TStringGrid
{
    public:
        using TStringGrid::DeleteRow;
};
for (int i = StringGrid1->RowCount ; i--;)
{
      if(Form1->StringGrid1->Cells[1][i] == "")
        ((TPublicGrid*)StringGrid1)->DeleteRow(i);
}





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Гость_Инна
Дата 17.11.2005, 18:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо, работает smile
Теоретически это как реализовано? Идет переопределение защищенной переменной из класса TStringGrid? За что отвечает эта переменная в базовом классе TStringGrid? Почему классический TStringGrid не дает так просто удалять?
Еще вопросы:
Подскажите, как программно установить ширину двух колонок в StringGrid в зависимости от самого длинного текста в каждой из них и как снять выделение с первой ячейки StringGrid в момент его появления на форме?
Спасибо.


  Вверх
_hunter
Дата 17.11.2005, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



это называется взлом класса ( и нет там никакой переменой )
а почему удалять не дает -- у разработчиков спрашивать надобно...
ширину установить -- ColWidths
длину текста определить -- stringGrid->Canvas->TextWidth()
выделение убрать -- Col в -1 поставить попробуй ( ну или HideSelection в Design Time' е в true а потом вернуть в false )



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Vyacheslav
Дата 17.11.2005, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Здесь прсото создается некий прокси-класс, у которого всего лишь чисто декоративное отличие:
метод DeleteRow, объявленный как protected, объявляется в новом классе открытым.
Код

class TPublicGrid: public  TStringGrid
{
    public:
        using TStringGrid::DeleteRow;
};


Я бы не назвал, это взломом. Вполне стандартный прием.
Просто разработчики решили, что этот не стоит этот метод делать открытым для данного класса. А Вам он понадобился smile


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Гость_Инна
Дата 17.11.2005, 19:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Cпасибо за обяснения.

Кто знает, подскажите где ошибка. Пробую установить ширину двух своих колонок в СтрингГрид:
Код

int with_string1;
int with_string2;
int stolb = 1;
with_string1 = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[0][stolb]);
for (int i = Form1->StringGrid1->RowCount; i--;)
{
  if (Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[0][stolb])<
       Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[0][stolb+1]))
     {
       with_string1 = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[0][stolb+1]);

     }
  stolb++;

}

int stolb2 = 1;
with_string2 = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[1][stolb2]);
for (int i = Form1->StringGrid1->RowCount; i--;)
{
  if (Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[1][stolb2])<
       Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[1][stolb2+1]))
     {
       with_string2 = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[1][stolb2+1]);

     }
  stolb2++;

}

Form1->StringGrid1->ColWidths[0] = with_string1;
Form1->StringGrid1->ColWidths[1] = with_string2;
Form1->StringGrid1->SetFocus();//убрать выделение


Как-то странно работает smile В смысле неправильно smile
  Вверх
_hunter
Дата 17.11.2005, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



странный код...
зачем постоянно вычислять длины ( if (Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[1][stolb2])<
Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[1][stolb2+1])) )?
создай перед циклом переменную int maxWidth = 0;
и проверяй больше ли длина столбца этой переменной. если больше -- обновляй значение.
после цикла ставь длину в maxWidth и все...
+ ты, похоже путаеш столбцы и строки ( Cells[int ACol][int ARow] )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
docwar
Дата 27.9.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Здравствуйте!
1) Как в StringGrid удалить выделенную строку? Причем не просто очистить ее ячейки, а удалить полностью.
2) Как сделать выделенную строку доступной для редактирования? Т.е. выбераем строку, жмем на клавишу и можем изменять текст в любой ячейки строки прямо в таблице!
Модератор: зачем подымать старый топик. Я дал ссылку на него, что бы Вы смогли решить проблему с ошибкой. Ответы на это  топик и тот, который Вы  открыли полностью дают ответ на Ваши вопросы http://forum.vingrad.ru/index.php?showtopic=113677
PM MAIL   Вверх
docwar
Дата 29.9.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Извините, но я не могу выделить строку. Это вообще возможно?
PM MAIL   Вверх
Romikgy
Дата 29.9.2006, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Код

    TGridRect myRect;
  myRect.Left = 0;
  myRect.Top = 1;
  myRect.Right = StringGrid1->ColCount-1;
  myRect.Bottom = 1;

StringGrid1->Selection=myRect;



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
docwar
Дата 30.9.2006, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Спасибо большое, но я не пойму... куда вставить этот код, а то куда бы не вставлял - эффекта нет...
PM MAIL   Вверх
Romikgy
Дата 30.9.2006, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



туда где выделяешь строку


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
docwar
Дата 30.9.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



В обрабочик кнопки? Не выделяет он строки...  smile 
PM MAIL   Вверх
Romikgy
Дата 30.9.2006, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



в конце обработчика передай фокус стринггриду!


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
docwar
Дата 30.9.2006, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



В конец кнопки удалить уже пробовал добавлять.... результатов ноль...

Добавлено @ 21:44 
Мне кажется, что всему виной центрирование хидеров и проблемы с прорисовкой....
Посмотри, пожалуйста, код формы с первой страницы.  smile 
PM MAIL   Вверх
Romikgy
Дата 30.9.2006, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Цитата(docwar @  30.9.2006,  20:36 Найти цитируемый пост)
В конец кнопки удалить уже пробовал добавлять.... результатов ноль...

Добавлено @ 20:44 
Мне кажется, что всему виной центрирование хидеров и проблемы с прорисовкой....
Посмотри, пожалуйста, код формы с первой страницы.  

К чему это все?
Цитата(Romikgy @  29.9.2006,  21:46 Найти цитируемый пост)
StringGrid1->Selection=myRect;

после этого добавь StringGrid1->SetFocus();



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
docwar
Дата 30.9.2006, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Очищаются все строки + хидеры.... smile
PM MAIL   Вверх
docwar
Дата 8.10.2006, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Пересобрал весь проект. Помогите, пожалуйста, разобраться в удалением и редактированием выделенной строки!
Предложенные варианты удаления строки либо удаляют все строки, либо ничего вообще не делают! smile
PM MAIL   Вверх
Romikgy
Дата 8.10.2006, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



У тя билдер какой?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
docwar
Дата 9.10.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Шестой.
PM MAIL   Вверх
Aline
Дата 9.10.2006, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



docwar, 

Посмотри свойство Options, там есть goRowSelect, поставь в true, чтобы выделить целую строку.

Объявляешь класс как советовал Vyacheslav :

class TPublicGrid: public  TStringGrid
{
    public:
        using TStringGrid::DeleteRow;
};



а потом в обработчик кнопки, например, ставишь:

  ((TPublicGrid*)StringGrid1)->DeleteRow(sRow);


Значение sRow - индекс выбранной строки, можно получить в событии OnSelectCell. Кстати, совсем необязательно выделять целую строку, дастаточно встать в одну из ячеек этой строки.

Для редактирования, опять же используй Options, goEditing

void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
      int ARow, bool &CanSelect)
{
  sCol = ACol;
  sRow = ARow;
}

Добавлено @ 15:41 
docwar, 
Да, ещё, можно программно выделить строку.

Для этого устанавливаешь StringGrid->Row номер строки, которую нужно выделить и в Options должно быть установлено goRowSelect и goDrawFocusSelected

У меня по крайней мере выделяет нужную строку...
PM MAIL   Вверх
Romikgy
Дата 9.10.2006, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  StringGrid1->Options<<goRowSelect;
}

void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
//delete row
int rrow,i;
if (StringGrid1->RowCount==1) return;
TStringList * sl=new TStringList();

rrow=StringGrid1->Row;
for (i=0;i< StringGrid1->ColCount;i++)
{
 sl->Assign(StringGrid1->Cols[i]);
 sl->Delete(rrow);
 StringGrid1->Cols[i]->Assign(sl);
}
sl->Free();
StringGrid1->RowCount--;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn3Click(TObject *Sender)
{
 //add row
 int rrow,i;
 StringGrid1->RowCount++;
if (StringGrid1->RowCount==1) return;
TStringList * sl=new TStringList();

rrow=StringGrid1->Row;
for (i=0;i< StringGrid1->ColCount;i++)
{
 sl->Assign(StringGrid1->Cols[i]);
 sl->Insert(rrow,"Add");
 StringGrid1->Cols[i]->Assign(sl);
}
sl->Free();

}



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Vyacheslav
Дата 9.10.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Romikgy, 
Ну зачем выдавать такой навороченный код 
Давали же уже.

Код

//удаление выделенной строки
void __fastcall TForm1::Button2Click(TObject *Sender)
{

class TPublicGrid: public  TStringGrid
{
    public:
        using TStringGrid::DeleteRow;
};
((TPublicGrid*)StringGrid1)->DeleteRow(StringGrid->Row);


}



Что тут непонятного ?

Вот этот код работать не будет 
Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  StringGrid1->Options<<goRowSelect;
}



Надо делать вот так 

Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  StringGrid1->Options = StringGrid1->Options << goRowSelect;

И зачем использовать FormCreatе? Вместо него  используем конструктор.
Цитата

Note:    Use of the OnCreate event is discouraged in C++Builder because it can interact badly with the form’s constructor (see OldCreateOrder). It is recommended that you override the form constructor instead.


Цитата

Note:    Use of the OnCreate event is discouraged in C++Builder because it can interact badly with the form’s constructor (see OldCreateOrder). It is recommended that you override the form constructor instead.


И еще.
Вот это выглядит довольно забавно 
Код

sl->Free();

Может все таки стоит хоть немного внимать рекомендациям Borland
Цитата

Do not call the Free method of an object. Instead, use the delete keyword, which invokes Free to destroy an object. Free automatically calls the destructor if the object reference is not NULL.

"Не вызывайте метод Free. Вместо него используйте delete



  






--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
docwar
Дата 9.10.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Спасибо Вам огромное за ответы!!!

Только у меня опять вопросы! smile
Удаляю как советует Vyacheslav, добавление данных у меня оформлено так:
Код
if(!Edit1->Text.IsEmpty() && !Edit2->Text.IsEmpty()){
Form1->StringGrid1->Cells[0][Form1->StringGrid1->RowCount-1] = Edit1->Text;
Form1->StringGrid1->Cells[1][Form1->StringGrid1->RowCount-1] = Edit2->Text;
...
Form1->StringGrid1->Cells[1][Form1->StringGrid1->RowCount-1] = Edit6->Text;
Edit1->Clear();
Edit2->Clear();
...
Edit6->Clear();
Form1->StringGrid1->RowCount++;
}

Потом делаю следующее:
1) Добавляю данные
2) Удаляю эту строку
3) Добавляю новую
и в результате в таблицу выводится вторая строка, потом первая...  smile 
PM MAIL   Вверх
Romikgy
Дата 9.10.2006, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Цитата(Vyacheslav @  9.10.2006,  15:41 Найти цитируемый пост)
Ну зачем выдавать такой навороченный код 


Vyacheslav, ты дал один способ решения проблемы , я дал другой, автор выбрал который ему больше понравился

А зачем... имхо да потому что это форум, или я кого то повторил?

Добавлено @ 21:04 
Цитата(Vyacheslav @  9.10.2006,  15:41 Найти цитируемый пост)
Вот это выглядит довольно забавно 
Выделить всёкод C++ Builder
1:
    
sl->Free();

Может все таки стоит хоть немного внимать рекомендациям Borland
Цитата

Do not call the Free method of an object. Instead, use the delete keyword, which invokes Free to destroy an object. Free automatically calls the destructor if the object reference is not NULL.

"Не вызывайте метод Free. Вместо него используйте delete

здесь согласен , по инерции из дельфей

Добавлено @ 21:07 
Цитата(docwar @  9.10.2006,  17:21 Найти цитируемый пост)
Потом делаю следующее:
1) Добавляю данные
2) Удаляю эту строку
3) Добавляю новую
и в результате в таблицу выводится вторая строка, потом первая..

я из этого мало что понял , но имхо можно поменять местами, или подкорректировать ввод


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
docwar
Дата 9.10.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Цитата(Romikgy @  9.10.2006,  21:02 Найти цитируемый пост)
я из этого мало что понял

Сначала добавил данные в таблицу, потом удалил только что созданную строку, потом опять пользуюсь формой ввода. И в таблице отображаются ДВЕ строки: вторая - первая (сверху вниз!)

Цитата(Romikgy @  9.10.2006,  21:02 Найти цитируемый пост)
можно поменять местами, или подкорректировать ввод

А не подскажите как?  smile 
PM MAIL   Вверх
Romikgy
Дата 9.10.2006, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Цитата(docwar @  9.10.2006,  20:18 Найти цитируемый пост)
Сначала добавил данные в таблицу, потом удалил только что созданную строку, потом опять пользуюсь формой ввода. И в таблице отображаются ДВЕ строки: вторая - первая (сверху вниз!)

код бы привел
Цитата(docwar @  9.10.2006,  20:18 Найти цитируемый пост)
А не подскажите как?

подразумеваю надо после удаления позицию Row корректировать 



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
docwar
Дата 9.10.2006, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Код
if(!Edit1->Text.IsEmpty() && !Edit2->Text.IsEmpty())
{
Form1->StringGrid1->Cells[0][Form1->StringGrid1->RowCount-1] = Edit1->Text;
Form1->StringGrid1->Cells[1][Form1->StringGrid1->RowCount-1] = Edit2->Text;
...
Form1->StringGrid1->Cells[1][Form1->StringGrid1->RowCount-1] = Edit6->Text;
Edit1->Clear();
Edit2->Clear();
...
Edit6->Clear();
Form1->StringGrid1->RowCount++;
}


Это добавление! smile А есть еще и центрирование заголовков таблицы:
Код
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
TStringGrid *pSG = (TStringGrid *)Sender;
AnsiString nameCol = pSG->Cells[ACol][ARow];
int Align;
if(!ARow)
{
Align = DT_CENTER | DT_VCENTER | DT_SINGLELINE;
pSG->Canvas->Brush->Color = clBtnFace;
}
else
{
Align = DT_LEFT | DT_VCENTER | DT_SINGLELINE;
pSG->Canvas->Brush->Color = clWhite;
}
pSG->Canvas->FillRect(Rect);
TRect r = Rect;
DrawText(pSG->Canvas->Handle,nameCol.c_str(),nameCol.Length(),&r,Align);
}


Это сообщение отредактировал(а) docwar - 9.10.2006, 22:11
PM MAIL   Вверх
Romikgy
Дата 9.10.2006, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



1 ты уверен что

Цитата(docwar @  9.10.2006,  21:06 Найти цитируемый пост)
Form1->StringGrid1->Cells[0][Form1->StringGrid1->RowCount-1] = Edit1->Text;

а не Form1->StringGrid1->RowCount?
2 как удаялешь

PS елы палы что по пункно надо вытягивать?
написал
Цитата(docwar @  9.10.2006,  17:21 Найти цитируемый пост)
1) Добавляю данные
2) Удаляю эту строку
3) Добавляю новую
и в результате в таблицу выводится вторая строка, потом первая..

покажи это все
Цитата(docwar @  9.10.2006,  21:06 Найти цитируемый пост)
А есть еще и центрирование заголовков таблицы:

и это имхо .... не надо


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Aline
Дата 10.10.2006, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



docwar, 
у меня тоже так было
Умного решения не нашла :-), просто очищала ячейки в добавленной  строке:

 StringGrid1->Cells[0][StringGrid1->RowCount-1]="";
 StringGrid1->Cells[1][StringGrid1->RowCount-1]="";
PM MAIL   Вверх
docwar
Дата 10.10.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Цитата
покажи это все

Я делаю это все после запуска программы! Скриншоты показать?  smile 
PM MAIL   Вверх
Romikgy
Дата 10.10.2006, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Цитата(docwar @  10.10.2006,  16:45 Найти цитируемый пост)
Скриншоты показать? 

на кой они!? исходник покажи как ты это делаешь 
(последний раз прошу, далее просто не появлюсь в этой теме)


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
docwar
Дата 11.10.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Romikgy, извини, пожалуйста, что не понял тебя с первого раза!
После твоего ответа стал внимательно вчитываться в код и заметил, что я невнимателен! smile

Осталось только написать код для редактирования выделенной строки!  smile 
PM MAIL   Вверх
docwar
Дата 15.10.2006, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



И снова здравствуйте!
Помогите, пожалуйста, написать код для редактирования строки! smile 
Спасибо!  

Это сообщение отредактировал(а) docwar - 15.10.2006, 12:49
PM MAIL   Вверх
Aline
Дата 16.10.2006, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



docwar, 
Что значит "написать код для редактирования строки"? Ты толком можешь объяснить, что тебе надо? Что тебе со строкой делать надо?
PM MAIL   Вверх
FFFFFFF7
Дата 16.10.2006, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.10.2006

Репутация: 2
Всего: 2



Цитата(Aline @  16.10.2006,  12:21 Найти цитируемый пост)
Ты толком можешь объяснить, что тебе надо?

действительно.
docwar, ты когда научишься пользоваться мануалом?
Заметка: редактировать строку невозможно. Заруби это =)))!
Можно - ячейку.
--------------------
Да помоги кодеру, а значит - ближнему своему!
PM MAIL   Вверх
docwar
Дата 16.10.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Тогда помогите, пожалуйста, с кодом редактирования выделенной ячейки!
Делать всю таблицу доступной для редактирования мне не надо! =)
Спасибо!
PM MAIL   Вверх
docwar
Дата 18.10.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Надеюсь, что кто-нибудь мне поможет!  smile 
PM MAIL   Вверх
Aline
Дата 18.10.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



docwar, 

Слушай, посмотри текст на предыдущей странице, по-моему я тебе уже писала, что надо использовать свойство Options и событие OnSelectCell

По этому событию можно получить индексы выделенной ячейки, а с помощью Options настроить её свойства

Например:

void __fastcall TMainForm::StringGridClick(TObject *Sender)
{
  if (sCol == 1) StringGrid->Options = StringGrid->Options << goEditing;  //разрешаем редактирование во второй колонке
  else StringGrid->Options = StringGrid->Options >> goEditing;  //запрещаем редактирование
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::StringGridSelectCell(TObject *Sender, int ACol,
      int ARow, bool &CanSelect)
{
  sCol = ACol;
  sRow = ARow;
} 



PM MAIL   Вверх
docwar
Дата 18.10.2006, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Aline, извини! Просто только сейчас вернулся к редактированию ячеек и забыл о твоем сообщении...  smile 
Не пойму... компилятор ругается, что символы sCol и sRow не определены...  smile 
PM MAIL   Вверх
Aline
Дата 19.10.2006, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



docwar, 
ну так правильно, их объявить надо как int
в OnSelectCell объявлены ACol и ARow, а если тебе индексы ячеек нужны в другом месте, то другим переменным присваиваешь эти значения и потом работаешь с этой ячейкой как хочешь 
PM MAIL   Вверх
docwar
Дата 20.10.2006, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Aline, ну не получается у меня... :'(
Все время ругается, что-либо неопределен элемент, либо что значение не используется...
Смысл такой, чтобы при нажатии на клавишу редактирование становилось возможным.
Пишу так: (уже кучу вариантов перебрал, определял уже и через AnsiString...)
Код
void __fastcall TForm1::StringGrid1Click(TObject *Sender)
{
int sCol, sRow;
if (sCol == 1) StringGrid1->Options = StringGrid1->Options << goEditing;  
else StringGrid1->Options = StringGrid1->Options >> goEditing; 
}
//---------------------------------------------------------------------------

void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
      int ARow, bool &CanSelect)
{
int sCol, sRow;
  sCol = ACol;
  sRow = ARow;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N10Click(TObject *Sender)
{
int a=ACol;
int b=ARow;
}


Это сообщение отредактировал(а) docwar - 20.10.2006, 22:59
PM MAIL   Вверх
bsa
Дата 21.10.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



docwar, ты, надеюсь, сам понимаешь, что чушь написал? Три метода, два из которых вообще ничего не делают, а первый делает неизвестно что (от случая к случаю).
Может сначала стоит C++ выучить?
А теперь по порядку.
В первом методе ты объявляешь sCol и sRow, но не присваиваешь им ничего. Поэтому операция if (sCol == 1) ... будет иногда срабатывать, но чаще будет работать то, что после else. Так как в sCol в идеале случайное значение.
Во втором методе ты просто выполняешь лишние операции, который будут потеряны, после выхода из данного метода.
А третий метод вообще не скомпилируется (если, конечно, в классе нет аттрибутов ACol и ARow, а их скорей всего нет), но даже если и скомпилируется, то будет тоже самое, что и во втором методе.

Тебе надо объявить int sCol, sRow; В ОПРЕДЕЛЕНИИ КЛАССА (в .h файле). А все локальные определения убрать.
PM   Вверх
docwar
Дата 21.10.2006, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Цитата
надеюсь, сам понимаешь, что чушь написал?

Естественно понимаю! =) Ничего не получалось(забыл, что обьявлять надо в .h) + был после стоматолога... вот и написал такой код...
Спасибо! Ошибок нет, но действий никаких не выполняется. ?
PM MAIL   Вверх
Aline
Дата 23.10.2006, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет




Код


int sCol, sRow;

 void __fastcall TForm1::StringGrid1Click(TObject *Sender)
//когда ты щелкнешь на ячейку, то сразу разрешишь или запретишь редактирование этой ячейки
{
    if (sCol == 1) StringGrid1->Options = StringGrid1->Options << goEditing;  
    else StringGrid1->Options = StringGrid1->Options >> goEditing; 
}
//---------------------------------------------------------------------------

void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
      int ARow, bool &CanSelect)
{
  sCol = ACol;
  sRow = ARow;
}
//---------------------------------------------------------------------------

//если тебе надо обработывать это по кнопке, то перенеси текст из StringGrid1Click в обработчик клика кнопки или выбора команды 
//меню:

void __fastcall TForm1::N10Click(TObject *Sender)
{
    if (sCol == 1) StringGrid1->Options = StringGrid1->Options << goEditing;  
    else StringGrid1->Options = StringGrid1->Options >> goEditing; 
} 

docwar, 
Всё должно работать, проверь ещё раз. В крайнем случае поставь точку останова и посмотри в отладчике что происходит. А вообще, что ты хотел увидеть? По  тому условию что ты поставил, у тебя будет разрешено редактирование во второй колонке, т.е. там будет курсор появляться.
PM MAIL   Вверх
docwar
Дата 23.10.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Aline, спасибо! Проверю код как только получу доступ к своему компьютеру (завтра вечером примерно).
Цитата
А вообще, что ты хотел увидеть?

Хотел, чтобы прямо в таблице можно было вносить изменения или с помощью вызова доп. формы. Ввел данные в редактируемую строку - данные в ней заменились.
PM MAIL   Вверх
docwar
Дата 8.11.2006, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Вопрос еще не решен! 
Прошу вашей помощи!!!
PM MAIL   Вверх
Reptile
Дата 9.11.2006, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Цитата(docwar @  23.10.2006,  17:19 Найти цитируемый пост)
Хотел, чтобы прямо в таблице можно было вносить изменения или с помощью вызова доп. формы. Ввел данные в редактируемую строку - данные в ней заменились. 

Ну так создай еще одну форму, набросай Edit-ы и при нажатии на кнопку редактирования показываеш форму с Edit-ми, а в них заполняеш значения из StringGrid, нажимаеш ОК и все данные из Edit-ов переносиш в StringGrid и закрываеш доп. форму. И все smile 
PM MAIL   Вверх
dumb
Дата 9.11.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



docwar,
в дизайнере форм тыкни ЛКМ(левая кнопка мыши) на свой StringGrid. нажми F11. найди там Options. нажми "+". найди goEditing. поставь значение true.

user posted image
PM MAIL   Вверх
васек
Дата 9.11.2006, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 9.11.2006

Репутация: нет
Всего: нет



Люди подскажите как разработать визуальную компаненту таблицы умножения String Grid? smile 
PM MAIL   Вверх
docwar
Дата 9.11.2006, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Reptile, это понятно! У меня трудности с написанием кода! Можешь помочь? =)

dumb, без комментариев...
PM MAIL   Вверх
Romikgy
Дата 9.11.2006, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



docwar, я сколько смотрю , ты все просишь, помогите , помогите, 
только я до сих пор не понял , чем помочь то?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Reptile
  Дата 10.11.2006, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Цитата(docwar @  9.11.2006,  21:56 Найти цитируемый пост)
Можешь помочь? =)

docwar, есть 2-а способа:
  • Простой, как еаписал dumb(он подробна объяснил), так ты сможеш изменять прямо в StringGrid
  • Сложнее через доп форму 
    вот простой проект  smile (Можно конечно покультурнее, но... smile )

ОЙ smile  smile  smile 
Сорри проект на Delphi (забыл какой раздел  smile  smile  smile ),
но думаю алгоритм под Builder переделать не сложно smile 

Это сообщение отредактировал(а) Reptile - 10.11.2006, 11:05

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  Test.rar 7,48 Kb
PM MAIL   Вверх
docwar
Дата 10.11.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Reptile, буду благодарен, если проект под Билдер адаптируешь, а то открыть cpp не смог...
Romikgy, надо открыть доп. форму, содержащую в Эдитах текст выделенной строки (причем каждый столбец - отдельный эдит), внести изменения, нажать на клавишу и заменить ранее выделенную строку измененной... =)
PM MAIL   Вверх
Reptile
Дата 10.11.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Под рукой Builder-а нету smile 
Пишу здесь могут быть опечятки smile 
Вот это вешаеш на нажатие кнопки:
Код

  Form2->Edit1->Text = StringGrid1.Cells[1][StringGrid1->Row];
  Form2->Edit2->Text = StringGrid1.Cells[2][StringGrid1->Row];
  Form2->Edit3->Text = StringGrid1.Cells[3][StringGrid1->Row];
  Form2->Edit4->Text = StringGrid1.Cells[4][StringGrid1->Row];
  Form2->ShowModal();

Это во второй форме на нажатие "Сохранить"(или как там у тебя...):
Код

  Form1->StringGrid1->Cells[1][Form1->StringGrid1->Row] = Form2->Edit1->Text;
  Form1->StringGrid1->Cells[2][Form1->StringGrid1->Row] = Form2->Edit2->Text;
  Form1->StringGrid1->Cells[3][Form1->StringGrid1->Row] = Form2->Edit3->Text;
  Form1->StringGrid1->Cells[4][Form1->StringGrid1->Row] = Form2->Edit4->Text;
  Close(); 

Если будут ошибки - пиши smile Буду благодарен за исправления.
P.S.Не забудь подключить формы друг к другу.


Это сообщение отредактировал(а) Reptile - 10.11.2006, 13:47
PM MAIL   Вверх
docwar
Дата 10.11.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Reptile, спасибо огромное!!!
Я писал такой же код, но строка после редактирования добавлялась ПОСЛЕ, а не заменяла строку, текст которой помещался в Эдиты... поэтому и решил, что метод мой ошибочный! ))
Уже и перед нажатием на ОК (на форме редактирования) активировал ф-ию удаления строки и Form1->StringGrid1->RowCount--; писал.....
Как быть? =)

Добавлено @ 17:13 
Строка после редактирования добавляется после всех остальных строк....
PM MAIL   Вверх
Reptile
Дата 10.11.2006, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Цитата(docwar @  10.11.2006,  17:11 Найти цитируемый пост)
Я писал такой же код, но строка после редактирования добавлялась ПОСЛЕ, а не заменяла строку

Значит уже не такой smile 
Цитата(docwar @  10.11.2006,  17:11 Найти цитируемый пост)
Уже и перед нажатием на ОК (на форме редактирования) активировал ф-ию удаления строки и Form1->StringGrid1->RowCount--; писал.....
Как быть? =)

Не понял smile
Етот код редактирует, для добавления строки делай похожую форму но увеличивай Form1->StringGrid1->RowCount и добавляй.

Цитата(docwar @  10.11.2006,  17:11 Найти цитируемый пост)
Добавлено @ 17:13 
Строка после редактирования добавляется после всех остальных строк.... 

Как это? 
Код

  Form1->StringGrid1->Cells[1][Form1->StringGrid1->Row] = Form2->Edit1->Text;
  Form1->StringGrid1->Cells[2][Form1->StringGrid1->Row] = Form2->Edit2->Text;
  Form1->StringGrid1->Cells[3][Form1->StringGrid1->Row] = Form2->Edit3->Text;
  Form1->StringGrid1->Cells[4][Form1->StringGrid1->Row] = Form2->Edit4->Text;

Изменяет сущуствующие ячейки,он не добавляет
В чем вопрос?

PM MAIL   Вверх
docwar
Дата 10.11.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Вопрос в том, что строка, которую мы выбираем для редактирования остается неизменной, а отредактированная добавляется ПОСЛЕ всех строк таблицы...

Цитата(Reptile @  10.11.2006,  17:50 Найти цитируемый пост)
Етот код редактирует, для добавления строки делай похожую форму но увеличивай Form1->StringGrid1->RowCount и добавляй.

Увеличивать RowCount или нет? Только смысл? Уменьшение желаемого результата тоже не принесло.

Забыл сказать, что у меня на главной форме прописано StringGrid1->Options = StringGrid1->Options << goRowSelect; ..... но это ни на что не должно влиять...
PM MAIL   Вверх
Reptile
Дата 10.11.2006, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Цитата(docwar @  10.11.2006,  18:21 Найти цитируемый пост)
Вопрос в том, что строка, которую мы выбираем для редактирования остается неизменной, а отредактированная добавляется ПОСЛЕ всех строк таблицы...

 smile
Покажи код навешаный на кнопку ОК. А лучше прикрепи проект, я проверю и завтра выложу smile 
Какие у Тебя значения в FixedRows и FixedCols ?

Цитата(docwar @  10.11.2006,  18:21 Найти цитируемый пост)
Увеличивать RowCount или нет?

Нет, если надо только редактировать.

Цитата(docwar @  10.11.2006,  18:21 Найти цитируемый пост)
Забыл сказать, что у меня на главной форме прописано StringGrid1->Options = StringGrid1->Options << goRowSelect; 

Это логично, иначе Ты бы не выделял всей строки smile 



Это сообщение отредактировал(а) Reptile - 10.11.2006, 18:45
PM MAIL   Вверх
docwar
Дата 10.11.2006, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



FixedRows=1
StringGrid1->FixedCols = 0;

Сожалею, но весь проект прикрепить не могу....  smile 

Цитата(Reptile @  10.11.2006,  18:44 Найти цитируемый пост)
Покажи код навешаный на кнопку ОК.

Код
  Form1->StringGrid1->Cells[0][Form1->StringGrid1->Row] = Form2->Edit1->Text;
  Form1->StringGrid1->Cells[1][Form1->StringGrid1->Row] = Form2->Edit2->Text;
  Form1->StringGrid1->Cells[2][Form1->StringGrid1->Row] = Form2->Edit3->Text;
  Form1->StringGrid1->Cells[3][Form1->StringGrid1->Row] = Form2->Edit4->Text;
  Form1->StringGrid1->Cells[4][Form1->StringGrid1->Row] = Form2->Edit5->Text;
  Form1->StringGrid1->Cells[5][Form1->StringGrid1->Row] = Form2->Edit6->Text;
  Form1->StringGrid1->Cells[6][Form1->StringGrid1->Row] = Form2->Edit7->Text;
  Form1->StringGrid1->Cells[7][Form1->StringGrid1->Row] = Form2->Edit8->Text;
  Close(); 

PM MAIL   Вверх
Reptile
  Дата 10.11.2006, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Цитата(docwar @  10.11.2006,  18:53 Найти цитируемый пост)
Сожалею, но весь проект прикрепить не могу....  smile 

Тогда ничем не могу помочь smile 
У меня все работает smile 
Не могу понять
Цитата(docwar @  10.11.2006,  18:21 Найти цитируемый пост)
отредактированная добавляется ПОСЛЕ всех строк таблицы...

Как  smile 

Это сообщение отредактировал(а) Reptile - 10.11.2006, 19:30

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  22.GIF 26,97 Kb
PM MAIL   Вверх
docwar
Дата 10.11.2006, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Reptile, вопрос решил добавление переменной, хранящей номер строки, которую мы хотим отредактировать.
Как же ты без этого сделал не пойму!

Спасибо большое за помощь!
PM MAIL   Вверх
Reptile
Дата 11.11.2006, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Цитата(docwar @  10.11.2006,  12:59 Найти цитируемый пост)
Reptile, буду благодарен, если проект под Билдер адаптируешь

Бодьше не чем не могу помоч smile 


Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  StrinGrid.rar 4,29 Kb
PM MAIL   Вверх
XPyCT
Дата 2.7.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 24.8.2007
Где: Moldova

Репутация: 10
Всего: 10



Цитата(docwar @ 29.9.2006,  17:22)
Извините, но я не могу выделить строку. Это вообще возможно?

что тут  не ясного! хоть пост был давно но отпишу
Предположим у вас стрингрид  с одним выделенным рядом и одним выделенным столбцом!
нумерация в стрингриде идет с нуля!
и так первый фикс ряд =0  и фикс кол=0;

идем дальше вам нужно к примеру выделить ряд под номером №5

кидаем на форму едит и кнопку
Далее пишем там этот код по событию нажатия кнопки
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int cRow=StrToInt(Edit1->Text);

  if(cRow > StringGrid1->RowCount-1 || Edit1->Text.IsEmpty())
    ShowMessage("Диапазон рядов задан не верно!");
      else
       {
        StringGrid1->Row=cRow;
        StringGrid1->Options<<goRowSelect;  //  "<<" - так разрешаем выделение строки  ">>" -Так запрещаем
         // goEditing; "<<" - так разрешаем Редактирование таблицы  ">>" -Так запрещаем
       }
}



Одновременное применение своиств  goRowSelect и goEditing не дает эфекта (goEditing);- только goRowSelect 





Это сообщение отредактировал(а) XPyCT - 2.7.2008, 14:27
PM MAIL Skype   Вверх
XPyCT
Дата 4.7.2008, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 24.8.2007
Где: Moldova

Репутация: 10
Всего: 10



вот написал думаю поможет!
прошу не пинать сам не силен но пишу то что знаю и делал!
и так есть две формы
fmBaza - Главная форма
fmADD- Форма добавления товара
SGBaza- StringGrid

по нажатию клавиши ентер появляется форма добавления
которая смотрит какая колонка и ряд и исходя из этого  уже добавляет
привожу код 
1. Главная форма
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include<winuser.h>

#include "MAIN_Unit.h"
#include "ADD_ITEM_Unit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfmBaza *fmBaza;
int cRow,cCol; //Глобальные переменные
//---------------------------------------------------------------------------
__fastcall TfmBaza::TfmBaza(TComponent* Owner)
        : TForm(Owner)
{
     //Ввод начального значения
SGBaza->Cells[1][1]="Сахар";
SGBaza->Cells[2][1]="20,75";
SGBaza->Cells[3][1]="8,25";
}
//---------------------------------------------------------------------------
void __fastcall TfmBaza::FormShow(TObject *Sender)
{
SGBaza->ColWidths[0]=30;   //Задаем размер колонок
SGBaza->ColWidths[1]=150;
SGBaza->ColWidths[2]=80;
SGBaza->ColWidths[3]=80;

SGBaza->Cells[0][0]="№";     //Озаглавливание фикс ряда
SGBaza->Cells[1][0]="Найменование";
SGBaza->Cells[2][0]="Кол-во";
SGBaza->Cells[3][0]="Цена в руб";

SGBaza->SetFocus(); //Передача фокуса в таблицу
SGBaza->Options<<goTabs; //Разрешаем перемещение по таблице клавишей таб

//нумерация всех рядов
for(int i=1; i<SGBaza->RowCount; i++)
SGBaza->Cells[0][i]=i;
}
//---------------------------------------------------------------------------
void __fastcall TfmBaza::SGBazaKeyPress(TObject *Sender, char &Key)
{
if(Key==VK_RETURN)
   {
     cRow=SGBaza->Row; //Получаем Активную строку
     cCol=SGBaza->Col; //Полчаем  Активную колонку

     fmADD->Edit1->Text=SGBaza->Cells[cCol][cRow];
     fmADD->Show();
   }


}
//---------------------------------------------------------------------------
void __fastcall TfmBaza::btAddRowClick(TObject *Sender)
{
SGBaza->RowCount++;
cRow=SGBaza->RowCount-1;
cCol=1;//Делаем активным первую колонку последнего ряда
SGBaza->Row=cRow; //Делаем активным последний ряд
SGBaza->SetFocus(); //Передача фокуса в таблицу
//нумерация всех рядов
for(int i=1; i<SGBaza->RowCount; i++)
SGBaza->Cells[0][i]=i;
}
//---------------------------------------------------------------------------
void __fastcall TfmBaza::btDeleteRowClick(TObject *Sender)
{
if(SGBaza->Cells[1][1].IsEmpty()&& SGBaza->Cells[2][1].IsEmpty()&& SGBaza->Cells[3][1].IsEmpty())
 ShowMessage("Нечего удалять!");  //Если единственный ряд пустой
 else
 {

if (MessageDlg("Вы действительно хотите удалить запись? "+SGBaza->Cells[1][cRow],mtConfirmation,TMsgDlgButtons() << mbOK<<mbCancel,0)==mrOk)
  {   //Если всего один ряд то просто очищаем
    if(SGBaza->RowCount==2 && SGBaza->Row==1 )
   {
    SGBaza->Cells[1][1]="";
    SGBaza->Cells[2][1]="";
    SGBaza->Cells[3][1]="";
    }
    else
     {
     class TProxyGrid : public TStringGrid
    {
       public:
        using TStringGrid::DeleteRow;

   };

    ((TProxyGrid*)SGBaza)->DeleteRow(cRow);

    }
  }
  }

SGBaza->SetFocus(); //Передача фокуса  в таблицу
//нумерация всех рядов
for(int i=1; i<SGBaza->RowCount; i++)
SGBaza->Cells[0][i]=i;

}
//---------------------------------------------------------------------------
void __fastcall TfmBaza::SGBazaKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if(Key==VK_INSERT)//Добавляем ряд при нажатии клав инсерт
fmBaza->btAddRow->Click();
}
//---------------------------------------------------------------------------




2. Форма добавления

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "ADD_ITEM_Unit.h"
#include "MAIN_Unit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfmADD *fmADD;
extern int cRow,cCol; //Глобальные переменные
//---------------------------------------------------------------------------
__fastcall TfmADD::TfmADD(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfmADD::Edit1KeyPress(TObject *Sender, char &Key)
{
int i,k,s=0;
char str[10];
  if(Key==VK_RETURN) //если нажата клавиша ентер
  {
    if(cCol==1)  //Просто добавляем или заменяем наименование товара
    fmBaza->SGBaza->Cells[cCol][cRow]=Edit1->Text;
    if(cCol==2)//Дабавляем к существующему количеству новое 2+2=4
     {
//---Конвертирование содержимого Edit1 и замена точки на запятую-
      strcpy(str,Edit1->Text.c_str());
       for(i=0; i<10; i++)
        if(str[i]=='.')
          str[i]=',';
          Edit1->Text=str;
//---Конвертирование содержимого Edit1 и замена точки на запятую---End--
          if(!fmBaza->SGBaza->Cells[cCol][cRow].IsEmpty())//Если ечейка не пустая
                {
fmBaza->SGBaza->Cells[cCol][cRow]= //Добавление количества
FloatToStr(StrToFloat(fmBaza->SGBaza->Cells[cCol][cRow])+StrToFloat(Edit1->Text));
                }
             else
                {  //если ечейка пустая
//---Конвертирование содержимого Edit1 и замена точки на запятую-
             strcpy(str,Edit1->Text.c_str());
            for(i=0; i<10; i++)
            if(str[i]=='.')
           str[i]=',';
            Edit1->Text=str;
//---Конвертирование содержимого Edit1 и замена точки на запятую---End-- ]
           fmBaza->SGBaza->Cells[cCol][cRow]=Edit1->Text;
                }
     }

  if(cCol==3)  //Просто добавляем или заменяем Цену
     {
//---Конвертирование содержимого Edit1 и замена точки на запятую-
             strcpy(str,Edit1->Text.c_str());
            for(i=0; i<10; i++)
            if(str[i]=='.')
           str[i]=',';
            Edit1->Text=str;
//---Конвертирование содержимого Edit1 и замена точки на запятую---End-- ]

    fmBaza->SGBaza->Cells[cCol][cRow]=Edit1->Text;
     }
     fmBaza->SGBaza->SetFocus(); //Передача фокуса  в таблицу
     //нумерация всех рядов
     for(int i=1; i<fmBaza->SGBaza->RowCount; i++)
     fmBaza->SGBaza->Cells[0][i]=i;
     Close();
  }
}
//---------------------------------------------------------------------------


PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1932 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.