|
Вопрос # 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
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|