|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
|  | 
|  | Опции темы | Поиск в этой теме | Опции просмотра | 
| 
			 
			#1  
			
			
			
			
		 | |||
| 
 | |||
|  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  
			
			
			
			
		 | |||
| 
 | |||
|   F.WriteBuffer(^inf,sizeof(UpdateInf)); пропустили ^. У меня вот так вот программа работает. F.ReadBuffer(^inf,sizeof(UpdateInf)); | 
| 
			 
			#3  
			
			
			
			
		 | |||
| 
 | |||
|   Понял что проблема в массивах описанного типа... Ну почему так делать нельзя и как можно не пойму... | 
| 
			 
			#4  
			
			
			
			
		 | |||
| 
 | |||
|   Borland всегда что-то неправильно сама делает. И реализация возможностей, к сожалению у Borland отстает на десятки лет. Например поддержка GDI+ была уже в Microsoft Visual Studio 2003. А даже в Borland Delphi 2009 нет такой возможности! Покажите лог компилятора! | 
| 
			 
			#5  
			
			
			
			
		 | |||
| 
 | |||
|   ComputerMonster  логи компилятора пустые если я правильно понял про какие вы логи спрашиваете, компилируеться все на ура а вот работать не хочет...  P.S: Как просматреть логи? | 
| 
			 
			#6  
			
			
			
			
		 | |||
| 
 | |||
|   Они где внизу в компиляторе. Ладно. Пришлите саму программу мне на личный e-mail. Я протестирую её и скажу Вам. Личный e-mail вы узнаете, нажав на ссылку ComputerMonster. Появится всплывающее меню, и пишите на e-mail. Вложение в письмо сделайте. Вложение - это прикрепление файла к письму. Вложите программу EXE, т.е. сам исполняемый файл. | 
| 
			 
			#7  
			
			
			
			
		 | |||
| 
 | |||
|   ComputerMonster  да я про эти логи и говорил, подумал может еще какие есть )))... Спасибо за подробное объяснение про почту и вложения... ну я уж не такой noob   ... Щас вышлю вместе с исходниками...  | 
| 
			 
			#8  
			
			
			
			
		 | |||
| 
 | |||
|   Написать на е-маil не получилось пишет: К сожалению, запрашиваемая Вами страница не найдена (404 Not Found). Ладно попробую сам разобраться или может еще кто нибудь ответит ((... Спасибо за помошь  | 
| 
			 
			#9  
			
			
			
			
		 | |||
| 
 | |||
|   Неужели никто не подскажет... Помогите плиз...   | 
| 
			 
			#10  
			
			
			
			
		 | |||
| 
 | |||
|   Так вообще лучше не работать. Тебе обязател но массивы из 100 элементов? Я бы сделал 2 класса. Первый - пара имя-флаг, фторой - список первых классов. Собственно, так я всегда и делаю. Ща набросаю код и опубликую. | 
| 
			 
			#11  
			
			
			
			
		 | ||||
| 
 | ||||
|   Цитата: 
 Код: 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;
...Код: ... F.ReadBuffer(l, SizeOf(Integer)); SetLength(Inf.FName[i], l); F.ReadBuffer(nf.FName[i][1], l); ... | 
| 
			 
			#12  
			
			
			
			
		 | |||
| 
 | |||
|   Вот: Код: 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  
			
			
			
			
		 | |||
| 
 | |||
|   lmikle  спасибо тебе большое думаю как пользоваться разберусь, если нет спрошу обязательно... Ну у меня возник один вопрос, у меня там грубо говоря всего два массива которые мне нужно сохранить в файл и прочитать их в нужный момент, неужели нет более изящного способа для этого, что-то на подобии моего только чтобы он работал   ... Просто программа у меня не маленькая и в ней уже много чего, куча модулей, куча форм еще потоки, я просто боюсь запутаться в итоге а тут еще один модуль с кучей кода ради двух массивов  ... Ну все равно думаю возьму на вооружение твой способ, по крайней мере пока буду разбираться в нем много нового узнаю  ... Спасибо! | 
| 
			 
			#14  
			
			
			
			
		 | ||||
| 
 | ||||
|   На вскидку, а если просто задать структуру фиксированную? Код: TUpdateInf = Record
             FName: Array[0..999] of String[50];
             FUpd: Array[0..999] of Boolean;
             End; | 
| 
			 
			#15  
			
			
			
			
		 | |||
| 
 | |||
|   KOOL Спасибо большое тебе оказываеться ответ про более изящный способ уже был описан тобой просто я его не заметил... Всем большое спасибо тему можно закрывать   |