Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
62 / 42 / 3
Регистрация: 04.01.2019
Сообщений: 278

TStream, TmemoryStream, x64, VCL, FMX найденные грабли

06.12.2023, 13:25. Показов 2229. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Разработчики всегда чутко, душевно и оперативно риагрровали на просьбы юзеров. правда в основном так



И так наконецто Эмбар заявил что в RAD 11 Stream может быть больше Integer. таки да может.
Вобщем после литры (тот который ОН) и глубокой медитации - я так и не смог достичь того просветления - чиобы понять то божественное откровение, которое накрыло разрабов... Общее впечитление "Фима. Вы кто. читатель или писатель. Ну так и пишите, что не важно. Главное чтобы буквочек было много".

Итак вопрос первый - заманчиво-игривое общение с памятью...
диагарама чтение\записи MemoryStream.



знатная пилорама... С какого перепуга почти двойное выделение памяти. ну с виндой и ее -а вдруг комуто зачемто - понятно.но явно не то.
вопрос второй чтоже с чтением. а вот фигвам. такой индейский и большой. главное очень информативно stream read error. и усе...

смотрим - и что мы видим

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TStream.ReadBuffer(var Buffer; Count: NativeInt);
var
  LTotalCount,
  LReadCount: NativeInt;
begin
  { Perform a read directly. Most of the time this will succeed
    without the need to go into the WHILE loop. }
  LTotalCount := Read(Buffer, Count);
  { Check if there was an error }
  if LTotalCount < 0 then
    ReadError;
 
  while (LTotalCount < Count) do
  begin
    { Try to read a contiguous block of <Count> size }
    LReadCount := Read(PByte(PByte(@Buffer) + LTotalCount)^,
      (Count - LTotalCount));
 
    { Check if we read something and decrease the number of bytes left to read }
    if LReadCount <= 0 then
      ReadError
    else
      Inc(LTotalCount, LReadCount);
  end
end;
от чтения коментов ступор и наступил....
Ну вот же NativeInt = может. а нетуто было...

Delphi
1
2
3
4
function TStream.Read(var Buffer; Count: Longint): Longint;
begin
  Result := 0;
end;
integer и все, баста карапузики....
так с чтением\записью понятно...

теперь выделение памяти. замена стандартного менеджера на FastMM5 показал тотже результат. правда чуть лучше. Судя по всему дело в скрытом вызове function TStream.Read. но где ее копать не нашел. буду благодарен за сцылку.
Вобщем работа сделана на отлично - старые глюки оставлены, новые - благополучно добавлены.

вопрос третий - обьясните мне смысл и как работает конструкция (на пальцах)

Delphi
1
2
3
type
 PBtArr = BtArr^;
 BtArr = TBytes;
а то я после всего начал сомневатся в своей способности логически мыслить...

Итак по факту возник вопрос - что собственно с этим делать...
вариант первый - принать ассану и вознести молитву богам АНУНАХ и АПОХ. и пользуемся по старому. каскад FileStream => MemoryStream
вариант два - наследуем TLongMemoryStream = TMemoryStream, добавляем чтото типа LongLoadFile, function TStream.Read(var Buffer; Count: uint64): uint64;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.12.2023, 13:25
Ответы с готовыми решениями:

Конвертация VCL в FMX
Доброго времени суток. Интересует конвертор VCL -&gt; FMX(существует ли вообще подобный софт в свободном доступе?) Mida Converter или...

FMX и VCL TCanvas
Здравствуйте. Недавно заинтересовался Firemonkey и решил переписать свою программку с использованием стилей fm. Суть вопроса - программа...

Переформатировать сознание VCL --> FMX
Привет! Подскажите статейки по FMX, что-нибудь на русском, от иностранщины уже голова болит. Пробовал перейти на FMX несколько раз, но...

21
62 / 42 / 3
Регистрация: 04.01.2019
Сообщений: 278
22.12.2023, 18:22  [ТС]
Студворк — интернет-сервис помощи студентам
krapotkin,
Цитата Сообщение от krapotkin Посмотреть сообщение
потому что TStream это базовый класс
да кто-ж спорит то.
особенно TBytesStream, TStringStream и т.п.
По наплодили. по принцЫпу - платят за Кб. вот и плодим. вместо того чтобы сложить в один класс. но так - НИЗЯЯЯяяяя..... денег меньше будетЬ.

тогда почему конвейер

Delphi
1
2
3
4
5
6
FS: TFileStream:
FM: TMemoruDtream;
 
FS := TFileStream.Create('xxx');
FM := TMemoruDtream.Create;
FM.CopyFrom(FS, FS.Size, 100000000);
делает тоже самое и без всяких истерик с памятью типа - девственницы в первую брачную ночь.
даже в формате программы 2 - 8Гб. загрузил файл в 6Гиг. в притык. но загрузил и без дикого свопа диска...

Поэтому и вопрос что переписывать - родную функцию или добовлять свою TStream.LoadInFile.
Вопрос совместимости вниз по версиям - отдельный разговор.
0
62 / 42 / 3
Регистрация: 04.01.2019
Сообщений: 278
23.12.2023, 12:01  [ТС]
Приехал полный RAD12. Пощупал за интересное место на тему Stream.
Что сказать - слов просто нетУ. настоящие "ВицеГенитальное решение".....

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function TStream.Read(var Buffer; Count: Longint): Longint;
begin
  Result := 0;
end;
 
function TStream.Write(const Buffer; Count: Longint): Longint;
begin
  Result := 0;
end;
 
{$IF Sizeof(LongInt) <> Sizeof(NativeInt)}
function TStream.Read(var Buffer; Count: NativeInt): NativeInt;
var
  LCount,
  LReadCount: NativeInt;
begin
  Result := 0;
  repeat
    LCount := Min(Longint.MaxValue, Count);
    LReadCount := Read((PByte(@Buffer) + Result)^, Longint(LCount));
    Dec(Count, LReadCount);
    Inc(Result, LReadCount);
  until (Count <= 0) or (LCount <> LReadCount);
end;
 
function TStream.Write(const Buffer; Count: NativeInt): NativeInt;
var
  LCount,
  LWriteCount: NativeInt;
begin
  Result := 0;
  repeat
    LCount := Min(Longint.MaxValue, Count);
    LWriteCount := Write((PByte(@Buffer) + Result)^, Longint(LCount));
    Dec(Count, LWriteCount);
    Inc(Result, LWriteCount);
  until (Count <= 0) or (LCount <> LWriteCount);
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.12.2023, 12:01

Переписать Функцию с VCL под FMX
кто поможеть переписать эту функцию под firemonkey? function CompareImage(TrueImg, ComprblImg:TImage;//TrueImg-это...

Встраивание фрейма fmx в vcl приложение
Есть программа созданная на FireMonkey, хотелось бы ее встроить в vcl форму в качестве фрейма. Реально ли такое сделать и как если да ?

Из vcl в fmx нюанс с paintbox при переносе кода
Решил переписать приложение на firemonkey. В старом приложении был bitmap и paintbox. Первый выводился на второй соответственно...

Есть ли смысл переходить с VCL на FMX при разработке для планшета под Windows?
Интересует в плане наличия в FMX компонентов, ориентированных на тыканье в них пальцем в отсутствии мыши.

Враппер к MessageDlg под VCL и под FMX. Delphi 11.2
Очень давно использую такой враппер для показа ошибок. procedure ShowErrorMessage(const Msg:String); begin ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru