| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Обращение к данным DataSet |
| Автор: Sazz 27.11.2012, 10:26 |
| Доброго времени суток!!! Такая проблема, есть код который кодирует данные DataSet, всё работает нормально, вот только код работает для одной колонки, а хотелось бы сделать так чтобы действия применялись ко всем колонкам??? Дело в том что мы изначально не знаем сколько колонок будет, так как загружается необходимый файл в DBGrid, через TTable и DataSourse, как сделать чтобы код прошёлся по всем колонкам (заранее не известным)??? Помогите разобраться 4 день не могу решить проблему(((( Буду очень признателен за любую помощь! Вот Код: var s : string; z: integer; DBGrid1.DataSource.DataSet.First; while not DBGrid1.DataSource.DataSet.Eof do Begin s := DBgrid1.DataSource.DataSet.Fields[z].AsString; DBgrid1.DataSource.DataSet.Edit; s:=update_win(s); DBgrid1.DataSource.DataSet.Fields[z].AsString:=s; DBGrid1.DataSource.DataSet.next; |
| Автор: Данкинг 27.11.2012, 10:57 | ||
Добавлено через 50 секунд Кстати, .Edit вижу, а .Post - нет. |
| Автор: Sazz 27.11.2012, 11:37 |
| Ошибка: List index out of bounds (31) |
| Автор: Данкинг 27.11.2012, 11:54 |
| На какой строке ошибка? Код целиком покажи. |
| Автор: Sazz 27.11.2012, 12:02 |
| Ошибку выбивает сразу после нажатия procedure TForm3.Button3Click(Sender: TObject); begin if Table1.TableName = '' then begin ShowMessage('Файл не загружен!') ; end; if Table1.TableName <> '' then begin z:=StrToInt(Edit1.Text); DBGrid1.DataSource.DataSet.First; for i:=0 to DBgrid1.DataSource.DataSet.FieldCount -1 do s := DBgrid1.DataSource.DataSet.Fields[i].AsString; while not DBGrid1.DataSource.DataSet.Eof do Begin for i:=0 to DBgrid1.DataSource.DataSet.FieldCount -1 do s := DBgrid1.DataSource.DataSet.Fields[i].AsString; DBgrid1.DataSource.DataSet.Edit; s:=update_dos(s); DBgrid1.DataSource.DataSet.Post; DBgrid1.DataSource.DataSet.Fields[i].AsString:=s; DBGrid1.DataSource.DataSet.next; end; end; end; А вот сама функция update_dos(s): function TForm3.update_dos(s: string): string; begin i:=1; c:=''; while i< length(s)+1 do begin l:=ord(s[i]); inc(i); if (l>=128) and (l<=192)then l:=l+64 else if (l>=224) and (l<240) then l:=l+16 else if l=241 then l:=184 else if l=240 then l:=168; dd:=chr(l); c:=c+dd; end; update_dos:=c; end; но с ней всё в порядке! Добавлено через 3 минуты и 4 секунды Извини с опечаткой скинул, вот: procedure TForm3.Button3Click(Sender: TObject); begin if Table1.TableName = '' then begin ShowMessage('Файл не загружен!') ; end; if Table1.TableName <> '' then begin z:=StrToInt(Edit1.Text); DBGrid1.DataSource.DataSet.First; while not DBGrid1.DataSource.DataSet.Eof do Begin for i:=0 to DBgrid1.DataSource.DataSet.FieldCount -1 do s := DBgrid1.DataSource.DataSet.Fields[i].AsString; DBgrid1.DataSource.DataSet.Edit; s:=update_dos(s); DBgrid1.DataSource.DataSet.Post; DBgrid1.DataSource.DataSet.Fields[i].AsString:=s; DBGrid1.DataSource.DataSet.next; end; end; end; |
| Автор: superVad 27.11.2012, 12:52 |
| Sazz, пожалуйста прочитай - http://forum.vingrad.ru/forum/topic-353769.html. |
| Автор: Данкинг 27.11.2012, 13:23 | ||||
Что-то не верится. Может быть, таблица не открыта? Добавлено через 1 минуту и 56 секунд И вообще эти строчки местами надо поменять, думается мне:
Добавлено через 3 минуты и 12 секунд И эти тоже:
|
| Автор: Sazz 27.11.2012, 13:29 |
| Нет всё открыто! сейчас выдаёт ту же ошибку но с другими параметрами: List index out of bounds (2), в загружаемой таблице тоже 2 колонки! procedure TForm3.Button3Click(Sender: TObject); begin if Table1.TableName = '' then begin ShowMessage('Файл не загружен!') ; end; if Table1.TableName <> '' then begin DBGrid1.DataSource.DataSet.First; while not DBGrid1.DataSource.DataSet.Eof do Begin for z:=0 to DBgrid1.DataSource.DataSet.FieldCount -1 do s := DBgrid1.DataSource.DataSet.Fields[z].AsString; DBgrid1.DataSource.DataSet.Edit; s:=update_dos(s); DBgrid1.DataSource.DataSet.Post; DBgrid1.DataSource.DataSet.Fields[z].AsString:=s; DBGrid1.DataSource.DataSet.next; end; end; Добавлено через 11 минут и 31 секунду Строки местами поменял, но ничего не поменялось. |
| Автор: Данкинг 27.11.2012, 15:06 | ||
Да, про FieldName я и забыл:
|
| Автор: Sazz 27.11.2012, 15:47 |
| [Error] Unit3.pas(97): Undeclared identifier: 'FieldByNumber' |
| Автор: Данкинг 27.11.2012, 16:45 | ||
|
| Автор: Sazz 27.11.2012, 16:56 |
| --------------------------- Seconds --------------------------- Access violation at address 004C77C0 in module 'Seconds.exe'. Read of address 00000000. --------------------------- ОК --------------------------- |
| Автор: Данкинг 27.11.2012, 16:58 |
| Ну, "Access violation" - это уже точно не ко мне. |
| Автор: Sazz 28.11.2012, 08:58 |
| Спасибо!!! |
| Автор: Sazz 28.11.2012, 09:37 | ||
Сделал вот так без "FieldByNumber" и всё заработало, ещё раз спасибо за помощь, выручили!!!)
Добавлено через 5 минут и 38 секунд |
| Автор: Akella 28.11.2012, 09:51 |
FieldByName, наверное |
| Автор: Данкинг 28.11.2012, 10:25 |
| FieldByNumber бывает нужен, когда делаешь экспорт из одного формата в другой, например, из .csv в .dbf. Тогда просто первое слово, ограниченное разделителем, записывается в первое поле таблицы. И т.д. |
| Автор: Akella 28.11.2012, 11:43 |
Не вижу такого свойства Добавлено через 1 минуту и 53 секунды А, нашёл, Fields.FieldByNumber |