| 
| 
 | Вопрос # 1 122/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!Есть 2 вопроса: Как с помощью ReplaceDialog заменить отдельные и все слова, встречающиеся в RichEdit? И как открыть файл перетаскиванием его в окно программы?
 Спасибо!
 
|  |   Вопрос задал: Евгений 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
 
 |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |