Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с файлом. Ведомость 
:(
    Опции темы
Beren
Дата 13.4.2011, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 28.3.2011

Репутация: нет
Всего: нет



Вот в чём суть. На форме 2 кнопки и таблица строк. Одна кнопка загружает файл и выводит в StringGrid имена и оценки в двух колонках. Это у меня получилось. Теперь надо, чтобы пользователь изменил значение оценки и сохранил в файл. goEditing =true поставил. Вот код. Спасибо.
Код

implementation
 
{$R *.dfm}
 const
N=50;
 type
 Trec=record
 Name:string;
 mark:integer;
 end ;
 Tgroup=array [1..n] of Trec;
 var
 Xgroup:Tgroup;
 Ngroup:integer;
 F:Textfile;
  i:integer;
 
procedure TForm1.Button1Click(Sender: TObject);
var
s:string ;
begin
StringGrid1.Cells [0,0]:='Name';
StringGrid1.Cells [1,0]:='Mark';
AssignFile(F,'C:\Text.txt');
Reset (F);
Ngroup:=0;
  while not EOF(f) do
      begin
      Ngroup:= NGroup+1;
      Readln(F,S);
      XGroup[Ngroup].Name:=s;
      Readln(F,S);
      XGroup[Ngroup].mark:=StrToInt(s);
      StringGrid1.Cells[0,Ngroup]:=Xgroup[Ngroup].name;
      StringGrid1.Cells[1,Ngroup]:= IntToStr(Xgroup[Ngroup].mark);
      end;
      CloseFile(F);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
  var
  s :string;
  sel1,sel2,j:integer;
 begin
    for i:=0 to StringGrid1.RowCount-1 do
    for j:=0 to StringGrid1.ColCount-1 do
   begin
   if                                                               //выбрана какая-то строка в колонке mark. В том и вопрос
   then
                  begin
         sel1:=i+1;
         sel2:=j+1;
         break
                  end;
   end;
   if sel>0 then
   begin
    Xgroup[sel].mark:=StrToInt (StringGrid1.Cells[sel1,sel2]);
      end;
         end;
 
      ASsignFile(F,'C:\Text.txt');
    Rewrite(F);
 
    for I:=1 to Ngroup do
    begin
       s:= Xgroup[i].name ;
        writeln(F,s);
        s:=IntToStr(Xgroup[i].mark);
         writeln(F,s);
 
    end;
    closeFile(F);
 
end;
 
 
end.


PM MAIL   Вверх
amsoft
Дата 14.4.2011, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 1
Всего: 4



если вся загвоздка в определении позиции текущей ячейки, то вот эти свойства тебе в помощь:
TCustomGrid.Row - индекс строки текущей ячейки
TCustomGrid.Col - индекс столбца текущей ячейки

Тогда и циклы тебе не нужны будут
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
Beren
Дата 14.4.2011, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 28.3.2011

Репутация: нет
Всего: нет



Поконкретней можно ?
PM MAIL   Вверх
amsoft
Дата 15.4.2011, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 1
Всего: 4



Цитата(Beren @  13.4.2011,  14:02 Найти цитируемый пост)
    for i:=0 to StringGrid1.RowCount-1 do
    for j:=0 to StringGrid1.ColCount-1 do
   begin
   if                                                               //выбрана какая-то строка в колонке mark. В том и вопрос
   then
                  begin
         sel1:=i+1;
         sel2:=j+1;
         break
                  end;
   end;


Как я понял в этих циклах ты пробегаешь по всем строкам и столбцам в поисках активной ячейки.
Вместо этого можно воспользоваться вышеуказанными свойствами компонента StringGrid. Тогда данный кусок кода примет следующий вид:

Код

sel1 := StringGrid1.Row+1;
sel2 := StringGrid1.Col+1;


--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
Beren
Дата 15.4.2011, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 28.3.2011

Репутация: нет
Всего: нет



Не получается (. При нажатии на Button2 появляется ошибка "is not a valid integer value". 

Код

procedure TForm1.Button2Click(Sender: TObject);
  var
  s :string;
  sel1,sel2,j:integer;

 begin
   sel1:=-1;
   sel2:=-1;
   sel1:= StringGrid1.Row+1;
sel2 := StringGrid1.Col+1;
   if (sel1>0) and (sel2>0) then
   begin
   for i:=0 to Ngroup do
    Xgroup[i].mark:=StrToInt (StringGrid1.Cells[sel1,sel2]);   //Вот здесь я совсем не уверен. Как сделать так, чтобы в выбранной ячейке оценка перезаписалась ?
      end;


     ASsignFile(F,'C:\Text.txt');
    Rewrite(F);

    for I:=1 to Ngroup do
    begin
       s:= Xgroup[i].name ;
        writeln(F,s);
        s:=IntToStr(Xgroup[i].mark);
         writeln(F,s);

    end;
    closeFile(F);

end;


end.


PM MAIL   Вверх
amsoft
Дата 15.4.2011, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 1
Всего: 4



Цитата(Beren @  15.4.2011,  13:56 Найти цитируемый пост)
появляется ошибка "is not a valid integer value


Это означает, что в данной ячейке нет данных или текст не может быть распознан как число
вместо StrToInt попробуй использовать TryStrToInt

Добавлено через 2 минуты и 35 секунд
TryStrToInt(StringGrid1.Cells[sel1,sel2],Xgroup[i].mark)
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
Beren
Дата 15.4.2011, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 28.3.2011

Репутация: нет
Всего: нет



А теперь при нажатии на button2 оценки обнуляютя
PM MAIL   Вверх
amsoft
Дата 16.4.2011, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 1
Всего: 4



Код

var
X: integer;
...
if TryStrToInt(StringGrid1.Cells[sel1,sel2],X)
then Xgroup[i].mark := X;



--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
Beren
Дата 16.4.2011, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 28.3.2011

Репутация: нет
Всего: нет



Теперь не обнуляется ). Но и не сохраняет изменённую оценку (
Код

procedure TForm1.Button2Click(Sender: TObject);
  var
  s :string;
  sel1,sel2,j,X:integer;
begin
   sel1:=-1;
   sel2:=-1;
sel1:= StringGrid1.Row+1;
sel2 := StringGrid1.Col+1;
   if (sel1>0) and (sel2>0) and TryStrToInt(StringGrid1.Cells[sel1,sel2],X) then
          begin
          for i:=1 to Ngroup do
          Xgroup[i].mark := X;
           end;
      for i:=1 to Ngroup do
      ASsignFile(F,'C:\Text.txt');
      Rewrite(F);
    for I:=1 to Ngroup do
                          begin
                          s:= Xgroup[i].name ;
                          writeln(F,s);
                          s:=IntToStr(Xgroup[i].mark);
                          writeln(F,s);
                           end;
       closeFile(F);

end;

PM MAIL   Вверх
amsoft
Дата 17.4.2011, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 1
Всего: 4



Код

sel1:= StringGrid1.Row;
sel2 := StringGrid1.Col;


Сразу не узрел ошибку - единицу прибавлять не надо
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
Beren
Дата 17.4.2011, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 28.3.2011

Репутация: нет
Всего: нет



Тогда и условие (sel1>0) and (sel2>0) получается не нужно.... Но всё равно не сохраняет
Код

procedure TForm1.Button2Click(Sender: TObject);
  var
  s :string;
  sel1,sel2,X:integer;
  begin
sel1:= StringGrid1.Row;
sel2 := StringGrid1.Col;
   if (TryStrToInt(StringGrid1.Cells[sel1,sel2],X)) then
       begin
       for i:=1 to Ngroup do
       Xgroup[i].mark := X;
        end;

    ASsignFile(F,'C:\Text.txt');
    Rewrite(F);

    for I:=1 to Ngroup do
               begin
                s:= Xgroup[i].name ;
                writeln(F,s);
                s:=IntToStr(Xgroup[i].mark);
               writeln(F,s);
                end;
    closeFile(F);

end;


end.


PM MAIL   Вверх
amsoft
Дата 17.4.2011, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 1
Всего: 4



Вообще не сохраняет или неверно сохраняет?
Цитата(Beren @  17.4.2011,  15:46 Найти цитируемый пост)
       
for i:=1 to Ngroup do
    Xgroup[i].mark := X;

У тебя неверно организован этот цикл. Здесь ты пробегаешь по списку всех учеников и для каждого ученика ставишь одну и ту же оценку (которая стоит в активной ячейке), тогда как оценку надо менять только для отдельного ученика (с индексом равным номеру строки текущей ячейки). ИМХО неудобный вариант.
Если у тебя сохранение списка идет по нажатию кнопки, то гораздо лучше обновить сразу весь массив и сохранить его в файл. 
В этом случае вообще отпадает необходимость поиска активной ячейки, да и без массива Xgroup вполне можно обойтись.

Загружаем список в таблицу:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
Y: integer;
F: TextFile;
S: string;
begin
Y := 0;
AssignFile(F,'C:\1.txt');
Reset (F);
while not EOF(f) do
      begin
      Readln(F,S);
      StringGrid1.Cells[0,Y] := S;
      Readln(F,S);
      StringGrid1.Cells[1,Y] := S;
      Inc(Y);
      end;
CloseFile(F);
end;


Сохраняем список:

Код

procedure TForm1.Button2Click(Sender: TObject);
var
Y: integer;
F: TextFile;
begin
AssignFile(F,'C:\1.txt');
Rewrite(F);
for Y:=1 to StringGrid1.RowCount do
    begin
    writeln(F,StringGrid1.Cells[0,Y-1]);
    writeln(F,StringGrid1.Cells[1,Y-1]);
    end;
CloseFile(F);
end;


Текстовый файл должен иметь следующий формат:

ученик1
оценка1
ученик2
оценка2
...
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
Beren
Дата 17.4.2011, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 28.3.2011

Репутация: нет
Всего: нет



Вообще не сохраняет. Хотелось бы , чтобы вы исправили мой вариант с циклом, а то получится, что вы просто всё за меня сделали.  Да, файл такой
Иванов
5
Петров
4
Сидоров
3
 
PM MAIL   Вверх
amsoft
Дата 17.4.2011, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 1
Всего: 4



У меня сохраняет, проверено.

Добавлено через 3 минуты и 52 секунды
PS Это оптимальный вариант для решения твоей задачи
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
Beren
Дата 17.4.2011, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 28.3.2011

Репутация: нет
Всего: нет



Ну всё равно спасибо
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0659 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.