| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > StringGrid |
| Автор: Гость_Инна 17.11.2005, 14:19 |
| Подскажите как правильно удалить строку с известным номером из StringGrid? Спасибо. |
| Автор: _hunter 17.11.2005, 14:41 |
| поднимаем все строки под этой на одну вверх и уменьшаем RowCount на 1 |
| Автор: Гость_Инна 17.11.2005, 15:51 |
| Пытаюсь убрать все строки у который во второй колонке пусто. Как правильно поднимать строки? 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 |
| поднять -- это перенести значения всех ячеек строки |
| Автор: Гость_Инна 17.11.2005, 16:24 |
| 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 | ||
на вопрос
я могу ответить только "там". что значит "Не работает"? Добавлено @ 16:36 P.S. не стесняемся на кнопку "Код" тыкать... P.P.S. два цикла с одной переменной -- не есть гут... |
| Автор: Гость_Инна 17.11.2005, 16:43 |
| СтрингГрид состоит из двух колонок. Во второй колонке есть пустые ячейки. Строки в которых присутствуют пустые значения во второй колонке надо убрать из СтрингГрид. Код выше с этим не справляется. Остаются пустые строки во второй колонке. Еще подскажите: при старте приложения всегда выделена первая ячейка в первой колонке СтрингГрида, как сделать, чтобы этого выделения не было. И как менять размеры колонок, установила goColSizing в true, но поменять размер колонок не удается курсором мыши. У меня СтрингГрид без фиксированных колонок и строк. Спасибо. |
| Автор: Vyacheslav 17.11.2005, 16:44 | ||||
Надо нежнее, еще нежнее
Добавлено @ 16:51
|
| Автор: Гость_Инна 17.11.2005, 18:06 |
| Спасибо, работает Теоретически это как реализовано? Идет переопределение защищенной переменной из класса TStringGrid? За что отвечает эта переменная в базовом классе TStringGrid? Почему классический TStringGrid не дает так просто удалять? Еще вопросы: Подскажите, как программно установить ширину двух колонок в StringGrid в зависимости от самого длинного текста в каждой из них и как снять выделение с первой ячейки StringGrid в момент его появления на форме? Спасибо. |
| Автор: _hunter 17.11.2005, 18:23 |
| это называется взлом класса ( и нет там никакой переменой ) а почему удалять не дает -- у разработчиков спрашивать надобно... ширину установить -- ColWidths длину текста определить -- stringGrid->Canvas->TextWidth() выделение убрать -- Col в -1 поставить попробуй ( ну или HideSelection в Design Time' е в true а потом вернуть в false ) |
| Автор: Vyacheslav 17.11.2005, 18:35 | ||
| Здесь прсото создается некий прокси-класс, у которого всего лишь чисто декоративное отличие: метод DeleteRow, объявленный как protected, объявляется в новом классе открытым.
Я бы не назвал, это взломом. Вполне стандартный прием. Просто разработчики решили, что этот не стоит этот метод делать открытым для данного класса. А Вам он понадобился |
| Автор: Гость_Инна 17.11.2005, 19:00 | ||
| Cпасибо за обяснения. Кто знает, подскажите где ошибка. Пробую установить ширину двух своих колонок в СтрингГрид:
Как-то странно работает |
| Автор: _hunter 17.11.2005, 19:33 |
| странный код... зачем постоянно вычислять длины ( 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] ) |
| Автор: docwar 27.9.2006, 17:07 |
| Здравствуйте! 1) Как в StringGrid удалить выделенную строку? Причем не просто очистить ее ячейки, а удалить полностью. 2) Как сделать выделенную строку доступной для редактирования? Т.е. выбераем строку, жмем на клавишу и можем изменять текст в любой ячейки строки прямо в таблице! Модератор: зачем подымать старый топик. Я дал ссылку на него, что бы Вы смогли решить проблему с ошибкой. Ответы на это топик и тот, который Вы открыли полностью дают ответ на Ваши вопросы http://forum.vingrad.ru/index.php?showtopic=113677 |
| Автор: docwar 29.9.2006, 17:22 |
| Извините, но я не могу выделить строку. Это вообще возможно? |
| Автор: Romikgy 29.9.2006, 22:46 | ||
|
| Автор: docwar 30.9.2006, 08:59 |
| Спасибо большое, но я не пойму... куда вставить этот код, а то куда бы не вставлял - эффекта нет... |
| Автор: Romikgy 30.9.2006, 11:31 |
| туда где выделяешь строку |
| Автор: docwar 30.9.2006, 17:49 |
| В обрабочик кнопки? Не выделяет он строки... |
| Автор: Romikgy 30.9.2006, 20:20 |
| в конце обработчика передай фокус стринггриду! |
| Автор: docwar 30.9.2006, 21:36 |
| В конец кнопки удалить уже пробовал добавлять.... результатов ноль... Добавлено @ 21:44 Мне кажется, что всему виной центрирование хидеров и проблемы с прорисовкой.... Посмотри, пожалуйста, код формы с первой страницы. |
| Автор: docwar 30.9.2006, 23:42 |
| Очищаются все строки + хидеры.... |
| Автор: docwar 8.10.2006, 20:25 |
| Пересобрал весь проект. Помогите, пожалуйста, разобраться в удалением и редактированием выделенной строки! Предложенные варианты удаления строки либо удаляют все строки, либо ничего вообще не делают! |
| Автор: Romikgy 8.10.2006, 22:20 |
| У тя билдер какой? |
| Автор: docwar 9.10.2006, 13:59 |
| Шестой. |
| Автор: Aline 9.10.2006, 15:30 |
| 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 У меня по крайней мере выделяет нужную строку... |
| Автор: Romikgy 9.10.2006, 16:12 | ||
|
| Автор: Vyacheslav 9.10.2006, 16:41 | ||||||||||||||
| Romikgy, Ну зачем выдавать такой навороченный код Давали же уже.
Что тут непонятного ? Вот этот код работать не будет
Надо делать вот так
И зачем использовать FormCreatе? Вместо него используем конструктор.
И еще. Вот это выглядит довольно забавно
Может все таки стоит хоть немного внимать рекомендациям Borland
"Не вызывайте метод Free. Вместо него используйте delete |
| Автор: docwar 9.10.2006, 18:21 | ||
| Спасибо Вам огромное за ответы!!! Только у меня опять вопросы! Удаляю как советует Vyacheslav, добавление данных у меня оформлено так:
Потом делаю следующее: 1) Добавляю данные 2) Удаляю эту строку 3) Добавляю новую и в результате в таблицу выводится вторая строка, потом первая... |
| Автор: Romikgy 9.10.2006, 21:02 | ||||
Vyacheslav, ты дал один способ решения проблемы , я дал другой, автор выбрал который ему больше понравился А зачем... имхо да потому что это форум, или я кого то повторил? Добавлено @ 21:04
здесь согласен , по инерции из дельфей Добавлено @ 21:07
я из этого мало что понял , но имхо можно поменять местами, или подкорректировать ввод |
| Автор: docwar 9.10.2006, 21:18 |
Сначала добавил данные в таблицу, потом удалил только что созданную строку, потом опять пользуюсь формой ввода. И в таблице отображаются ДВЕ строки: вторая - первая (сверху вниз!) А не подскажите как? |
| Автор: Romikgy 9.10.2006, 22:03 | ||
код бы привел подразумеваю надо после удаления позицию Row корректировать |
| Автор: docwar 9.10.2006, 22:06 | ||||
Это добавление!
|
| Автор: Romikgy 9.10.2006, 23:02 | ||||
1 ты уверен что
а не Form1->StringGrid1->RowCount? 2 как удаялешь PS елы палы что по пункно надо вытягивать? написал
покажи это все и это имхо .... не надо |
| Автор: Aline 10.10.2006, 07:59 |
| docwar, у меня тоже так было Умного решения не нашла :-), просто очищала ячейки в добавленной строке: StringGrid1->Cells[0][StringGrid1->RowCount-1]=""; StringGrid1->Cells[1][StringGrid1->RowCount-1]=""; |
| Автор: docwar 10.10.2006, 17:45 | ||
Я делаю это все после запуска программы! Скриншоты показать? |
| Автор: Romikgy 10.10.2006, 22:05 |
на кой они!? исходник покажи как ты это делаешь (последний раз прошу, далее просто не появлюсь в этой теме) |
| Автор: docwar 11.10.2006, 15:48 |
| Romikgy, извини, пожалуйста, что не понял тебя с первого раза! После твоего ответа стал внимательно вчитываться в код и заметил, что я невнимателен! Осталось только написать код для редактирования выделенной строки! |
| Автор: docwar 15.10.2006, 12:46 |
| И снова здравствуйте! Помогите, пожалуйста, написать код для редактирования строки! Спасибо! |
| Автор: Aline 16.10.2006, 12:21 |
| docwar, Что значит "написать код для редактирования строки"? Ты толком можешь объяснить, что тебе надо? Что тебе со строкой делать надо? |
| Автор: FFFFFFF7 16.10.2006, 12:50 |
действительно. docwar, ты когда научишься пользоваться мануалом? Заметка: редактировать строку невозможно. Заруби это =)))! Можно - ячейку. |
| Автор: docwar 16.10.2006, 14:54 |
| Тогда помогите, пожалуйста, с кодом редактирования выделенной ячейки! Делать всю таблицу доступной для редактирования мне не надо! =) Спасибо! |
| Автор: docwar 18.10.2006, 11:18 |
| Надеюсь, что кто-нибудь мне поможет! |
| Автор: Aline 18.10.2006, 15:42 |
| 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; } |
| Автор: docwar 18.10.2006, 17:14 |
| Aline, извини! Просто только сейчас вернулся к редактированию ячеек и забыл о твоем сообщении... Не пойму... компилятор ругается, что символы sCol и sRow не определены... |
| Автор: Aline 19.10.2006, 08:40 |
| docwar, ну так правильно, их объявить надо как int в OnSelectCell объявлены ACol и ARow, а если тебе индексы ячеек нужны в другом месте, то другим переменным присваиваешь эти значения и потом работаешь с этой ячейкой как хочешь |
| Автор: docwar 20.10.2006, 22:57 | ||
| Aline, ну не получается у меня... :'( Все время ругается, что-либо неопределен элемент, либо что значение не используется... Смысл такой, чтобы при нажатии на клавишу редактирование становилось возможным. Пишу так: (уже кучу вариантов перебрал, определял уже и через AnsiString...)
|
| Автор: bsa 21.10.2006, 12:04 |
| docwar, ты, надеюсь, сам понимаешь, что чушь написал? Три метода, два из которых вообще ничего не делают, а первый делает неизвестно что (от случая к случаю). Может сначала стоит C++ выучить? А теперь по порядку. В первом методе ты объявляешь sCol и sRow, но не присваиваешь им ничего. Поэтому операция if (sCol == 1) ... будет иногда срабатывать, но чаще будет работать то, что после else. Так как в sCol в идеале случайное значение. Во втором методе ты просто выполняешь лишние операции, который будут потеряны, после выхода из данного метода. А третий метод вообще не скомпилируется (если, конечно, в классе нет аттрибутов ACol и ARow, а их скорей всего нет), но даже если и скомпилируется, то будет тоже самое, что и во втором методе. Тебе надо объявить int sCol, sRow; В ОПРЕДЕЛЕНИИ КЛАССА (в .h файле). А все локальные определения убрать. |
| Автор: docwar 21.10.2006, 14:40 | ||
Естественно понимаю! =) Ничего не получалось(забыл, что обьявлять надо в .h) + был после стоматолога... вот и написал такой код... Спасибо! Ошибок нет, но действий никаких не выполняется. ? |
| Автор: Aline 23.10.2006, 15:27 | ||
docwar, Всё должно работать, проверь ещё раз. В крайнем случае поставь точку останова и посмотри в отладчике что происходит. А вообще, что ты хотел увидеть? По тому условию что ты поставил, у тебя будет разрешено редактирование во второй колонке, т.е. там будет курсор появляться. |
| Автор: docwar 23.10.2006, 17:19 | ||
Aline, спасибо! Проверю код как только получу доступ к своему компьютеру (завтра вечером примерно).
Хотел, чтобы прямо в таблице можно было вносить изменения или с помощью вызова доп. формы. Ввел данные в редактируемую строку - данные в ней заменились. |
| Автор: docwar 8.11.2006, 19:28 |
| Вопрос еще не решен! Прошу вашей помощи!!! |
| Автор: Reptile 9.11.2006, 11:32 | ||
Ну так создай еще одну форму, набросай Edit-ы и при нажатии на кнопку редактирования показываеш форму с Edit-ми, а в них заполняеш значения из StringGrid, нажимаеш ОК и все данные из Edit-ов переносиш в StringGrid и закрываеш доп. форму. И все |
| Автор: dumb 9.11.2006, 11:52 |
| docwar, в дизайнере форм тыкни ЛКМ(левая кнопка мыши) на свой StringGrid. нажми F11. найди там Options. нажми "+". найди goEditing. поставь значение true. ![]() |
| Автор: васек 9.11.2006, 16:31 |
| Люди подскажите как разработать визуальную компаненту таблицы умножения String Grid? |
| Автор: docwar 9.11.2006, 21:56 |
| Reptile, это понятно! У меня трудности с написанием кода! Можешь помочь? =) dumb, без комментариев... |
| Автор: Romikgy 9.11.2006, 22:05 |
| docwar, я сколько смотрю , ты все просишь, помогите , помогите, только я до сих пор не понял , чем помочь то? |
| Автор: Reptile 10.11.2006, 10:52 |
docwar, есть 2-а способа:
ОЙ Сорри проект на Delphi (забыл какой раздел но думаю алгоритм под Builder переделать не сложно |
| Автор: docwar 10.11.2006, 12:59 |
| Reptile, буду благодарен, если проект под Билдер адаптируешь, а то открыть cpp не смог... Romikgy, надо открыть доп. форму, содержащую в Эдитах текст выделенной строки (причем каждый столбец - отдельный эдит), внести изменения, нажать на клавишу и заменить ранее выделенную строку измененной... =) |
| Автор: Reptile 10.11.2006, 13:42 | ||||
| Под рукой Builder-а нету Пишу здесь могут быть опечятки Вот это вешаеш на нажатие кнопки:
Это во второй форме на нажатие "Сохранить"(или как там у тебя...):
Если будут ошибки - пиши P.S.Не забудь подключить формы друг к другу. |
| Автор: docwar 10.11.2006, 17:11 |
| Reptile, спасибо огромное!!! Я писал такой же код, но строка после редактирования добавлялась ПОСЛЕ, а не заменяла строку, текст которой помещался в Эдиты... поэтому и решил, что метод мой ошибочный! )) Уже и перед нажатием на ОК (на форме редактирования) активировал ф-ию удаления строки и Form1->StringGrid1->RowCount--; писал..... Как быть? =) Добавлено @ 17:13 Строка после редактирования добавляется после всех остальных строк.... |
| Автор: Reptile 10.11.2006, 17:50 | ||||||||
Значит уже не такой
Не понял Етот код редактирует, для добавления строки делай похожую форму но увеличивай Form1->StringGrid1->RowCount и добавляй.
Как это?
Изменяет сущуствующие ячейки,он не добавляет В чем вопрос? |
| Автор: docwar 10.11.2006, 18:21 | ||
Вопрос в том, что строка, которую мы выбираем для редактирования остается неизменной, а отредактированная добавляется ПОСЛЕ всех строк таблицы...
Увеличивать RowCount или нет? Только смысл? Уменьшение желаемого результата тоже не принесло. Забыл сказать, что у меня на главной форме прописано StringGrid1->Options = StringGrid1->Options << goRowSelect; ..... но это ни на что не должно влиять... |
| Автор: Reptile 10.11.2006, 18:44 | ||||
Покажи код навешаный на кнопку ОК. А лучше прикрепи проект, я проверю и завтра выложу Какие у Тебя значения в FixedRows и FixedCols ? Нет, если надо только редактировать.
Это логично, иначе Ты бы не выделял всей строки |
| Автор: docwar 10.11.2006, 18:53 | ||
| FixedRows=1 StringGrid1->FixedCols = 0; Сожалею, но весь проект прикрепить не могу....
|
| Автор: Reptile 10.11.2006, 19:10 |
Тогда ничем не могу помочь У меня все работает Не могу понять Как |
| Автор: docwar 10.11.2006, 21:09 |
| Reptile, вопрос решил добавление переменной, хранящей номер строки, которую мы хотим отредактировать. Как же ты без этого сделал не пойму! Спасибо большое за помощь! |
| Автор: Reptile 11.11.2006, 10:27 |
Бодьше не чем не могу помоч |
| Автор: XPyCT 2.7.2008, 14:24 | ||||
что тут не ясного! хоть пост был давно но отпишу Предположим у вас стрингрид с одним выделенным рядом и одним выделенным столбцом! нумерация в стрингриде идет с нуля! и так первый фикс ряд =0 и фикс кол=0; идем дальше вам нужно к примеру выделить ряд под номером №5 кидаем на форму едит и кнопку Далее пишем там этот код по событию нажатия кнопки
Одновременное применение своиств goRowSelect и goEditing не дает эфекта (goEditing);- только goRowSelect |
| Автор: XPyCT 4.7.2008, 10:18 | ||||
| вот написал думаю поможет! прошу не пинать сам не силен но пишу то что знаю и делал! и так есть две формы fmBaza - Главная форма fmADD- Форма добавления товара SGBaza- StringGrid по нажатию клавиши ентер появляется форма добавления которая смотрит какая колонка и ряд и исходя из этого уже добавляет привожу код 1. Главная форма
2. Форма добавления
|