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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему не работает прога, В чем ошибка? 
:(
    Опции темы
Code Magister
  Дата 28.8.2004, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Magister of Code
*


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

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



Кому не лень просмотреть прогу, помогите разобраться.
Прога при активации выводит данные из файла в СтрингГрид
(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;

--------------------
PM MAIL WWW ICQ   Вверх
Code Magister
Дата 31.8.2004, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Magister of Code
*


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

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



МЛЯ, СПАСИБО ВСЕМ ЗА ДРУЖНЫЙ ОТВЕТ! ВСЕ С ВАМИ ПОНЯТНО
--------------------
PM MAIL WWW ICQ   Вверх
EKoshelev
Дата 2.9.2004, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
Code Magister
Дата 2.9.2004, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Magister of Code
*


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

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



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

Это сообщение отредактировал(а) _Slipknot - 2.9.2004, 22:54
--------------------
PM MAIL WWW ICQ   Вверх
Messages
Дата 2.9.2004, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Лучше всего будет убрать директивы {I} и использовать try...except и try...finallity (вроде так). В хелпе про них много есть!
А вообше, ты выключаешь сообщения об ошибках (этой самой {I-}), создаешь чего-то и спрашиваешь код ошибки.
Это маразм!!!!!
Еще. Зачем тебе тип 1..5 используй Byte все равно и то и другое по байту! И "нуль" можешь использовать, как "в ячейке нет ничего".
PM MAIL   Вверх
Dimich
Дата 3.9.2004, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

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

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

Это сообщение отредактировал(а) Dimich - 3.9.2004, 07:43
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
decoder
Дата 3.9.2004, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

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



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

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

--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
Underdark
Дата 6.9.2004, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

С этим у тебя все в порядке...
PM MAIL   Вверх
RA
Дата 7.9.2004, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

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



Надобы добавить
Код
CloseFile(f);

PM   Вверх
Code Magister
Дата 9.9.2004, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Magister of Code
*


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

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



Цитата
_Slipknot, такой вопросик, а что конкретно програмулина неправильно выводит в Грид?

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

Это сообщение отредактировал(а) _Slipknot - 9.9.2004, 15:24
--------------------
PM MAIL WWW ICQ   Вверх
Underdark
Дата 11.9.2004, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пока ещё не понял почему у тебя такая фиговина, но кажется энто всё из-за неправильного сохранения.
Единственное, ещё может ты перепутал строки и колонки в самом массиве при сохранении, но это навряд ли...
Удачи! smile.gif
PM MAIL   Вверх
Конструктор
Дата 14.9.2004, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 641
Регистрация: 12.5.2004
Где: Москва

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



А не проще ли сохранять данные в текстовый файл записывая в него собственно строки из StringGrid? Последовательно записать, потом последовательно считать.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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