Форум: "Начинающим";
Текущий архив: 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