Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Почему не работает прога


Автор: Code Magister 28.8.2004, 15:02
Кому не лень просмотреть прогу, помогите разобраться.
Прога при активации выводит данные из файла в СтрингГрид
(6 х 50 ячеек), а по щелчку на кнопке Сохранить сохраняет их.
Но она то не то выводит, то вообще не выводит:
Код
unit slipknot_;

interface

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

......................

TLol = 1 .. 5;

TMark=Record
o:TLol;
t:boolean;
k:boolean;
p:boolean;
end;

TRecord=Record
a:array[1..50, 1..6] of TMark;
end;


var
 Form1: TForm1;
 f:file of TRecord;
 ch:TRecord;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
var
r,c:integer;
begin
//==================файл=========================
AssignFile(f, 'C:\Slipknot.db');
{$I-}
Reset(f);
{$I+}
if IOResult <> 0 then
begin
if MessageDlg('Файл не найден. Создать новый?',
 mtWarning, [mbYES,mbNO],0) = mrYES
 then begin
 {$I-}
  Rewrite(f);
 {$I+}
 if IOResult <> 0
 then
  begin
   ShowMessage('ныззя саздать фаил. щя усьо закроетса');
   Form1.Close;
  end;
 end
else
begin
 Showmessage('ныззя работать бэз файла. щя апять усьо закроетса');
 Form1.Close;
end;
end;


//===================обновление=======================

{$I-}
Read(f, ch);
{$I+}
if IOResult <> 0 then ShowMessage('Ошибка')
else
for r:=1 to StringGrid1.RowCount-1 do
 for c:=1 to StringGrid1.ColCount-1 do
  if ch.a[c,r].p = True Then {p - показывает содержит ли переменная o данные}
     StringGrid1.Cells[c,r]:=IntToStr(ch.a[c,r].o);
end;

.........
//Кнопка СОХРАНИТЬ

procedure TForm1.Button3Click(Sender: TObject);
var
r,c:integer;
begin
for r:=1 to StringGrid1.RowCount-1 do
 for c:=1 to StringGrid1.ColCount-1 do
   if StringGrid1.Cells[c,r] <> ''
    then
     begin                  
     ch.a[c,r].p := True;{ну тоесть если p=true то значит перемення о                  содержит данные. Наверное тупой подход, но это не важно}
     ch.a[c,r].o := StrToInt(StringGrid1.Cells[c,r]);
     end
     else ch.a[c,r].p := False;

     Write(f,ch);
end;

Автор: Code Magister 31.8.2004, 13:00
МЛЯ, СПАСИБО ВСЕМ ЗА ДРУЖНЫЙ ОТВЕТ! ВСЕ С ВАМИ ПОНЯТНО

Автор: EKoshelev 2.9.2004, 12:15
Короче, тема такая. Ты ошибся, когда написал, что она их сохраняет. Если файл не был создан, то прога его создаёт. А если он уже есть, то она сверху не пишет. Я когда гонял твой код у меня С: в проводнике сидел и когда я сохранял то файл этот оставался на своём месте, а когда он перезаписывается то оказывается внизу списка в проводнике. Догнал? Короче не сохраняет.

Я в директивах типа {$I-} не рублю, но мне кажется, что дело в них. Я их никогда не юзаю и у меня пожизни поверх пишется без вопросов.

Автор: Code Magister 2.9.2004, 22:52
Хм.. ща буду разбираться, а {$I-} ... {$I+} - это что-то вроде прога берет на себя ответственность за ошибки между этими командами, тойсь винда не выдает сообщ. об ошибке. Если IOResult <> 0, то значит ошибки есть...

Автор: Messages 2.9.2004, 23:57
Лучше всего будет убрать директивы {I} и использовать try...except и try...finallity (вроде так). В хелпе про них много есть!
А вообше, ты выключаешь сообщения об ошибках (этой самой {I-}), создаешь чего-то и спрашиваешь код ошибки.
Это маразм!!!!!
Еще. Зачем тебе тип 1..5 используй Byte все равно и то и другое по байту! И "нуль" можешь использовать, как "в ячейке нет ничего".

Автор: Dimich 3.9.2004, 07:42
Цитата(Messages @ 2.9.2004, 23:57)
А вообше, ты выключаешь сообщения об ошибках (этой самой {I-}), создаешь чего-то и спрашиваешь код ошибки.
Это маразм!!!!!

Ничего это не маразм! Только если уж используешь {$I-}, то делай это на всю процедуру ввода-вывода и после каждого ввода-вывода проверяй IOresult
A так все правильно кажется делается, просто с самого первого взляда бросается в глага, что запись и чтение файла начинаются с текущей позиции (после первого чтения - это конец файла). Попробуй поставить перед Read и Write - FileSeek (f, 0);

И не забудь закрыть файл после работы с ним....

Автор: decoder 3.9.2004, 15:31
Попробуй вместо file of TRecord использовать TextFile и записуй туда поля своего TRecord...
И ещё: у меня глюк был, не помню, чё произошло, но суть в том, что цикл Фор без бегин и енд не инициализировался, хотя в теле была всего одна операция...
С директивой {$I} у тебя всё правильно.
Ещё один совет: Ф7.
Добавлено @ 15:33
к стати, Dimich правильно сказал
Цитата(Dimich @ 3.9.2004, 07:42)
И не забудь закрыть файл после работы с ним....

Скорее всего в этом дело...

Автор: Underdark 6.9.2004, 09:24
Молодец, Dimich!!!
Отлично про всё сказал! smile.gif

_Slipknot, такой вопросик, а что конкретно програмулина неправильно выводит в Грид?
И ещё, не делай так:
Цитата
вместо file of TRecord использовать TextFile и записуй туда поля своего TRecord...
(как тебе посоветовал Decoder).

С этим у тебя все в порядке...

Автор: RA 7.9.2004, 01:35
Надобы добавить
Код
CloseFile(f);

Автор: Code Magister 9.9.2004, 15:17
Цитата
_Slipknot, такой вопросик, а что конкретно програмулина неправильно выводит в Грид?

Выводит только значение первой переменной массива, а после еще нескольких нажатий кнопки "Обновить"(код которой равен коду FormActivate) выводит еще значения и то неправильные =)
Но мне тут уже столько написали, за что всем спасибо, что, надеюсь, теперь я разберусь. wink.gif

Автор: Underdark 11.9.2004, 14:29
Пока ещё не понял почему у тебя такая фиговина, но кажется энто всё из-за неправильного сохранения.
Единственное, ещё может ты перепутал строки и колонки в самом массиве при сохранении, но это навряд ли...
Удачи! smile.gif

Автор: Конструктор 14.9.2004, 10:09
А не проще ли сохранять данные в текстовый файл записывая в него собственно строки из StringGrid? Последовательно записать, потом последовательно считать.

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