Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.28;
Скачать: CL | DM;

Вниз

Создание процедуры "копирование"   Найти похожие ветки 

 
Lyonux ©   (2009-12-27 08:52) [0]

Здраствуйте! Подскажите пожалуйста, как написать процедуру копирования в буфер таким образом, чтобы копировать можно было из всех edit и memo на форме?
Clipboard.SetTextBuf(PChar({компонент}.SelText)); - вот как будет осуществляться копирование в буфер. Нужно оптимизировать его для всех компонентов на форме. Вот :) помогите, кто чем может! Пожалуйста! Голову уже сломала(


 
KilkennyCat ©   (2009-12-27 08:58) [1]

Sender
TComponent
FindComponent


 
KilkennyCat ©   (2009-12-27 09:01) [2]

пример:

procedure TForm1.Edit1DblClick(Sender: TObject);
begin
Clipboard.SetTextBuf(PChar(TEdit(sender).SelText));
end;

теперь всем едитам можно назначить этот обработчик на даблклик.


 
KilkennyCat ©   (2009-12-27 09:09) [3]

еще пример:

procedure TForm1.Button1Click(Sender: TObject);
var
  s : string;
 i : integer;
Begin
 s := "";
 for i := 1 to 3 do s := s + TEdit(FindComponent("Edit" + inttostr(i))).SelText+#13#10;
 Clipboard.SetTextBuf(PChar(s));
end;


по кнопке из едитов Edit1, Edit2, Edit3 выделенный текст суммируется и заносится в буфер


 
Lyonux ©   (2009-12-27 09:11) [4]

KilkennyCat, спасибо большое! TEdit(sender) - вот про это не знала, постоянно приходилось отдельные процедуры для каждого компонента писать в подобных случаях.


 
KilkennyCat ©   (2009-12-27 09:16) [5]

ну и последний пример:

procedure TForm1.Button1Click(Sender: TObject);
var
 s : string;
i : integer;
Begin
s := "";
for i:= 0 to ComponentCount-1 do s := s + TEdit(Components(i)).SelText+#13#10;
Clipboard.SetTextBuf(PChar(s));
end;</CODE

Заберет текст из всех едитов, какие есть.


 
Lyonux ©   (2009-12-27 09:46) [6]

Ааа, не могу сдержать себя: Мусье знает толк в извращениях! =))
Спасибо вам большое)

KilkennyCat ©   (27.12.09 08:58) [1]
Sender
TComponent
FindComponent

Вообще этот ответ был самый краткий и исчерпывающий)) Честно, я вам за него очень благодарна! =)


 
Lyonux ©   (2009-12-27 11:16) [7]

Дяденька, вернитесь пожалуйста!
procedure TForm1.N1Click(Sender: TObject);
begin
If TEdit(sender).SelText <> "" then begin
Clipboard.Clear;
Clipboard.SetTextBuf(PChar(TEdit(sender).SelText));
end;
end;


Я тут написала код, даже перестраховалась.. а оно мне ХЛОП! и при попытке копирования в буфер выдаёт окошко:


"Access violation at address 69746341. Read of address 69746341"  


Что этот шайтан делает?( Подскажите пожалуйста, что тут может быть не так? При компиляции ошибок не было: всё включено, написано правильно. До этого мне никогда не приходилось работать с Clipbrd.
Если совершенно непонятно даже Вам, почему и откуда взялась ошибка, подскажите пожалуйста альтернативу Clipbrd!
Заранее благодарна!


 
Lyonux ©   (2009-12-27 11:17) [8]

Удалено модератором


 
Lyonux ©   (2009-12-27 11:18) [9]

Упс..Извините, оно нечаянно два раза получилось)


 
Anatoly Podgoretsky ©   (2009-12-27 11:28) [10]

> Lyonux  (27.12.2009 11:16:07)  [7]

SelText это не строка, а свойство, какое еще приведение к PChar

Clipboard.AsText := SelText;


 
turbouser ©   (2009-12-27 11:56) [11]


> Lyonux ©   (27.12.09 11:16) [7]


> При компиляции ошибок не было: всё включено, написано правильно.

Не правильно.

> procedure TForm1.N1Click(Sender: TObject);

N1- так обычно итемы в меню автоматически именуются.
Так что, как подсказывает мне телепатор, Sender-ом в таком случае ну ни как не может быть TEdit :)


 
Lyonux ©   (2009-12-27 11:59) [12]

Anatoly Podgoretsky, спасибо за ещё один вариант копированя в буфер)
Получилось вот так:

