Главная страница
    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.49 MB
Время: 0.014 c
14-1132826684
Аноним
2005-11-24 13:04
2005.12.18
Депресняк или здравый смысл?


2-1133369413
zxc
2005-11-30 19:50
2005.12.18
как из тхт заданное число символов прочитать


1-1132228464
shes_proger
2005-11-17 14:54
2005.12.18
Как проверить буфер обмена???


2-1133344518
Piero
2005-11-30 12:55
2005.12.18
алгоритм поиска элемента в массиве


14-1132951298
antonpv
2005-11-25 23:41
2005.12.18
Delphi 7 Service Pack1





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский