Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2009, 20:53   #1
mauar
Пользователь
 
Регистрация: 05.05.2008
Сообщений: 27
Восклицание Поиск из dll по компоненту RichEdit из главной формы

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

Код из главной формы запуска формы поиска из библиотеки
Код:
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;

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

{$R *.res}

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

begin
end.
Код из формы поиска находящияся в библиотеки:
Код:
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 форма подгружается а просто в пакете проекта то все отлично работает. Весь день долбаюсь с ней так и не получается ничего.
mauar вне форума Ответить с цитированием
Старый 24.05.2009, 00:00   #2
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,453
По умолчанию

А так!

Код:

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, 'AdvGlowButton2Click');      // загружаем процедуру кликанье на кнопке поиск (НЕ РАБОТАЕТ
      Lproc;
      st2;
      finally
      FreeLibrary(LDllHandle);
    end;
end;

Код из библиотеки:
Код:


 
library Finds;

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

{$R *.res}

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

begin
end.

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


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.
uberchel вне форума Ответить с цитированием
Старый 24.05.2009, 01:09   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1 придирка:
а может стоит почитать про ДЛЛ и стринг?
используйте PChar или ShortString;
может и спасет...
2)можете скинуть проект, посмотрю
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.05.2009, 12:26   #4
mauar
Пользователь
 
Регистрация: 05.05.2008
Сообщений: 27
По умолчанию

uberchel нет все по проежнему


Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
1 придирка:
а может стоит почитать про ДЛЛ и стринг?
используйте PChar или ShortString;
может и спасет...
2)можете скинуть проект, посмотрю
Прикрепил 2 примера, в первом примере поиск происходит не из библиотеки и окно не модальное, а во втором примере поиск происходит из библиотеки и окно модальное, лучше конечно чтобы оно не модальное было.
Если поможете, заранее благодарю!
Вложения
Тип файла: zip Primer.zip (249.1 Кб, 8 просмотров)
Тип файла: zip Primer_2.zip (487.3 Кб, 9 просмотров)
mauar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как зная ProcessID получить Handle главной формы? NikLik Win Api 8 27.08.2021 21:29
Обращение из формы в dll к элементу главной формы (delphi) a_n_n_a Помощь студентам 3 10.05.2009 04:00
как поменять текст в лабел главной формы MAcK Общие вопросы .NET 8 08.05.2008 12:42
Как сделать поиск по компоненту Tmemo?? photozaz Общие вопросы Delphi 4 16.04.2008 08:23
Скрытие главной формы во время работы приложения Gorin Общие вопросы Delphi 7 23.08.2007 19:44