Clipboard.AsText:=TEdit(sender).SelText;

Очень мило выглядит..Только вот ошибка никуда не делась.

"Access violation at address 69746341. Read of address 69746341"

В чём же дело? :*(


 
Lyonux ©   (2009-12-27 12:01) [13]

turbouser, ах жеж..мм..спасибо большое, надо было это к даблклику по едиту прикрепить, как KilkennyCat написал)
Спасибо, спасибо всем!)
З.Ы. turbouser, у Вас отлично настроен телепатор)


 
Lyonux ©   (2009-12-27 12:30) [14]

Я не знаю, тут принято хвастаться своими достижениями?) В общем, я поставила на событие OnContextPopup edit"a первого следующий код:

procedure TForm1.Edit1ContextPopup(Sender: TObject; MousePos: TPoint;
 var Handled: Boolean);
begin
Clipboard.Clear;
If TEdit(sender).SelText <> "" then
Clipboard.AsText:=TEdit(sender).SelText;
end;


и прикрепила ко всем edit контекстное меню с единственным пунктом "копировать" ) Вроде бы пользователь и не должен заметить, а выглядит вполне приемлимо.
Йа молодец) Всем спасибо!


 
Anatoly Podgoretsky ©   (2009-12-27 12:47) [15]

> Lyonux  (27.12.2009 12:30:14)  [14]


if Sender is TEdit then begin
  ...
end;

И убрать Clipboard.Clear;


 
KilkennyCat ©   (2009-12-27 13:01) [16]


> Anatoly Podgoretsky ©   (27.12.09 12:47) [15]

зачем лишнюю проверку, события сами собой не назначаются


 
Lyonux ©   (2009-12-27 13:40) [17]

KilkennyCat прав, но такую проверку можно применить чтобы впихнуть в одну процедуру и действие с Memo, которое так же имеется у меня на форме)

procedure TForm1.Edit1ContextPopup(Sender: TObject; MousePos: TPoint;
 var Handled: Boolean);
begin
If TEdit(sender).SelText = "" then PopupMenu1.Items[0].Enabled:=False
else PopupMenu1.Items[0].Enabled:=True;
If Sender is TEdit then
 Clipboard.AsText:=TEdit(sender).SelText
else Clipboard.AsText:=TMemo(sender).SelText;
end;


А проверка
"If TEdit(sender).SelText = "" "
теперь  предназначен для того, чтобы показать невозможность копирования "пустоты", как во всех текстовых редакторах.
Вот как-то так оно и получается.


 
KilkennyCat ©   (2009-12-27 14:44) [18]


> Вот как-то так

не так.
procedure TForm1.Edit1ContextPopup(Sender: TObject; MousePos: TPoint;
var Handled: Boolean);
begin
 If Sender is TEdit then begin
   If TEdit(sender).SelText = "" then PopupMenu1.Items[0].Enabled:=False
     else PopupMenu1.Items[0].Enabled:=True;
   Clipboard.AsText:=TEdit(sender).SelText;
 end else Clipboard.AsText:=TMemo(sender).SelText;
end;


 
KilkennyCat ©   (2009-12-27 14:46) [19]

и еще лучше так:

procedure TForm1.Edit1ContextPopup(Sender: TObject; MousePos: TPoint;
var Handled: Boolean);
begin
If Sender is TEdit then begin
  PopupMenu1.Items[0].Enabled:= not (TEdit(sender).SelText = "");
  Clipboard.AsText:=TEdit(sender).SelText;
end else Clipboard.AsText:=TMemo(sender).SelText;
end;


 
Lyonux ©   (2009-12-27 15:42) [20]

KilkennyCat, Вы не могли бы объяснить смысл данных перестановок и преобразований?


 
Anatoly Podgoretsky ©   (2009-12-27 15:46) [21]


> зачем лишнюю проверку, события сами собой не назначаются

Это ты расскажешь когда получишь исключение.


 
Anatoly Podgoretsky ©   (2009-12-27 15:49) [22]

> Lyonux  (27.12.2009 13:40:17)  [17]

Это правильно, только это надо делать в обработчике OnChange и в форме

PopupMenu1.Items[0].Enabled := TEdit(sender).SelText <> "";


 
Lyonux ©   (2009-12-27 16:16) [23]


> Anatoly Podgoretsky ©   (27.12.09 15:49) [22]

СПАСИБО! Ну, наконец-то оно заработало почти как надо. Только я совершенно упустила момент, когда очищается буфер, а делает он это при пустом TEdi(sender).SelText. Что же мне теперь, на onChange ставить строковую переменную и:

