Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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;

 smile 

Автор: Данкинг 27.11.2012, 10:57
Код

for i:=0 to DataSet.FieldCount -1 do 
 sss=DataSet.Fields[i];


Добавлено через 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
Цитата(Sazz @  27.11.2012,  13:02 Найти цитируемый пост)
Ошибку выбивает сразу после нажатия

Что-то не верится. Может быть, таблица не открыта?

Добавлено через 1 минуту и 56 секунд
И вообще эти строчки местами надо поменять, думается мне:
Код

DBgrid1.DataSource.DataSet.Post;
DBgrid1.DataSource.DataSet.Fields[i].AsString:=s;


Добавлено через 3 минуты и 12 секунд
И эти тоже:
Код

DBGrid1.DataSource.DataSet.next;

end;

Автор: 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 я и забыл:
Код

while not DBGrid1.DataSource.DataSet.Eof do
Begin
for z:=0 to DBgrid1.DataSource.DataSet.FieldCount -1 do
 begin 
  DBgrid1.DataSource.DataSet.Edit;
  DBgrid1.DataSource.DataSet.FieldByNumber(z).AsString:=update_dos(DBgrid1.DataSource.DataSet.FieldByNumber(z).AsString); 
  DBgrid1.DataSource.DataSet.Post;
 end;
 DBGrid1.DataSource.DataSet.next;
end;

Автор: Sazz 27.11.2012, 15:47
[Error] Unit3.pas(97): Undeclared identifier: 'FieldByNumber'

Автор: Данкинг 27.11.2012, 16:45
Код

DBgrid1.DataSource.DataSet.Fields.FieldByNumber(z).AsString:=update_dos(DBgrid1.DataSource.DataSet.Fields.FieldByNumber(z).AsString);

Автор: 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" - это уже точно не ко мне.

Автор: northener 27.11.2012, 23:50
Цитата(Sazz @  27.11.2012,  16:56 Найти цитируемый пост)
Access violation at address 004C77C0 in module 'Seconds.exe'. Read of address 00000000.

Читать внимательно http://www.gunsmoker.ru/2009/05/access-violation.html

Автор: Sazz 28.11.2012, 08:58
Спасибо!!!

Автор: Sazz 28.11.2012, 09:37
Сделал вот так без "FieldByNumber" и всё заработало, ещё раз спасибо за помощь, выручили!!!)
Код

while not DBGrid1.DataSource.DataSet.Eof do
Begin
for z:=0 to DBgrid1.DataSource.DataSet.FieldCount -1 do
 begin
  DBgrid1.DataSource.DataSet.Edit;
  DBgrid1.DataSource.DataSet.Fields[z].AsString:=update_dos(DBgrid1.DataSource.DataSet.Fields[z].AsString);
  DBgrid1.DataSource.DataSet.Post;
 end;
 DBGrid1.DataSource.DataSet.next;
end;


Добавлено через 5 минут и 38 секунд
 smile 

Автор: Akella 28.11.2012, 09:51
Цитата(Sazz @  27.11.2012,  15:47 Найти цитируемый пост)
FieldByNumber

FieldByName, наверное

Автор: Данкинг 28.11.2012, 10:25
FieldByNumber бывает нужен, когда делаешь экспорт из одного формата в другой, например, из .csv в .dbf. Тогда просто первое слово, ограниченное разделителем, записывается в первое поле таблицы. И т.д.

Автор: Akella 28.11.2012, 11:43
Цитата(Данкинг @  28.11.2012,  10:25 Найти цитируемый пост)
FieldByNumber

Не вижу такого свойства

Добавлено через 1 минуту и 53 секунды
А, нашёл, Fields.FieldByNumber 

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