Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.18;
Скачать: CL | DM;

Вниз

Сохранение пременной типа Record в поток   Найти похожие ветки 

 
Stanislav ©   (2005-11-16 09:33) [0]

Есть тип:
Type
TRepQuery=Record
Name,SysName,Query:String;
end;
Объявляю переменную
var Q:^TRepQuery;
Записываю в нее данные:
  New (Q);
  Q^.SysName:=Query[i].Name;
  Q^.Query:=Query[i].SQL.Text;
Но при определении размера переменной Sizeof(Q)
Результат равен 12 байт т.е. равный 3 указателям на строку.
И в поток соответственно сохраняются только указатели, а как сохранить содержимое этих строк?


 
Reindeer Moss Eater ©   (2005-11-16 09:39) [1]

Указатель на строку есть, длину строки знаешь.
Каие проблемы?


 
Stanislav ©   (2005-11-16 09:42) [2]

Reindeer Moss Eater ©
Понятно, но это нужно каждое поле сохранять по отдельности, а чтобы сразу всю переменную сохранить нельзя? Типа как WriteComponent ?


 
Reindeer Moss Eater ©   (2005-11-16 09:46) [3]

Ты её и так всю сохраняешь.
Уже сейчас.
Все три своих поля в записи.


 
Digitman ©   (2005-11-16 09:47) [4]


> Stanislav



> Типа как WriteComponent ?


ну так и сделай вместо структуры полноценный компонент !

объяви сохраняемые поля в секции published декларации своего компонента - все остальное Delphi streaming system сделает сама, тебе лишь нужно будет вызвать FileStream.WriteComponent для сохранения своего компонента и FileStream.ReadComponent для его последующего восстановления


 
Stanislav ©   (2005-11-16 09:51) [5]

Digitman ©   (16.11.05 09:47) [4]
Можно, сделать :-).
Хотел сначала уточнить нелзя ли так же сохранять структуру Record.


 
Reindeer Moss Eater ©   (2005-11-16 09:52) [6]

белый бычок и сказка про него


 
Digitman ©   (2005-11-16 10:03) [7]


> Stanislav ©   (16.11.05 09:51) [5]


> нелзя ли так же сохранять структуру Record


можно.

но придется реализовать тот же алгоритм, что скрывается за Read/WriteComponent(), т.е. для каждой строки читать/писать сначала ее длину и следом собственно строковые данные ... вопрос - а оно надо, если в файлер-объекте есть уже готовый алгоритм ?


 
Stanislav ©   (2005-11-16 10:46) [8]

Digitman ©   (16.11.05 10:03) [7]

Ненадо! Лучше сделаю компонент.


 
Erik1 ©   (2005-11-16 12:32) [9]

Ну почемуже можно сделать допущение, что у тебя только ShortString и поля типа (Integer, Boolean, Word...). Тогда достаточно вычислить длину ShortString полей и прибавить SizeOf(MyRecord). После пиши в поток, правда при востановлении придется считать сначала длины строк и сделать SetLength, но это тоже нетрудно.


 
Reindeer Moss Eater ©   (2005-11-16 12:55) [10]

Тогда достаточно вычислить длину ShortString полей и прибавить SizeOf(MyRecord).

Глупости не надо говорить


 
Erik1 ©   (2005-11-17 17:00) [11]

to Reindeer Moss Eater
Тоесть??? Я по такому принципу передачу данных сделал и это не глупости.


 
Reindeer Moss Eater ©   (2005-11-17 17:13) [12]

Согласен.
Это не глупости.
Это Очень Большие Глупости.


 
Гаврила ©   (2005-11-17 17:17) [13]


> Erik1 ©


Если в Record только ShortString, и там нет никаких других указателей  типа string и прочего - никаких длин вычислять не надо.
Пишется и читается весь  Record как есть, одной строкой кода


 
Erik1 ©   (2005-11-17 17:34) [14]

MyRec = record
a: Integer;
b: Boolean;
c: ShortString;
e: set of byte;
f: ShortString;
end;
И как ты вычислиш сколько записать надо? Можно даже одной строчкой. :)


 
jack128 ©   (2005-11-17 17:37) [15]

Erik1 ©   (17.11.05 17:34) [14]
И как ты вычислиш сколько записать надо? Можно даже одной строчкой. :)

SizeOf(MyRec)


 
Reindeer Moss Eater ©   (2005-11-17 17:41) [16]

Для танкистов

type
PMyRec = ^TMyRec;
TMyRec = record
 c1,
 c2,
 c3 : ShortString;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Rec : TMyRec;
begin
ZeroMemory(@Rec,SizeOf(TMyRec));
Rec.c1 := " Очень ";
Rec.c2 := " Большие ";
Rec.c3 := " Глупости ";
ShowMessage("256 x 3 = " + IntToStr(SizeOf(TMyRec))+" ?"#13#10"Или нет?");
with TFileStream.Create("ГлупостиНаглядно.txt",fmCreate) do
 try
  WriteBuffer(Rec,SizeOf(TMyRec));
 finally
  Free;
 end;
end;


 
Deka ©   (2005-11-17 17:47) [17]

Размер структуры MyRec фиксированный и всегда равен 552 байтам. Возможно что-то изменится, если добавить packed.


 
Deka ©   (2005-11-17 17:48) [18]

Размер структуры MyRec фиксированный и всегда равен 552 байтам. Возможно что-то изменится, если добавить packed.
Совсем забыл, однако, SizeOf(MyRec);


 
Erik1 ©   (2005-11-17 17:52) [19]

Господа Reindeer Moss Eater и jack128 может сначала попробуем, а поcле постить будем? :)))


 
TStas ©   (2005-11-17 17:52) [20]

А в чем проблема писать в поток первые 4 байта длинну строки, а потом строку посимвольно?


 
Reindeer Moss Eater ©   (2005-11-17 17:55) [21]

Ерик, иди учи паскаль.


 
Verg ©   (2005-11-17 18:07) [22]


> Reindeer Moss Eater ©   (17.11.05 17:41) [16]
> Для танкистов
>
> type
> PMyRec = ^TMyRec;
> TMyRec = record
>  c1,
>  c2,
>  c3 : ShortString;
> end;


Видимо молодежь смущает, что размер этой записи не равен суммам длин слов " Очень " " Большие " " Глупости "
а типа хотелось бы.


 
Германн ©   (2005-11-18 01:26) [23]

Имхо.
Молодежь смущает то, что:
1. ShortString <> string[]
2. И может быть ещё и отсутствие слова packed в описании типа.



Страницы: 1 вся ветка

Текущий архив: 2005.12.18;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.045 c
6-1126245093
Tor
2005-09-09 09:51
2005.12.18
Получение данных через TCP соединение


2-1133373971
dimka_sh
2005-11-30 21:06
2005.12.18
Разрешение экрана


1-1132569064
DN
2005-11-21 13:31
2005.12.18
В TWebBrowser загружаю страницу, как после окончания загрузки зап


2-1133624922
Катерина
2005-12-03 18:48
2005.12.18
OpenDialog


3-1130782933
ksd
2005-10-31 21:22
2005.12.18
как открыть базу на акцесе из read-only каталога (на CD)?