procedure TForm1.Edit1Change(Sender: TObject);
var buf:string;
begin
buf:=TEdit(sender).SelText;
PopupMenu1.Items[0].Enabled := TEdit(sender).SelText <> "";
Clipboard.AsText:=buf;
end;


Или я ошибаюсь насчёт очищения буфера и оно происходит при вызове контекстного меню?


 
Anatoly Podgoretsky ©   (2009-12-27 16:34) [24]

> Lyonux  (27.12.2009 16:16:23)  [23]

Непонятно говоришь, о какой очистке буфера ты говоришь и зачем его очищать?
Во вторых в OnChange нужно только запрещать или разрешать пункт меню. Никчему при каждом чихе загонять в буфер новое значение. Обычно копирование в буфер делает пользователь, явно, за прочее бьют автора программ. В данном варианте буфером невозможно пользоваться по назначению.


 
Lyonux ©   (2009-12-27 16:51) [25]


> Anatoly Podgoretsky ©   (27.12.09 16:34) [24]

Конечно буфер очищать незачем, это я уяснила ещё на 15м посту данной темы. Но он очищается самостоятельно, когда я нажимаю правую кнопку мыши в edit, не выделив текст. И хуже всего то, что я представления не имею, почему, как и из-за чего это происходит..


 
Anatoly Podgoretsky ©   (2009-12-27 17:03) [26]

> Lyonux  (27.12.2009 16:51:25)  [25]

buf:=TEdit(sender).SelText;
PopupMenu1.Items[0].Enabled := TEdit(sender).SelText <> "";
--> Clipboard.AsText:=buf;

Вот поэтому
Теперь по поводу OnChange отмени совет, это я с другим перепутал, в Edit1ContextPopup было правильно. Там же и по поводу пункта "Вставить"

пункт.Enabled := Clipboard.HasFormat(CF_TEXT) ;


 
Lyonux ©   (2009-12-27 18:15) [27]

buf:=TEdit(sender).SelText;
PopupMenu1.Items[0].Enabled := TEdit(sender).SelText <> "";
Clipboard.AsText:=buf;


да не было этого, когда буфер начал очищаться сам собой. это просто была попытка что-то исправить, естесственно, неудачная и безуспешная.

Там же и по поводу пункта "Вставить"

пункт.Enabled := Clipboard.HasFormat(CF_TEXT) ;


Не понимаю. По поводу какого "Вставить"? У меня предполагается только пункт "Копировать" в контекстном меню, если вы об этом.


 
KilkennyCat ©   (2009-12-27 18:19) [28]


> У меня предполагается только пункт "Копировать" в контекстном
> меню,

Это у тебя. А у других приложений свое мнение, но тот же самый клипбоард, в котором может быть что угодно, не только текст. Предложенная Анатолием проверка исключит возможность вставки, если не текст.


 
KilkennyCat ©   (2009-12-27 18:20) [29]


> исключит возможность вставки, если не текст.

разумеется, если таковая потребуется. Т.е. это он вперед думает.


 
Anatoly Podgoretsky ©   (2009-12-27 18:46) [30]

> Lyonux  (27.12.2009 18:15:27)  [27]

Ну если тебе вставка не нужна, просто игнорируй предложение.


 
Lyonux ©   (2009-12-27 18:57) [31]

вооот оно что..спасибо. не знала.


 
{RASkov} ©   (2009-12-27 19:03) [32]

> [17] Lyonux ©   (27.12.09 13:40)
> If Sender is TEdit then
> Clipboard.AsText:=TEdit(sender).SelText
> else Clipboard.AsText:=TMemo(sender).SelText;

можно заменить на:
If Sender is TCustomEdit then
Clipboard.AsText:=TCustomEdit(sender).SelText;


 
Anatoly Podgoretsky ©   (2009-12-27 19:16) [33]

> {RASkov}  (27.12.2009 19:03:32)  [32]

Это лучше, поскольку включает и TEdit и TMemo


 
KilkennyCat ©   (2009-12-27 19:50) [34]

и прочих наследников


 
Lyonux ©   (2009-12-27 20:20) [35]

За этот день я узнала полезного о работе с компонентами больше, чем за год программировании в делфи! Никакие книги и электронные справочники не могут объяснить лучше, чем человек. Премного благодарна всем, кто ответил и помог с моей проблемой =) Когда я задавала вопрос, я дажеи подумать не могла, что проблема может иметь такое краткое и изящное решение.
Спасибо, господа! =)


 
Делфиец   (2009-12-27 20:28) [36]

