Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.02.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.005 c
15-1260989873
Kuper7777
2009-12-16 21:57
2010.02.28
Работа с dll-библиотеками


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


15-1260917974
DillerXX
2009-12-16 01:59
2010.02.28
Инженерно-удлинительное


4-1229369994
DenisArd
2008-12-15 22:39
2010.02.28
Загрузка иконок


13-1124537487
jenbond
2005-08-20 15:31
2010.02.28
Передача параметра из UserControl





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский