Форум: "KOL";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "KOL";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.044 c