|
|
Регистрация | << Правила форума >> | 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 Спасибо большое тебе оказываеться ответ про более изящный способ уже был описан тобой просто я его не заметил... Всем большое спасибо тему можно закрывать
|