Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.042 c
15-1161157669
Думкин
2006-10-18 11:47
2006.11.05
Головоломки профессора Головоломки. Гершензон


2-1161345479
Alex_C
2006-10-20 15:57
2006.11.05
EMcaretPos в RichEdit


15-1160644674
DelphiLexx
2006-10-12 13:17
2006.11.05
ToolBar2000+TBX


15-1160849496
vidiv
2006-10-14 22:11
2006.11.05
14 октября — суббота


15-1160891794
cyborg
2006-10-15 09:56
2006.11.05
С чего начинать проект?





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