Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > StringGrid


Автор: Garmahis 13.4.2005, 20:40
На форме лежит Notebook. У него две страницы на первой странице DBGrid связаная с базой данных, из которой DBGrid отображает некую информацию. Чтобы ввести новые данны надо нажать кнопку. При этом открывается вторая страница Notebook на которой расположены всякие спинэдиты, дататаймпикеры и стринггрид. Количество строк в гриде связано со значением спинэдита. В гриде две колонке. В первой идёт просто номерация от 1 до SpinEdit.Value. Во второй колонке можно выбирать строго заданные значения спомощью комбобокса. когда все данные вводятся нажимается кнопка добавить Notebook переключается на первую страницу и в DBGrid отображается соответственно на одну строку больше.
Проблема заключается в следующем. Когда во второй раз вызывается вторая страница ноутбука во второй колонке Стринггрида остаются старые значения!!!! замучелся что я только не делал и очищал этот грид и удалял строки всё равно почему-то эти данные остаются? Может кто подскажет что бы это могло быть?
Вот код:

1. Нажатие на кнопку новая запись

Код

PaperN.DataSource1.DataSet:=nil;
PaperN.ADOQuery1.Close;
PaperN.ADOQuery1.SQL.Clear;
PaperN.Notebook1.PageIndex:=1;


2. нажатие кнопки добавить запись

Код

PaperN.ADOQuery1.SQL.Add('SELECT * FROM PageN');
PaperN.ADOQuery1.Open;
for i:=0 to PaperN.SpinEdit3.Value-1 do
begin
PaperN.ADOQuery1.Append;
PaperN.ADOQuery1.FieldByName('ID').AsString:='PN'+IntToStr(a);
PaperN.ADOQuery1.FieldByName('Number').AsInteger:=StrToInt(PaperN.StringGrid1.Cells[0,i]);
PaperN.ADOQuery1.FieldByName('Name').AsString:=PaperN.StringGrid1.Cells[1,i];
PaperN.ADOQuery1.Post;
end;
PaperN.ADOQuery1.Close;
PaperN.ADOQuery1.SQL.Clear;
with StringGrid1 do
     for i := 0 to ColCount - 1 do
       for k := 0 to RowCount - 1 do
         Cells[i, k] := '';
PaperN.StringGrid1.RowCount:=1;
PaperN.Notebook1.PageIndex:=0;


3. Другой вариант нажатия кнопки добавить запись

Код

for i:=0 to PaperN.StringGrid1.RowCount-1 do begin
TFakeGrid(PaperN.StringGrid1).DeleteRow(0);
end;
PaperN.Notebook1.PageIndex:=0;


Помогите пожалуйста!!!!!!!!!!!!!

Автор: Bes 14.4.2005, 06:04
Может номера стрингридов перепутал? Короче моя версия - по невнимательности.

Автор: EKoshelev 14.4.2005, 07:04
Я не очень понял что грузится в стринг грид. Может объснишь и код заодно врисуешь, который это стринг грид заполняет?

Автор: Snowy 14.4.2005, 07:46
Просто чистим поля:
Код

with PaperN.StringGrid1 do
  for i:=0 to RowCount-1 do Cells[1,i]:='';

Если не поможет, значит ты где-то заполняешь грид перед отрисовкой.

Автор: Garmahis 14.4.2005, 10:30
На всей форме только один стринг грид. Программа предназначена для составления макета номера газеты. Пользователь с помошью спинедита указывает сколько страниц будет в номере. В стрингГриде создаётся соответствующее количество строк и первой колонке присваиваются порядковые номера:

Код

procedure TPaperN.SpinEdit3Change(Sender: TObject);
var
i:integer;
begin
PaperN.SpinEdit1.Modified:=True;
PaperN.StringGrid1.RowCount:=PaperN.SpinEdit3.Value;
for i:=0 to PaperN.SpinEdit3.Value do
PaperN.StringGrid1.Cells[0,i]:=IntToStr(i+1);
end;


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

Код

PaperN.ADOQuery1.SQL.Add('SELECT Name FROM Pages WHERE ID IN (SELECT Page FROM PP WHERE Paper=(SELECT ID from Papers WHERE Name='+#39+PaperN.ComboBox1.Text+#39'))');
PaperN.ADOQuery1.Open;
if PaperN.ADOQuery1.RecordCount>0 then
begin
PaperN.ADOQuery1.First;
while not PaperN.ADOQuery1.Eof do begin
PaperN.ComboBox2.Items.Add(PaperN.ADOQuery1.FieldByName('Name').AsString);
PaperN.ADOQuery1.Next;
end;
end;


Ну а потом этот комбобокс вызывается когда пользователь кликает на ячейку второго ряда. Основа взята из DRKB.
После нажатия кнопки добавить номер все данные записываются в базу данных. Очищается итемс комбобокса и очищается стринггрид причём последнюю я чистил и удалял строки и с бубном плясал, но всё равно эти чёртовы данные при повтороном обращении остаются!

Автор: _hunter 14.4.2005, 14:45
ну и пройдись отладчиком по коду. найди место которое рисует после возврата и смотри кто тот код вызвал.

Автор: Garmahis 14.4.2005, 18:06
Ха! Я прошёлся. Ни кто не рисует. Я поэтому и спарашиваю может грид как-то сохраняет эти строчки...

Автор: _hunter 14.4.2005, 18:09
значит что-то пропустил. грид их не сохраняет.

Автор: Garmahis 14.4.2005, 18:22
Ладно спасибо! Будем искать...

Автор: EKoshelev 15.4.2005, 14:44
Цитата
Ладно спасибо! Будем искать...


Наверняк нашёл уже какую-ньть тупую ошибку и успокоился smile

Автор: Akella 16.4.2005, 13:04
Попробуй StringGrid1.Clear;

Автор: Garmahis 21.4.2005, 18:28
такой команды нет...
Цитата
Наверняк нашёл уже какую-ньть тупую ошибку и успокоился

Нашёл smile
Но всё равно интересно. Скажем перед очисткой в таблице 14 строк. Потом запускается подпрограмма которая задаёт количество строк у таблицы = 1 потом идёт очистка таблицы соответственно чиститься эта самая одна строка. А вот потом, когда опять вызывается таблица и там создаётся скажем 20 строк то соответственно со 2 строки по 14 отображаются старые данные... Интересно...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)