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

Вниз

Rich Edit не хочет грузить большие файлы   Найти похожие ветки 

 
homm ©   (2006-01-15 18:12) [0]

Что-то мне никак не удается загрузить в RichEdit файлы
среднего и более размера. Это не зависит от суппорта OLE
или других свойств, просто дальше каково-то места не
грузит и все. Проблема со многими файлами а не с одним
конкретным.


 
homm ©   (2006-01-15 18:39) [1]


> homm ©   (15.01.06 18:12)
Оказывается свойство есть MaxTextSize. Бывает... ;)

Но зато теперь другая проблема - если включить OLE поддержку, то при выходе из приложения возникает исключение.


 
Thaddy   (2006-01-15 23:56) [2]

1) You can also call re_Bottomless to use huge files.

2) Did you use the latest version of KolOleRe.pas? Did you call OleInit and OleUninit?
I cannot reproduce it.


 
homm ©   (2006-01-16 06:42) [3]

1) Это не то. (по крайней мере там работа с перехватом WM_SIZE, не знаю как это может повлиять на загрузку больших файлов)

> 2) Did you use the latest version of KolOleRe.pas?
Thanks. На сайте есть такая строка: KOLOleRichEdit  14.10.2002  4K она меня и смутила (у меня как раз версия от 14.10.2002 была).

НО! Все равно вылетает. Как то криво написан сам модуль. Даже не знаю что меня больше смущает - использование ассамблерной вставки в паскалевской процедуре NewOLERichEdit или отключение оптимизации для метода TKOLOleRichEdit.Destroy.


 
Thaddy   (2006-01-16 22:19) [4]

1. re_Bottmeless in especially for large files > 64 K upto 2 GB!
2. I renewed part of KolOleRichEdit in 2005. It should contain the TOM interfaces and I believe that is also the version you can now download from the KOL website (otherwise:it is in the first version on my website)
3. D4/5/6 contain known bugs in RTL for OLE. Fixes are available. Which Delphi version do you use?


 
homm ©   (2006-01-19 15:59) [5]


> 1. re_Bottmeless in especially for large files > 64 K upto
> 2 GB!

//[function WndProc_REBottomless]
function WndProc_REBottomless( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
begin
 if Msg.message = WM_SIZE then
   Self_.Perform( EM_REQUESTRESIZE, 0, 0 );
 Result := False;
end;

//[function TControl.RE_Bottomless]
function TControl.RE_Bottomless: PControl;
begin
 AttachProc( WndProc_REBottomless );
 Result := @Self;
end;

Не понял...


> 3. D4/5/6 contain known bugs in RTL for OLE. Fixes are available.
>  Which Delphi version do you use?
I"ll try.


 
homm ©   (2006-01-19 18:51) [6]


> 3. D4/5/6 contain known bugs in RTL for OLE
Я попробовал в D5(Build 6.18) и D6(Build 6.163). Я просто не знаю какие апдейты имеются ввиду - в папке ftp://ftp.borland.com/pub/delphi/techpubs/delphi5/ их куча, а качать 30 метров с ftp://ftp.borland.com/pub/delphi/devsupport/updates/delphi5/ мне очень накладно. Thaddy, не мог бы ты посмотреть в D7 (! с заменой системных модулей)? Дело в том, что без замены используется другой менеджер памяти, оставляющий хвост за выделеным блоком и такие ошибки вылавливаются очень редко. А может просто замена сделана из модуля без исправления RTL for OLE.


 
homm ©   (2006-01-20 13:00) [7]

OK. Я почти дописал свой порт для ричедит на основе предидущего.
Плюсы:
1) Меньше кода
2) Не глючит (не добовляет новых глюков, убирает некоторые старые)
3) Написано "прямо" (не через одно место как у Александра Шахайло)

но осталась одна бага (не появилась! Осталась), от которой тоже надо избавлятся:
procedure TKOLOleRichEdit.HideFrames;
var p: POLERichEditData;
   i: integer;
   n: integer;
   o: TREOBJECT;
begin
  P := GetRichEditData;
  n := p.IOle.GetObjectCount;
  ShowMessage(Int2Hex(n, 8));
  for i := n - 1 downto 0 do begin
     fillchar(o, sizeof(o), 0);
     o.cbStruct := sizeof(O);
     if p.IOle.GetObject(i, o, 7) = S_OK then begin
        o.dwFlags := 0;
        p.IOle.InsertObject(o);
     end;
  end;
  ShowMessage(Int2Hex(p.IOle.GetObjectCount, 8));
end;


После работы это функции количество объектов удваевается. Не знаю почему, но если после использования этого метода сделать RE_LoadFromFile то приложение рушится, причем в коде самого RichEditа, а не приложения. Мне кажется логичное решение:
if p.IOle.GetObject(i, o, 7) = S_OK then begin
        o.dwFlags := 0;
        p.IOle.InsertObject(o);
        p.IOle.DeleteObject(i);
     end;

Но вот беда: не DeleteObject, не чего-либо подобного у IOle нету.
Вопрос:Как удалить не нужный более объект?


 
Vladimir Kladov   (2006-01-20 14:22) [8]

Если этот TREObject интерфейс или интерфейсный класс, то он сам себя уничтожит. Если бы o была глобальная переменная, то тогда o := nil;


 
homm ©   (2006-01-20 15:45) [9]

TREObject = обычная record, служит просто для трансфера данными об объектах.

Дело в том, что объкты регистрируются в IOleRichEdit функцией InsertObject. А при загрузке нового файла (а вернее наверное при выгрузке старого) происходит крах. Похоже нельзя два объекта одинаковыми делать. В любом случае когда мы делаем p.IOle.InsertObject(o); мы регисрируем еще один, отдельный обект, что и отражается в увеличивающемся вдвое счетчике (p.IOle.GetObjectCount) и в старом более не нуждаемся. При этом просто реализить старый нельзя - новый то на том же интерфейсе. Нужно как-то удалить старый объект, как будто бы пользователь выделил его и нажал DEL.


 
Vladimir Kladov   (2006-01-20 22:11) [10]

А если его выделит программно и "удалить" заменив выделение на пустую строку?



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

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

Наверх




Память: 0.49 MB
Время: 0.05 c
15-1161192320
ArtemESC
2006-10-18 21:25
2006.11.05
Запутался с Реестром Far a...


2-1161152032
Tatushka
2006-10-18 10:13
2006.11.05
Свойство ButtonStyle компонента DBGrid


15-1160746232
MikePetrichenko
2006-10-13 17:30
2006.11.05
Задачка


15-1160562761
Anatoly Podgoretsky
2006-10-11 14:32
2006.11.05
Top 10


2-1161451266
GunGarry
2006-10-21 21:21
2006.11.05
Эмулировать нажатие заданной клавиши в активном приложении