Главная страница
    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.012 c
2-1133446557
coral
2005-12-01 17:15
2005.12.18
DBLookupComboBox


2-1133204119
Formcreater
2005-11-28 21:55
2005.12.18
Не могу динамически создать кнопку на форме.


1-1132746255
kyn66
2005-11-23 14:44
2005.12.18
Как записать и вытащить Gif файл из ресурса


4-1129817907
Максим
2005-10-20 18:18
2005.12.18
Определение старта процесса


3-1130853165
Goast
2005-11-01 16:52
2005.12.18
Репликация interBase





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский