Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск из dll по RichEdit из главной формы 
:(
    Опции темы
mauar
Дата 23.5.2009, 16:05 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 5.9.2007

Репутация: нет
Всего: нет



Помогите пожалуйсто решить одну проблему. Есть главная форма,
на ней расположен компонент RichEdit в который из *.rtf файла
выводится текст. Есть вторая маленькая форма производящая поиск
текста на ней есть компонент RichEdit в которой вводишь слово
и он ищет  по компоненту RichEdit из главной формы в котором отображен текст .rtf.
 Проблема такая, маленькую форму поиска я поместил в библиотеку
которая динамически загружается при вызове формы, если кто знает 
почему не получается реализовать поиск из этой формы которая находится 
в библиотеки, для поиска по компоненту RichEdit из главной фрмы!


Код из главной формы запуска формы поиска из библиотеки
Код

procedure TTMSForm1.AdvGlowButton30Click(Sender: TObject);

var
  LDllHandle : THandle;
  LProc : procedure;
  St1 : TSearchForText;
  St2 : procedure;

begin
LDLLHandle := loadLibrary ('Finds.dll'); // загружаю библиотеку в которой находится форма поиска
if (LDLLHandle = 0) then begin
ShowMessage ('Ошибка загрузки библиотеки!');
exit;
end;
    try
      @LProc := GetProcAddress(LDllHandle, 'ShowFind');  // загружаем процедуру отображение
      @St1 := GetProcAddress(LDllHandle, 'SearchForText'); // загружаем функцию Поиска, 
      @St2 := GetProcAddress(LDllHandle, 'Click');      // загружаем процедуру кликанье на кнопке поиск (НЕ РАБОТАЕТ
      Lproc;
      st2;
      finally
      FreeLibrary(LDllHandle);
    end;
end;


Код из библиотеки:
Код
 
library Finds;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  SysUtils,
  Classes,
  Find in 'Find.pas' {FindForm};

{$R *.res}

exports ShowFind,  // экспортирую процедуру отображение и загрузки формы поиска из dll
        SearchForText, // экспортирую функцию поиска по тексту
        AdvGlowButton2Click name 'Click'; // экспорт процедуры нажатия на кнопку, ВОТ ОНА И НЕ РАБОТАЕТ

begin
end.


Код из формы поиска находящияся в библиотеки:
Код

unit Find;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, AdvTreeComboBox, ComCtrls, ExtCtrls, AdvPanel,
  AdvGlowButton;

procedure ShowFind;  // сдесь обьявляем процедуры и функции для будущего экспорта из dll
procedure AdvGlowButton2Click(Sender: TObject);
function SearchForText(RichEdit: TRichEdit; SearchText: string): Boolean;


type
  TFindForm = class(TForm)
    AdvPanel19: TAdvPanel;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    TabSheet5: TTabSheet;
    TabSheet6: TTabSheet;
    TabSheet7: TTabSheet;
    TabSheet8: TTabSheet;
    AdvPanel1: TAdvPanel;
    AdvGlowButton1: TAdvGlowButton;
    AdvGlowButton2: TAdvGlowButton;
    Edit1: TEdit;

        procedure AdvGlowButton1Click(Sender: TObject);

  private
    { Private declarations }


  public
    { Public declarations }
  end;

var
  FindForm: TFindForm;

implementation

uses MGOU_FIRE;

{$R *.dfm}

procedure ShowFind;
begin
  FindForm := TFindForm.Create(Application);
  //создали форму
  FindForm.ShowModal;
  //показали в модальном режиме
  FindForm.Free;
  //форму закрыли - освобождаем память...
end;

{функция поиска текста}
function SearchForText(RichEdit: TRichEdit; SearchText: string): Boolean;
var
StartPos, Position, EndPos : Integer;
begin
  StartPos := 0;

  with RichEdit do
  begin
    Endpos := Length(RichEdit.Text);
    Lines.BeginUpdate;

  while FindText(SearchText, StartPos, Endpos, [])<>-1 do
    begin
      Position := FindText(SearchText, StartPos, Endpos, []);
      Endpos   := Length(RichEdit.Text) - startpos;
      Inc(StartPos, Length(SearchText));
      SetFocus;
      SelStart  := Position;
      RichEdit.Perform(EM_SCROLLCARET, 0, 0);
      SelLength := Length(SearchText);
      end;
    Lines.EndUpdate;
      end;
end;

{Выполняем поиск по текущей активной вкладки из главной формы программы}
procedure AdvGlowButton2Click(Sender: TObject);
begin

case TMSForm1.PageControl1.ActivePage.TabIndex of
2:   SearchForText(TMSForm1.RichEdit1  , TMSForm1.Edit1.Text);
3:   SearchForText(TMSForm1.RichEdit2  , TMSForm1.Edit1.Text);
4:   SearchForText(TMSForm1.RichEdit3  , TMSForm1.Edit1.Text);
5:   SearchForText(TMSForm1.RichEdit4  , TMSForm1.Edit1.Text);
8:   SearchForText(TMSForm1.RichEdit6  , TMSForm1.Edit1.Text);
9:   SearchForText(TMSForm1.RichEdit5  , TMSForm1.Edit1.Text);
11:  SearchForText(TMSForm1.RichEdit7  , TMSForm1.Edit1.Text);
12:  SearchForText(TMSForm1.RichEdit8  , TMSForm1.Edit1.Text);
14:  SearchForText(TMSForm1.RichEdit9  , TMSForm1.Edit1.Text);
15:  SearchForText(TMSForm1.RichEdit10 , TMSForm1.Edit1.Text);
17:  SearchForText(TMSForm1.RichEdit11 , TMSForm1.Edit1.Text);
18:  SearchForText(TMSForm1.RichEdit12 , TMSForm1.Edit1.Text);
45:  SearchForText(TMSForm1.RichEdit13 , TMSForm1.Edit1.Text);
47:  SearchForText(TMSForm1.RichEdit14 , TMSForm1.Edit1.Text);
48:  SearchForText(TMSForm1.RichEdit15 , TMSForm1.Edit1.Text);
end;
end;

{Закрываем окно поиска}
procedure TFindForm.AdvGlowButton1Click(Sender: TObject);
begin
close;
end;
end.


Теоретически, тут должно все работать, но что то не работает. Прикол в том что на главной форме TMSForm1 расположенно 18 вкладок компонента
PageControl ,  и на каждой из этих вкладок расположен RichEdit в котором загружен текст a .rtf формате, по идее все должно работать, если не из dll форма подгружается а просто в пакете проекта то все отлично работает. Весь день долбаюсь с ней так и не получается ничего. 
PM MAIL   Вверх
THandle
Дата 24.5.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



mauar, передавать объекты между приложением и DLL не следует. Как вообще можно так обращаться к форме находящейся в приложении из этой самой DLL?

Цитата(mauar @  23.5.2009,  17:05 Найти цитируемый пост)
2:   SearchForText(TMSForm1.RichEdit1  , TMSForm1.Edit1.Text);
....


Лучше всю эту форму поиска перенести в проект и не делать никаких DLL, они тут и не требуются.
PM   Вверх
mauar
Дата 24.5.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 5.9.2007

Репутация: нет
Всего: нет



Цитата(THandle @  24.5.2009,  10:02 Найти цитируемый пост)
mauar, передавать объекты между приложением и DLL не следует. Как вообще можно так обращаться к форме находящейся в приложении из этой самой DLL?

Цитата(mauar @  23.5.2009,  17:05 Найти цитируемый пост)
2:   SearchForText(TMSForm1.RichEdit1  , TMSForm1.Edit1.Text);
....


Лучше всю эту форму поиска перенести в проект и не делать никаких DLL, они тут и не требуются. 


А если тех. задание такое и оговорки не подлежит, то что мне то делать?

PM MAIL   Вверх
THandle
Дата 24.5.2009, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



mauar, 

Ну либо как-то переделывать, к примеру чтобы передавались строки... Но я не понимаю зачем все так мутно... Никакого выигрыша ни в качестве, ни в скорости тут не будет.
Как общаться формам в DLL и приложении примеры были в теме:

http://forum.vingrad.ru/forum/topic-239196/unread-1.html

и в куче других по форуму и нету.

Может быть вообще стоит использовать что-то вроде TFindDialog?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0468 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.