Size: a a a

2020 September 24

Ш

Шляпник in Delphi & Lazarus
Если вызываешь методы, имеющиеся у мемористрима, то ошибок не будет
источник

Ш

Шляпник in Delphi & Lazarus
если же есть методы наследников, то перед вызовом стоит проверять на соответствие значения переменной классу наследника с помощью оператора is
источник

SB

Sergey Bodrov in Delphi & Lazarus
Создай функцию или метод SaveToStream(AStream: TStream), в него передавай любой Stream, хоть memory, хоть file.
источник

Ш

Шляпник in Delphi & Lazarus
пример
var temp; TStream;
...
if temp is TMyStream
 then ...
источник

AK

Alexey Kulakov in Delphi & Lazarus
Да это ясно, что проверять тип надо. Но это если обращение к уникальным данным, а тут лишь уникальные методы, использующие код предка
источник

Ш

Шляпник in Delphi & Lazarus
уникальные методы = переопределённые унаследованные? или у них сигнатура другая?
источник

AK

Alexey Kulakov in Delphi & Lazarus
Ну, мне надо читать уникодную строку, где сперва идёт 2 байта длины в символах, потом текст без завершающего нуля
источник

SB

Sergey Bodrov in Delphi & Lazarus
Alexey Kulakov
Да это ясно, что проверять тип надо. Но это если обращение к уникальным данным, а тут лишь уникальные методы, использующие код предка
Попробуй посмотреть на задачу иначе. Не допиливать TStream для работы с новыми типами, а допиливать новые типы для работы с TStream.
источник

AK

Alexey Kulakov in Delphi & Lazarus
Я хреново соображаю в эти дни, потому надо делать проще. Ты же меня путаешь :(
источник

AK

Alexey Kulakov in Delphi & Lazarus
Мне просто нужен поток для чтения кастомных данных. Из файла или памяти, это как получится
источник

I

Igor in Delphi & Lazarus
class MyString
public
 procedure ReadFromStream(Stream: TStream);
 procedure WriteToStream(Stream: TStream);
 ...

не?
источник

AK

Alexey Kulakov in Delphi & Lazarus
Заколебешься для 10 простых типов делать такую имплементацию
источник

SB

Sergey Bodrov in Delphi & Lazarus
procedure TMyObject.LoadFromStream(AStream: TStream);
begin
 AStream.Read(FDataLength, SizeOf(FDataLength));
 AStream.Read(FData, FDataLength);
end
источник

AK

Alexey Kulakov in Delphi & Lazarus
Ибо надо ТОЛЬКО чтение и запись
источник

AK

Alexey Kulakov in Delphi & Lazarus
Мне не надо делать объект или класс из этого типа
источник

SB

Sergey Bodrov in Delphi & Lazarus
Alexey Kulakov
Заколебешься для 10 простых типов делать такую имплементацию
Пока ты споришь, давно бы сделал.
источник

AK

Alexey Kulakov in Delphi & Lazarus
Неа
источник

AK

Alexey Kulakov in Delphi & Lazarus
Это надо сделать просто и правильно для библиотечного формата, а не одиночного случая
источник

I

Igor in Delphi & Lazarus
тогда процедуру-хелпер для TStream, читающую MyString
для других типов — перегрузить
источник

SB

Sergey Bodrov in Delphi & Lazarus
// read string
function LoadDataFromStream(AStream: TStream; var AData: string): Boolean; overload;

// read Integer
function LoadDataFromStream(AStream: TStream; var AData: Integer): Boolean; overload;

// read Real
function LoadDataFromStream(AStream: TStream; var AData: Real): Boolean; overload;
источник