Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.09.2009, 14:23
Scooter Scooter вне форума
Прохожий
 
Регистрация: 02.07.2007
Сообщения: 18
Репутация: 10
Вопрос TFilestream + Записи не могу понять ((

Здравствуйте! Не могу понять в чем ошибка: описываю свой тип TUpdateInf присваиваю переменной этого типа значения записываю все это в файл с помошью TFileStream потом читаю и вывожу все это на экран с помошью ShowMessage, одно из двух либо выходит абракадабра либо вылетает ошибка Access violation at address... В чем обшибка подскажите?



Код:
  
private
    { Private declarations }
  public
    { Public declarations }
  end;

TUpdateInf = Record
             FName: Array[0..999] of String;
             FUpd: Array[0..999] of Boolean;
             End;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BWriteClick(Sender: TObject);
var
I:SmallInt;
F:TFileStream;
Inf:TUpdateInf;
begin
For I:=0 to 9 do
    Begin
    Inf.FName[i]:='test' + inttostr(i);
    Inf.FUpd[i]:=True;
    End;

F:=TFileStream.Create('C:\1.txt',FmCreate);
F.WriteBuffer(Inf,SizeOf(TUpdateInf));
F.Free;
end;

procedure TForm1.BReadClick(Sender: TObject);
var
I:SmallInt;
F:TFileStream;
Inf:TUpdateInf;
begin
F:=TFileStream.Create('C:\1.txt',FmOpenRead);
F.ReadBuffer(Inf,SizeOf(TUpdateInf));
F.Free;

For i:=0 To 9 do
    Begin
    ShowMessage(Inf.FName[i]);
    End;

end;
Ответить с цитированием
  #2  
Старый 28.09.2009, 14:26
ComputerMonster ComputerMonster вне форума
Заблокирован
 
Регистрация: 28.09.2009
Сообщения: 6
Репутация: 10
Радость

F.WriteBuffer(^inf,sizeof(UpdateInf));
пропустили ^.

У меня вот так вот программа работает.

F.ReadBuffer(^inf,sizeof(UpdateInf));
Ответить с цитированием
  #3  
Старый 28.09.2009, 14:31
Scooter Scooter вне форума
Прохожий
 
Регистрация: 02.07.2007
Сообщения: 18
Репутация: 10
По умолчанию

Понял что проблема в массивах описанного типа... Ну почему так делать нельзя и как можно не пойму...
Ответить с цитированием
  #4  
Старый 28.09.2009, 14:34
ComputerMonster ComputerMonster вне форума
Заблокирован
 
Регистрация: 28.09.2009
Сообщения: 6
Репутация: 10
Счастье

Borland всегда что-то неправильно сама делает. И реализация возможностей, к сожалению у Borland отстает на десятки лет.

Например поддержка GDI+ была уже в Microsoft Visual Studio 2003.

А даже в Borland Delphi 2009 нет такой возможности!

Покажите лог компилятора!
Ответить с цитированием
  #5  
Старый 28.09.2009, 14:40
Scooter Scooter вне форума
Прохожий
 
Регистрация: 02.07.2007
Сообщения: 18
Репутация: 10
По умолчанию

ComputerMonster логи компилятора пустые если я правильно понял про какие вы логи спрашиваете, компилируеться все на ура а вот работать не хочет...

P.S: Как просматреть логи?
Ответить с цитированием
  #6  
Старый 28.09.2009, 14:44
ComputerMonster ComputerMonster вне форума
Заблокирован
 
Регистрация: 28.09.2009
Сообщения: 6
Репутация: 10
Радость

Они где внизу в компиляторе. Ладно.

Пришлите саму программу мне на личный e-mail.

Я протестирую её и скажу Вам.

Личный e-mail вы узнаете, нажав на ссылку ComputerMonster. Появится всплывающее меню, и пишите на e-mail. Вложение в письмо сделайте.

Вложение - это прикрепление файла к письму. Вложите программу EXE, т.е. сам исполняемый файл.
Ответить с цитированием
  #7  
Старый 28.09.2009, 14:53
Scooter Scooter вне форума
Прохожий
 
Регистрация: 02.07.2007
Сообщения: 18
Репутация: 10
По умолчанию

ComputerMonster да я про эти логи и говорил, подумал может еще какие есть )))... Спасибо за подробное объяснение про почту и вложения... ну я уж не такой noob ... Щас вышлю вместе с исходниками...
Ответить с цитированием
  #8  
Старый 28.09.2009, 14:59
Scooter Scooter вне форума
Прохожий
 
Регистрация: 02.07.2007
Сообщения: 18
Репутация: 10
По умолчанию

Написать на е-маil не получилось пишет:
К сожалению, запрашиваемая Вами страница не найдена (404 Not Found).

Ладно попробую сам разобраться или может еще кто нибудь ответит ((... Спасибо за помошь
Ответить с цитированием
  #9  
Старый 28.09.2009, 15:41
Scooter Scooter вне форума
Прохожий
 
Регистрация: 02.07.2007
Сообщения: 18
Репутация: 10
По умолчанию

Неужели никто не подскажет... Помогите плиз...
Ответить с цитированием
  #10  
Старый 28.09.2009, 15:57
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,035
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Так вообще лучше не работать.
Тебе обязател но массивы из 100 элементов?
Я бы сделал 2 класса.
Первый - пара имя-флаг, фторой - список первых классов. Собственно, так я всегда и делаю.
Ща набросаю код и опубликую.
Ответить с цитированием
  #11  
Старый 28.09.2009, 16:10
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

Цитата:
FName: Array[0..999] of String;
А откуда программе знать, какой длины строка? строки и другие динамические объекты пишутся так:
Код:
var i, l:integer;
...
for i:=0 to 999 do
  begin
    l:=Length(Inf.FName[i]);
    F.WriteBuffer(l, SizeOf(Integer)); //записываем длину i-той строки
    F.WriteBuffer(Inf.FName[i][1], l); //записываем строку
    F.WriteBuffer(Inf.FUpd[i], SizeOf(Boolean));
  end;
...
читается точно наоборот. Обращаем внимание на то, что запись и чтение ведется с [1] элемента строки, и перед записью в строку нужно изменить ее длину:
Код:
...
F.ReadBuffer(l, SizeOf(Integer));
SetLength(Inf.FName[i], l);
F.ReadBuffer(nf.FName[i][1], l);
...
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت
Ответить с цитированием
  #12  
Старый 28.09.2009, 16:14
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,035
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вот:

Код:
unit Unit2;

interface

uses
  Windows, SysUtils, Classes, Contnrs;

type
  TUpdateInfo = class
  private
    FName : String;
    FUpd : Boolean;
  public
    constructor Create;
    destructor Destroy; override;

    procedure SaveToStream(AStream : TStream);
    procedure LoadFromStream(AStream : TStream);

    property Name : String read FName write FName;
    property Upd : Boolean read FUpd write FUpd;
  end;

  TUpdateInfoList = class
  private
    FItems : TObjectList;
    function GetCount: Integer;
    function GetItem(Index: Integer): TUpdateInfo;
  public
    constructor Create;
    destructor Destroy; override;

    procedure SaveToStream(AStream : TStream);
    procedure LoadFromStream(AStream : TStream);

    procedure SaveToFile(AFileName : String);
    procedure LoadFrommFile(AFileName : String);

    procedure AddItem(AItem : TUpdateInfo);
    procedure RemoveItem(AIndex : Integer);

    property Count : Integer read GetCount;
    property Items[Index : Integer] : TUpdateInfo read GetItem;
  end;

implementation

{ TUpdateInfo }

constructor TUpdateInfo.Create;
begin
  inherited;
  FName := '';
  FUpd := False;
end;

destructor TUpdateInfo.Destroy;
begin
  inherited;
end;

procedure TUpdateInfo.LoadFromStream(AStream: TStream);
var
  ALen : Integer;
begin
  AStream.ReadBuffer(ALen,SizeOf(Integer));
  SetLength(FName,ALen)
  If ALen > 0 Then
    AStream.ReadBuffer(FName[1],ALen);
  AStream.ReadBuffer(FUpd,SizeOf(Boolean));
end;

procedure TUpdateInfo.SaveToStream(AStream: TStream);
var
  ALen : Integer;
begin
  ALen := Length(FName);
  AStream.WriteBuffer(ALen,SizeOf(Integer));
  If ALen > 0 Then
    AStream.WriteBuffer(FName[1],ALen);
  AStream.WriteBuffer(FUpd,SizeOf(Boolean));
end;

{ TUpdateInfoList }

procedure TUpdateInfoList.AddItem(AItem: TUpdateInfo);
begin
  FItems.Add(AItem);
end;

constructor TUpdateInfoList.Create;
begin
  inherited;
  FItems := TObjectList.Create(True);
end;

destructor TUpdateInfoList.Destroy;
begin
  FItems.Free;
  inherited;
end;

function TUpdateInfoList.GetCount: Integer;
begin
  Result := FItems.Count;
end;

function TUpdateInfoList.GetItem(Index: Integer): TUpdateInfo;
begin
  Result := FItems[Index] As TUpdateInfo;
end;

procedure TUpdateInfoList.LoadFrommFile(AFileName: String);
var
  AStream : TFileStream;
begin
  AStream := TFileStream.Create(AFileName,fmOpenRead);
  Try
    LoadFromStream(AStream);
  Finally
    AStream.Free;
  End;
end;

procedure TUpdateInfoList.LoadFromStream(AStream: TStream);
var
  I : Integer;
  ACount : Integer;
  AItem : TUpdateInfo;
begin
  AStream.ReadBuffer(ACount,SizeOf(Integer));
  For I := 0 To ACount-1 Do
    Begin
      AItems := TUpdateInfo.Create;
      AItem.LoadFromStream(AStream);
      FItems.Add(AItem);
    End;
end;

procedure TUpdateInfoList.RemoveItem(AIndex: Integer);
begin
  FItems.Delete(AIndex);
end;

procedure TUpdateInfoList.SaveToFile(AFileName: String);
var
  AStream : TFileStream;
begin
  AStream := TFileStream.Create(AFileName,fmCreate);
  Try
    SaveToStream(AStream);
  Finally
    AStream.Free;
  End;
end;

procedure TUpdateInfoList.SaveToStream(AStream: TStream);
var
  I : Integer;
  ACount : Integer;
begin
  ACount := FItems.Count;
  AStream.WriteBuffer(ACount,SizeOf(Integer));
  For I := 0 To FItems.Count-1 Do
    (FItems[i] As TUpdateInfo).SaveToStream(AStream);
end;

end.

Если не понятно как пользоваться - напиши.
Ответить с цитированием
  #13  
Старый 29.09.2009, 05:21
Scooter Scooter вне форума
Прохожий
 
Регистрация: 02.07.2007
Сообщения: 18
Репутация: 10
Радость

lmikle спасибо тебе большое думаю как пользоваться разберусь, если нет спрошу обязательно... Ну у меня возник один вопрос, у меня там грубо говоря всего два массива которые мне нужно сохранить в файл и прочитать их в нужный момент, неужели нет более изящного способа для этого, что-то на подобии моего только чтобы он работал ... Просто программа у меня не маленькая и в ней уже много чего, куча модулей, куча форм еще потоки, я просто боюсь запутаться в итоге а тут еще один модуль с кучей кода ради двух массивов ...

Ну все равно думаю возьму на вооружение твой способ, по крайней мере пока буду разбираться в нем много нового узнаю ... Спасибо!
Ответить с цитированием
  #14  
Старый 29.09.2009, 08:25
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

На вскидку, а если просто задать структуру фиксированную?
Код:
TUpdateInf = Record
             FName: Array[0..999] of String[50];
             FUpd: Array[0..999] of Boolean;
             End;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #15  
Старый 29.09.2009, 08:28
Scooter Scooter вне форума
Прохожий
 
Регистрация: 02.07.2007
Сообщения: 18
Репутация: 10
Радость

KOOL Спасибо большое тебе оказываеться ответ про более изящный способ уже был описан тобой просто я его не заметил... Всем большое спасибо тему можно закрывать
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:04.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter