Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 122

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Есть 2 вопроса: Как с помощью ReplaceDialog заменить отдельные и все слова, встречающиеся в RichEdit? И как открыть файл перетаскиванием его в окно программы?
Спасибо!

Евгений Eklmn Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Евгений Eklmn (статус: Посетитель)
Вопрос отправлен: 18 ноября 2007, 11:27
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Dron

Здравствуйте, Трофимов Евгений!
Программировать открытие файла при перетаскивании его в окно программы можно следующим образом.
Для начала нужно подключить модуль ShellAPI в uses (в этом модуле содержатся необходимые нам функции).
При создании формы мы должны сказать операционной системе, что готовы принимать файлы. Лучше сделать это в событии OnCreate формы:

procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle, True);
end;
Аналогично, при выходе из программы нужно сказать, что больше файлы мы не принимаем (событие OnDestroy):
procedure TForm1.FormDestroy(Sender: TObject);
begin
  DragAcceptFiles(Handle, False);
end;
Ну и наконец нам нужно отловить момент, когда форма получает системное сообщение WM_DROPFILES, которое свидетельствует о том, что на форму был "брошен" файл. Для этого пишем такую процедуру:
procedure TForm1.WMDropFiles(var M: TWMDropFiles);
var
  hDrop: Cardinal;
  n: Integer;
  s: string;
begin
  hDrop := M.Drop;
  n := DragQueryFile(hDrop, 0, nil, 0);
  SetLength(s, n); 
  DragQueryFile(hDrop, 0, PChar(s), n + 1);
  DragFinish(hDrop);
  M.Result := 0;
 
  //Далее делаем с файлом всё, что угодно. Полный путь к нему записан в переменной S.
  Memo1.Lines.LoadFromFile(S);
end;
Т.к. мы описали дополнительный метод для формы, нужно добавить его в описание формы (раздел type ближе к началу модуля):
  private
    { Private declarations }
    procedure WMDropFiles(var M: TWMDropFiles); message WM_DROPFILES;
Всё, теперь при перетаскивании файлов на окно программы файлы будут загружаться в Memo1.
Удачи!

Ответ отправил: Dron (статус: Студент)
Время отправки: 18 ноября 2007, 11:55
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: min@y™

Добавлю. Если надо принимать сразу несколько файлов, то:

 
procedure TMainForm.WMDropFiles(var Message:TWMDropFiles);
var
   HF:THandle;
   S,SMessage:string;
   C:array[0..511] of char;
   Index,Count:integer;
begin
     HF:=Message.Drop;
     Count:=DragQueryFile(HF,$FFFFFFFF,nil,0);
     SMessage:= '';
     for Index:=0 to Count-1 do
       begin
         DragQueryFile(HF,Index,C,511);
         S:=string(C);
         if not OpenFile(S) // Открытие очередного файла чем-либо
           then Break;
       end;
     DragFinish(HF);
end;

TReplaceDialog и TRichEdit не использую по причине их примитивности. Поэтому своих примеров их использования у меня нету, зато есть в DelphiWorld. Так что копирую оттуда.

1. RichEdit замена текста
// This example doesn't use TReplaceDialog 
// Ohne Benutzung von TReplaceDialog 
 
function Search_And_Replace(RichEdit: TRichEdit; 
  SearchText, ReplaceText: 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, [stMatchCase])<>-1 do 
    begin 
      endpos   := Length(RichEdit.Text) - startpos; 
      Position := FindText(SearchText, startpos, endpos, [stMatchCase]); 
      Inc(startpos, Length(SearchText)); 
      SetFocus; 
      SelStart  := Position; 
      SelLength := Length(SearchText); 
      richedit.clearselection; 
      SelText := ReplaceText; 
    end; 
    Lines.EndUpdate; 
  end; 
end; 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  Search_And_Replace(Richedit1, 'OldText', 'NewText'); 
end;

2. Поиск и замена текста в TMemo
procedure TForm1.FindDialog1Find(Sender: TObject);
var
  Buff, P, FT: PChar;
  BuffLen: Word;
begin
  with Sender as TFindDialog do
  begin
    GetMem(FT, Length(FindText) + 1);
    StrPCopy(FT, FindText);
    BuffLen := Memo1.GetTextLen + 1;
    GetMem(Buff, BuffLen);
    Memo1.GetTextBuf(Buff, BuffLen);
    P := Buff + Memo1.SelStart + Memo1.SelLength;
    P := StrPos(P, FT);
    if P = nil then
      MessageBeep(0)
    else
    begin
      Memo1.SelStart := P - Buff;
      Memo1.SelLength := Length(FindText);
    end;
    FreeMem(FT, Length(FindText) + 1);
    FreeMem(Buff, BuffLen);
  end;
end;
 
procedure TForm1.ReplaceDialog1Replace(Sender: TObject);
begin
  with Sender as TReplaceDialog do
    while True do
    begin
      if Memo1.SelText <> FindText then
        FindDialog1Find(Sender);
      if Memo1.SelLength = 0 then
        Break;
      Memo1.SelText := ReplaceText;
      if not (frReplaceAll in Options) then
        Break;
    end;
end;

Разбирайся.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 19 ноября 2007, 08:28


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:46
Выполнено за 0.03 сек.