Копи-паст из моей коллекции.

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Поместить/получить строку из буфера обмена (Заплатка к стандартным)

Под Win2k попытка вставить русскую строку в Clipboard ClipBoard.AsText:="Проба"
с последующей вставкой в Word"е показывает кракозябрики..
Расследование показало, что виноваты мелкомягкие (как обычно :) )
С целью нивелирования различий между всеми Win-платформами были написаны эти 2 ф-ции..
Принимают на вход/возвращают строку в Unicode - WideString..
но не надо беспокоиться, Дельфи сам вставит при необходимости
конвертацию в/из AnsiString.

Если платформа поддерживает уникод (NT), то используется этот формат,
иначе вызываются стандартные процедуры/ф-ции.
Удачи!

Зависимости: ClipBrd
Автор:       Shaman_Naydak, shanturov@pisem.net
Copyright:   Shaman_Naydak
Дата:        26 июня 2002 г.
***************************************************** }

Unit UBPFD;

interface

uses windows, ClipBrd;

procedure PutStringIntoClipBoard(const Str: WideString);
function GetStringFromClipboard: WideString;

implementation

procedure PutStringIntoClipBoard(const Str: WideString);
var
 Size: Integer;
 Data: THandle;
 DataPtr: Pointer;
begin
 Size := Length(Str);
 if Size = 0 then
   exit;
 if not IsClipboardFormatAvailable(CF_UNICODETEXT) then
   Clipboard.AsText := Str
 else
 begin
   Size := Size shl 1 + 2;
   Data := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, Size);
   try
     DataPtr := GlobalLock(Data);
     try
       Move(Pointer(Str)^, DataPtr^, Size);
       Clipboard.SetAsHandle(CF_UNICODETEXT, Data);
     finally
       GlobalUnlock(Data);
     end;
   except
     GlobalFree(Data);
     raise;
   end;
 end;
end;

function GetStringFromClipboard: WideString;
var
 Data: THandle;
begin
 if not IsClipboardFormatAvailable(CF_UNICODETEXT) then
   Result := Clipboard.AsText
 else
 begin
   Clipboard.Open;
   Data := GetClipboardData(CF_UNICODETEXT);
   try
     if Data <> 0 then
       Result := PWideChar(GlobalLock(Data))
     else
       Result := "";
   finally
     if Data <> 0 then
       GlobalUnlock(Data);
     Clipboard.Close;
   end;
 end;
end;Unit UBPFD;

interface

uses windows, ClipBrd;

procedure PutStringIntoClipBoard(const Str: WideString);
function GetStringFromClipboard: WideString;

implementation

procedure PutStringIntoClipBoard(const Str: WideString);
var
 Size: Integer;
 Data: THandle;
 DataPtr: Pointer;
begin
 Size := Length(Str);
 if Size = 0 then
   exit;
 if not IsClipboardFormatAvailable(CF_UNICODETEXT) then
   Clipboard.AsText := Str
 else
 begin
   Size := Size shl 1 + 2;
   Data := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, Size);
   try
     DataPtr := GlobalLock(Data);
     try
       Move(Pointer(Str)^, DataPtr^, Size);
       Clipboard.SetAsHandle(CF_UNICODETEXT, Data);
     finally
       GlobalUnlock(Data);
     end;
   except
     GlobalFree(Data);
     raise;
   end;
 end;
end;

function GetStringFromClipboard: WideString;
var
 Data: THandle;
begin
 if not IsClipboardFormatAvailable(CF_UNICODETEXT) then
   Result := Clipboard.AsText
 else
 begin
   Clipboard.Open;
   Data := GetClipboardData(CF_UNICODETEXT);
   try
     if Data <> 0 then
       Result := PWideChar(GlobalLock(Data))
     else
       Result := "";
   finally
     if Data <> 0 then
       GlobalUnlock(Data);
     Clipboard.Close;
   end;
 end;
end;

end.

end.



Страницы: 1 вся ветка

Текущий архив: 2010.02.28;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.013 c
15-1259587923
12
2009-11-30 16:32
2010.02.28
sql server, ms. Общая оптимизация. Прошу подсказки.


2-1261818557
fen
2009-12-26 12:09
2010.02.28
проблема с сохранением в файл


15-1260923205
Kerk
2009-12-16 03:26
2010.02.28
Счетчик посещаемости


2-1261670806
valussev@mail.ru
2009-12-24 19:06
2010.02.28
вывод части Bitmap


2-1261799017
Igor2010
2009-12-26 06:43
2010.02.28
кодировка