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

Вниз

копировать из StringGrid   Найти похожие ветки 

 
greengeneral   (2007-11-23 22:35) [0]

Мне надо скопирова данные со всех ячеек StringGrid в буфер обмена, не подскажете как это сделать.


 
palva ©   (2007-11-23 23:15) [1]

Пробежаться по стринггриду и сформировать строку, которую хотите положить в буфер.
В юните Clipbrd описан класс TClipboard. нужно создать объект этого типа и его свойству AsText присвоить эту строку.


 
GanibalLector ©   (2007-11-23 23:22) [2]


procedure CopyGrid(Grid: TStringGrid; Cut: boolean);
 //
 procedure SetClipBoard(Text: String);
   var LName: array[0..KL_NAMELENGTH] of  Char;
       Bool:Boolean;
       hglbCopy: THandle;
       I: Cardinal;
   const RUS="00000419";
 begin
   Bool:=False;
   GetKeyboardLayoutName(LName);
   if LName=RUS then Bool:=True else
    LoadKeyboardLayout(RUS,KLF_ACTIVATE);
   I:=Length(Text)+1;
   OpenClipboard(0);
   EmptyClipboard;
   try
     EmptyClipboard;
     hglbCopy:=GlobalAlloc(GMEM_DDESHARE,I);
     Move(PChar(Text)^,GlobalLock(hglbCopy)^,I);
     GlobalUnlock(hglbCopy);
     SetClipboardData(CF_TEXT, hglbCopy);
   finally
     CloseClipboard;
   end;
   if not Bool then  LoadKeyboardLayout(LName,KLF_ACTIVATE);
 end;
 //
// при Cut = false происходит Copy, а при true Cut
var x, y: integer;
  Buf: string;
begin
 Buf := "";
 with Grid,Grid.Selection do
 begin
   for y:=Top  to Bottom do
   begin
     for x:=Left to Right  do
     begin
       Buf := Buf + Cells[x, y];
       if Cut then Cells[x, y] := "";
       if x < Right then Buf := Buf+#9;  //только если несколько в ширину
     end;
     if y < Bottom then Buf := Buf+#13+#10;
   end;
 end;
 Buf:=Buf+#13+#10;  //можно не делать,но по аналогии с Excel
 Buf:=Buf+#0+#0;
 SetClipBoard(Buf);
end;



 
Amoeba ©   (2007-11-23 23:35) [3]


> В юните Clipbrd описан класс TClipboard. нужно создать объект
> этого типа

Создавать его как раз не надо, т.к. он создается автоматически. Читаем справку:

Do not instantiate separate TClipboard objects by calling the constructor. Instead, use the global instance of TClipboard returned by the Clipboard function. This allows applications to share a single instance of TClipboard and safeguards against accidental deletion of the clipboard. Before calling Clipboard, be sure the uses clause includes the Clipbrd unit.


 
Amoeba ©   (2007-11-23 23:44) [4]


> GanibalLector ©   (23.11.07 23:22) [2]


Зачем это городить?
procedure SetClipBoard(Text: String);
  var LName: array[0..KL_NAMELENGTH] of  Char;
      Bool:Boolean;
      hglbCopy: THandle;
      I: Cardinal;
  const RUS="00000419";
begin
  Bool:=False;
  GetKeyboardLayoutName(LName);
  if LName=RUS then Bool:=True else
   LoadKeyboardLayout(RUS,KLF_ACTIVATE);
  I:=Length(Text)+1;
  OpenClipboard(0);
  EmptyClipboard;
  try
    EmptyClipboard;
    hglbCopy:=GlobalAlloc(GMEM_DDESHARE,I);
    Move(PChar(Text)^,GlobalLock(hglbCopy)^,I);
    GlobalUnlock(hglbCopy);
    SetClipboardData(CF_TEXT, hglbCopy);
  finally
    CloseClipboard;
  end;
  if not Bool then  LoadKeyboardLayout(LName,KLF_ACTIVATE);
end;

Это излишне. Убрать.

Подготовка строки (Buf) - нормально. Оставить.
Вместо
SetClipBoard(Buf);
Достаточно. Главное не забыть добавить clipbrd в Uses/
Clipboard.AsText := Buf;
И не надо в данной задаче писать лишний код (= procedure SetClipBoard).


 
Amoeba ©   (2007-11-23 23:50) [5]

Uses ...,clipbrd;
....

procedure CopyGrid(Grid: TStringGrid; Cut: boolean);
// при Cut = false происходит Copy, а при true Cut
var x, y: integer;
 Buf: string;
begin
Buf := "";
with Grid,Grid.Selection do
begin
  for y:=Top  to Bottom do
  begin
    for x:=Left to Right  do
    begin
      Buf := Buf + Cells[x, y];
      if Cut then Cells[x, y] := "";
      if x < Right then Buf := Buf+#9;  //только если несколько в ширину
    end;
    if y < Bottom then Buf := Buf+#13+#10;
  end;
end;
Buf:=Buf+#13+#10;  //можно не делать,но по аналогии с Excel
Buf:=Buf+#0+#0;
Clipboard.AsText := Buf;
end;


 
GanibalLector ©   (2007-11-24 00:04) [6]

2 Зачем это городить?

А ты попробуй ;) Установи рус.язык, скопируй в буффер, открой тот же Excel (язык, предположим станет англ.) и вставь.



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

Форум: "Начинающим";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.068 c
15-1194966966
Kolan
2007-11-13 18:16
2007.12.16
Header &amp;#151; заголовок, а Footer как?


4-1180449898
CRACKISH
2007-05-29 18:44
2007.12.16
Обнаружение запуска процесса


3-1187063232
Ulugbek
2007-08-14 07:47
2007.12.16
Как динамический создать агрегатные поля TClientdataset


6-1175695239
Мимопроходящий
2007-04-04 18:00
2007.12.16
Как загрузить текстовый файл в мемо?


1-1190610573
ggg
2007-09-24 09:09
2007.12.16
Выделение в ComboBoxEx





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский