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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Типизорованные файлы+StringGrid, Удаление не выходит... 
:(
    Опции темы
Zlo
  Дата 23.5.2007, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Посмотрите плиз процедуру 
procedure TForm1.Button3Click(Sender: TObject);
В ней реализовано удаление записи из файла, но при обновлении таблици записи всеравно остаются...
Не могу понять почему вроде и логика правильная...
Лучше и нагляднее наверное будет сразу весь проект посмареть наверное, прикрепил к теме, т.к. вообще уже не вкурю почему не пашет.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, Menus;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    StringGrid1: TStringGrid;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    GroupBox2: TGroupBox;
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    GroupBox3: TGroupBox;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    procedure FormCreate(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 {$J+}
 
var
  Form1: TForm1;
  SelectRow:Integer;

implementation

uses Unit2;
type
   TableRec=Record
       Game,
       Gener:String[255];
       Reliz:TDateTime;
       Format:String[255];
       FormatCount,
       Count:integer;
       Price:Real;
       Full:Boolean;
   end;
Table= array[1..100] of TableRec;
var
  Tab:Table;
  f:file of Table;

{$R *.dfm}
function MyDir():string;
var
  s:string;
begin
     s:=ExtractFilePath(ParamStr(0));
     Result:=s;
end;
//==============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
    StringGrid1.Cells[0,0]:='Игра';
    StringGrid1.Cells[1,0]:='Жанр';
    StringGrid1.Cells[2,0]:='Релиз';
    StringGrid1.Cells[3,0]:='Формат';
    StringGrid1.Cells[4,0]:='Кол-во';
    StringGrid1.Cells[5,0]:='Склад';
    StringGrid1.Cells[6,0]:='Цена';

    //AssignFile(f,MyDir+'base.dat');

    Form1.N7.Click; //При запуске проги сразу заполняем таблицу
end;

procedure TForm1.N6Click(Sender: TObject); //Сохранение
var
   i:integer;
begin
{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
//Это для создания базы
{
  for i:=1 to 100 do begin
      Tab[i].Full:=false;
  end;
  }
{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
    AssignFile(f,MyDir+'base.dat');
    Rewrite(f);
    Write(f,Tab);
    CloseFile(f);
end;

procedure TForm1.N7Click(Sender: TObject);//Открытие
var i,j,k:integer;
begin
    AssignFile(f,MyDir+'base.dat');
    reset(f);
    while not eof(f) do begin
        read(f,Tab);
    end;
    {
    i:=1;
    while Tab[i].Full<>false do i:=i+1;//Ищем пустую запись
    StringGrid1.RowCount:=i+1;//Устанавливаем количество строк в таблице =ое
                              //количеству заполненых записей
    }
    i:=1;
    for j:=0 to 101 do begin  //Заполняем таблицу из файловой переменной
       if Tab[j].Full=true then begin //Если запись не пуста то выводим ее в таблицу
            Form1.StringGrid1.Cells[0,i]:=Tab[j].Game;
            Form1.StringGrid1.Cells[1,i]:=Tab[j].Gener;
            Form1.StringGrid1.Cells[2,i]:=DateToStr(Tab[j].Reliz);
            Form1.StringGrid1.Cells[3,i]:=Tab[j].Format;
            Form1.StringGrid1.Cells[4,i]:=IntToStr(Tab[j].FormatCount);
            Form1.StringGrid1.Cells[5,i]:=IntToStr(Tab[j].Count);
            Form1.StringGrid1.Cells[6,i]:=FloatToStr(Tab[j].Price);
            i:=i+1;
       end;
    end;
    CloseFile(f);
end;

procedure TForm1.N8Click(Sender: TObject);
begin
   Form2.ShowModal; //Юзеров обламываем всегда, особенно криворуких =)
end;

procedure TForm1.Button1Click(Sender: TObject);//Поиск
var
  i:integer;
begin
    {AssignFile(f,MyDir+'base.dat');
    reset(f);
    while not eof(f) do begin
        read(f,Tab);
    end;}
    For i:=0 to 101 do begin
        if Pos(Edit1.Text,StringGrid1.Cells[0,i])>0 then begin
           StringGrid1.LeftCol:=0;
           StringGrid1.TopRow:=i;
           //StringGrid1.SetFocus;
           break;
        end;
    end;
end;

procedure TForm1.Button3Click(Sender: TObject);//Удаление
var i,j,k:integer;
begin
    AssignFile(f,MyDir+'base.dat');
    reset(f);
    while not eof(f) do begin
        read(f,Tab);
    end;
    CloseFile(f);

    For i:=0 to 101 do begin
        if ((StringGrid1.Cells[0,SelectRow]=Tab[i].Game) and
            (StringGrid1.Cells[1,SelectRow]=Tab[i].Gener)and
            (StringGrid1.Cells[2,SelectRow]=DateToStr(Tab[i].Reliz)) and
            (StringGrid1.Cells[3,SelectRow]=Tab[i].Format) and
            (StringGrid1.Cells[4,SelectRow]=IntToStr(Tab[i].FormatCount)) and
            (StringGrid1.Cells[5,SelectRow]=IntToStr(Tab[i].Count)) and
            (StringGrid1.Cells[6,SelectRow]=FloatToStr(Tab[i].Price)))then begin
           StringGrid1.LeftCol:=0;
           StringGrid1.TopRow:=SelectRow;
           Tab[i].Full:=false;
           //Form1.N7.Click; //Обновляем таблицу
           break;
        end;
    end;
    //===================================================
    AssignFile(f,MyDir+'base.dat');
    reset(f);
    while not eof(f) do begin
        read(f,Tab);
    end;

    i:=1;
    for j:=0 to 101 do begin  //Заполняем таблицу из файловой переменной
       if Tab[j].Full=true then begin //Если запись не пуста то выводим ее в таблицу
            Form1.StringGrid1.Cells[0,i]:=Tab[j].Game;
            Form1.StringGrid1.Cells[1,i]:=Tab[j].Gener;
            Form1.StringGrid1.Cells[2,i]:=DateToStr(Tab[j].Reliz);
            Form1.StringGrid1.Cells[3,i]:=Tab[j].Format;
            Form1.StringGrid1.Cells[4,i]:=IntToStr(Tab[j].FormatCount);
            Form1.StringGrid1.Cells[5,i]:=IntToStr(Tab[j].Count);
            Form1.StringGrid1.Cells[6,i]:=FloatToStr(Tab[j].Price);
            i:=i+1;
       end;
    end;
    CloseFile(f);
    //==========================================================================
    //Сохраняем =)
    AssignFile(f,MyDir+'base.dat');
    Rewrite(f);
    Write(f,Tab);
    CloseFile(f);
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
    SelectRow:=ARow;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
    AssignFile(f,MyDir+'base.dat');
    reset(f);
    while not eof(f) do begin
        read(f,Tab);
    end;
    CloseFile(f);

    For i:=1 to 100 do begin
        if ((StringGrid1.Cells[0,SelectRow]=Tab[i].Game) and
            (StringGrid1.Cells[1,SelectRow]=Tab[i].Gener)and
            (StringGrid1.Cells[2,SelectRow]=DateToStr(Tab[i].Reliz)) and
            (StringGrid1.Cells[3,SelectRow]=Tab[i].Format) and
            (StringGrid1.Cells[4,SelectRow]=IntToStr(Tab[i].FormatCount)) and
            (StringGrid1.Cells[5,SelectRow]=IntToStr(Tab[i].Count)) and
            (StringGrid1.Cells[6,SelectRow]=FloatToStr(Tab[i].Price)))then begin
           //StringGrid1.LeftCol:=0;
           //StringGrid1.TopRow:=SelectRow;
           Tab[i].Count:=Tab[i].Count-1;
           ShowMessage(IntToStr(Tab[i].Count));
           Form1.N7.Click; //Обновляем таблицу
           break;
        end;
    end;
    //Сохраняем =)
    AssignFile(f,MyDir+'base.dat');
    Rewrite(f);
    Write(f,Tab);
    CloseFile(f);
end;

end.


Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  GameFile.zip 16,36 Kb
PM MAIL   Вверх
Zlo
  Дата 23.5.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Так ладно я смотрю всем лень копаться в исходниках.
И так вот проблемная процедура:
Код

procedure TForm1.Button3Click(Sender: TObject);//Удаление
var i,j,k:integer;
begin
    AssignFile(f,MyDir+'base.dat');
    reset(f);
    while not eof(f) do begin
        read(f,Tab);
    end;
    CloseFile(f);

    For i:=0 to 101 do begin
        if ((StringGrid1.Cells[0,SelectRow]=Tab[i].Game) and
            (StringGrid1.Cells[1,SelectRow]=Tab[i].Gener)and
            (StringGrid1.Cells[2,SelectRow]=DateToStr(Tab[i].Reliz)) and
            (StringGrid1.Cells[3,SelectRow]=Tab[i].Format) and
            (StringGrid1.Cells[4,SelectRow]=IntToStr(Tab[i].FormatCount)) and
            (StringGrid1.Cells[5,SelectRow]=IntToStr(Tab[i].Count)) and
            (StringGrid1.Cells[6,SelectRow]=FloatToStr(Tab[i].Price)))then begin
           StringGrid1.LeftCol:=0;
           StringGrid1.TopRow:=SelectRow;
           Tab[i].Full:=false;
           Form1.N7.Click; //Обновляем таблицу
           break;
        end;
    end;
   //Сохраняем =)
    AssignFile(f,MyDir+'base.dat');
    Rewrite(f);
    Write(f,Tab);
    CloseFile(f);
end;

Дело в том, что прога поподает в условие и выполняет действия по then begin, но вот изменения почему-то не сохраняются...
Хотя такой код работает без проблем:
Код

procedure TForm1.Button5Click(Sender: TObject);
begin
    //Загрузка
    AssignFile(f,MyDir+'base.dat');
    reset(f);
    while not eof(f) do begin
        read(f,Tab);
    end;
    CloseFile(f);

    Tab[3].Full:=false;
    Tab[4].Full:=false;

    //Сохраняем =)
    AssignFile(f,MyDir+'base.dat');
    Rewrite(f);
    Write(f,Tab);
    CloseFile(f);
end;


Добавлено @ 09:55
{==================================================================}
Теперь чуть меняем код, на вот так:
Код

procedure TForm1.Button5Click(Sender: TObject);
var i:integer;
begin
    //Загрузка
    AssignFile(f,MyDir+'base.dat');
    reset(f);
    while not eof(f) do begin
        read(f,Tab);
    end;
    CloseFile(f);

    For i:=0 to 100 do begin
        if (StringGrid1.Cells[0,SelectRow]=Tab[i].Game)then begin
           //StringGrid1.LeftCol:=0;
           //StringGrid1.TopRow:=SelectRow;
           Tab[i].Full:=false;
           ShowMessage(Tab[i].Game);
           Form1.N7.Click; //Обновляем таблицу
           break;
        end;
    end;

    //Сохраняем =)
    AssignFile(f,MyDir+'base.dat');
    Rewrite(f);
    Write(f,Tab);
    CloseFile(f);
end;


И сохранение не работает.
Вот ктонить может сказать в чем проблема?

Это сообщение отредактировал(а) Zlo - 23.5.2007, 10:19
PM MAIL   Вверх
MetalFan
Дата 23.5.2007, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



молодца... уж если выложил листинг, будь добр указать типы используемых глобальных переменных и полей класса...



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Zlo
  Дата 23.5.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(MetalFan @  23.5.2007,  14:00 Найти цитируемый пост)
молодца... уж если выложил листинг, будь добр указать типы используемых глобальных переменных и полей класса...

В первом посте это есть:
Код

type
   TableRec=Record
       Game,
       Gener:String[255];
       Reliz:TDateTime;
       Format:String[255];
       FormatCount,
       Count:integer;
       Price:Real;
       Full:Boolean;
   end;
Table= array[1..100] of TableRec;
var
  Tab:Table;
  f:file of Table;

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


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



первое, что бросилось в глаза:

Цитата(Zlo @  23.5.2007,  14:56 Найти цитируемый пост)
Table= array[1..100] of TableRec;
var
  Tab:Table;


Цитата(Zlo @  23.5.2007,  09:43 Найти цитируемый пост)
For i:=0 to 100 do begin

а цыкл идет с 0...
да и вообще код жудко корявый...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Zlo
Дата 24.5.2007, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(MetalFan @  23.5.2007,  16:42 Найти цитируемый пост)
да и вообще код жудко корявый... 

Ну насчет циклов я согласен, но дело было не в циклах. А вообще в чем корявость заключается объясни, просто что бы на будущее знать?

Я так и не разобрался почему не работает, но решение проблемы нашел путем выноса неработающего кода в отдельную функцию.
PM MAIL   Вверх
MetalFan
Дата 24.5.2007, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



корявость во всем.
начнем с объявления типов и переменных:

Цитата(Zlo @  23.5.2007,  14:56 Найти цитируемый пост)
Table= array[1..100] of TableRec;

почему ограничение на 100 записей? для чего? а если больше? а если меньше - то ресурсы зря расходоваться будут.


Код

procedure TForm1.Button5Click(Sender: TObject);
var i:integer;
begin
    AssignFile(f,MyDir+'base.dat');
    reset(f);
    while not eof(f) do begin //ЗАЧЕМ этот цикл?
        read(f,Tab);
    end;
    CloseFile(f);
    For i:=0 to 100 do begin //опять же цикл с нуля, а массив с 1... должен быть ошибк
        if (StringGrid1.Cells[0,SelectRow]=Tab[i].Game)then begin //
           Tab[i].Full:=false;
           ShowMessage(Tab[i].Game);
           Form1.N7.Click; //убил бы за такое...
           break;
        end;
    end;
    AssignFile(f,MyDir+'base.dat');
    Rewrite(f);
    Write(f,Tab);
    CloseFile(f);
end;





Это сообщение отредактировал(а) MetalFan - 24.5.2007, 12:06


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Zlo
Дата 24.5.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(MetalFan @  24.5.2007,  12:05 Найти цитируемый пост)
орявость во всем.
начнем с объявления типов и переменных:

Цитата(Zlo @  23.5.2007,  14:56 Найти цитируемый пост)
Table= array[1..100] of TableRec;

почему ограничение на 100 записей? для чего? а если больше? а если меньше - то ресурсы зря расходоваться будут.


Я не гуру програмер, конечно оно казе понятно что это не самое хорошее решение, но что умею-так и делал. Если покажешь как сделать динамический массив к моей задаче я тебе только спасибо скажу.
Код

while not eof(f) do begin //ЗАЧЕМ этот цикл?
        read(f,Tab);
    end;

Чесн гря так научили, почему именно так хз, всегда так писал.
Тоесть я так понимаю
Код

read(f,Tab);

сразу считывает весь файл в переменную, поэтому цикл не нужен, так?
Код

For i:=0 to 100 do begin //опять же цикл с нуля, а массив с 1... должен быть ошибк

Насчет этого полностью согласен, я потом впоправил это.
Код

Form1.N7.Click; //убил бы за такое...

Это почему? В данной задаче на мой взгляд лучше сделать именно так, тк лишние 10 строк кода там совершенно никчему.
PM MAIL   Вверх
MetalFan
Дата 25.5.2007, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(Zlo @  24.5.2007,  15:04 Найти цитируемый пост)
Если покажешь как сделать динамический массив к моей задаче я тебе только спасибо скажу

почитай книжки по делфи, такие элементарные вещи показывать просто не интересно.


Цитата(Zlo @  24.5.2007,  15:04 Найти цитируемый пост)
Это почему? В данной задаче на мой взгляд лучше сделать именно так, тк лишние 10 строк кода там совершенно никчему. 

мог бы вынести код из обработчика события в отдельную процедуру с нормальным названием. это не 10 строк, зато все наглядно и понятно


--------------------
There are always someone smarter than you...
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.0630 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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