Необходимо отобразить на форме таблицу БД Accsess. Однако по условиям задачи нужно использовать не DBGrid а простой StringGrid. Подскажите, каким образом это сделать при помощи StringGrid?

@темы: Delphi

Комментарии
16.07.2013 в 14:02

Птичка шизокрылая, Борец С Режимом Дня
А почему нельзя? Учебная задача? Тогда: каждый раз, когда нужно обновить тупо считывать построчно и запихивать данные в соотв. ячейки. Для больших запросов - очень долго.
Запрос открыть, и в цикле:
G.cells[3][i]:=IntToStr(DataSource.dataSet.FieldByname ('Price').asInteger);
DataSource.dataSet.next;

Встроенные методы - это в датабазных компоентах, то есть - как раз в дбридах. Весь автоматический апдейт - там же. Стринггриды не об этом и только построчно.
Еще вариант с ректальной тонзиллэктомией - написать хелпер или наследника, загнать датабазное туда.

Если не учебная - не надо. Просто не надо.
16.07.2013 в 15:14

Neitent, учебная, учебная. Один извращенец дал. )))
16.07.2013 в 15:44

Птичка шизокрылая, Борец С Режимом Дня
Rabid Coyote,
Один извращенец дал. )))
уже оффтопом, но удивительно бессмысленное занятие. Готовые датабазные компоненты - одна из важных фишечек дельфы, и уж точно знание дбшных штук куда полезнее тупо построчного переноса полей в ячейки. И по скорости, и по удобству чего угодно
16.07.2013 в 16:06

Neitent, Я согласен, что бессмысленное. )) Но надо, значит - надо. :)
17.07.2013 в 16:26

Neitent,

отображение записей с грехом пополам сделал. А как сделать добавление в StringGrid и сохранение в Access? С сохранением возник затор. ((


uses
DM1, DB;

{$R *.dfm}


procedure TForm1.BitBtn4Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i,j:integer;
begin

DM.AdoTable1.Open;
StringGrid1.ColCount:=DM.AdoTable1.FieldCount;
StringGrid1.FixedCols := 1;
StringGrid1.RowCount:=DM.AdoTable1.RecordCount + 1;
i := 0;
for j := 0 to DM.AdoTable1.FieldCount - 1 do
begin
StringGrid1.Cells[j, i]:=DM.AdoTable1.Fields.Fields[j].DisplayName;
end;

DM.AdoTable1.First;
i := 1;
while not DM.AdoTable1.EOF do
begin

for j := 0 to DM.AdoTable1.FieldCount - 1 do
begin
StringGrid1.Cells[j, i] := DM.AdoTable1.Fields.Fields[j].AsString;
end;
DM.AdoTable1.Next;
Inc(i);
end;

end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
StringGrid1.RowCount := StringGrid1.RowCount + 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 1 to StringGrid1.RowCount do
begin
if StringGrid1.Cells[0, i] = '' then
begin
DM.ADOTable1.Insert;
DM.AdoTable1.Fields.Fields[i].Value := StringGrid1.Cells[0, i];

end;
end;
end;

end.

17.07.2013 в 16:45

Птичка шизокрылая, Борец С Режимом Дня
Rabid Coyote,
хо-хо-хо, господин знает толк в извращениях

ТипаПравильно: Добавляем на форму кнопочку "Добавить", вылезает еще одна форма, на которой в нужные эдиты-чекбоксы и прочие забиваем нужные значения. При нажатии на ОК форма закрывается и запускается запросто на апдейт с этими параметрами. Это апдейт в базе. По-хорошему, тут должно быть переначитывание содержимого грида. И содержимое грида заново апдейтим.

Вариант два: при нажатии на добавить в гриде +1 строка добавляется. у грида в опциях ставим DoEditing. Ее заполняем, жмем ок - doEditing удаляем, содержимое новой строки добавляем. Плохо, потому что кривизна и никто не мешает юзеру редактировать старые поля (на бд это не повлияет, но не айс).

Сохранение - обычный запрос с insert, который отрабатывается tsql.Execsql
17.07.2013 в 17:30

Neitent, Что с insert я знаю - я не знаю, как это реализовать. )))
17.07.2013 в 22:57

Птичка шизокрылая, Борец С Режимом Дня
Rabid Coyote,
что именно? Сам запрос? Передача значений в запрос? - для этого почитайте про параметры запроса