![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте! Не могу понять в чем ошибка: описываю свой тип 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 Спасибо большое тебе оказываеться ответ про более изящный способ уже был описан тобой просто я его не заметил... Всем большое спасибо тему можно закрывать
![]() |