![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема при копировании таблиц через ClipBoard
Krants © (2006-11-30 11:28:00)var
st,t:string;
p,c:integer;
h:thandle;
...
FClipBrdItems.Clear;
OpenClipBoard(0);
h:=GetClipboardData(CF_TEXT);
if h<>0 then
begin
try
t:=PChar(GlobalLock(h))+char(13);
finally
GlobalUnlock(h);
end;
repeat
p:=pos(char(13),t);
if p>0 then
begin
{ st:=copy(t,0,p-1)+char(9);
repeat
c:=pos(char(9),st);
if c>0 then
begin
FClipBrdItems.Add(trim(copy(st,0,c-1)));
Delete(st,1,c);
end;
until c=0; }
FClipBrdItems.Add(trim(copy(t,0,p-1)));//При добавлении только строк
Delete(t,1,p);
end;
until p=0;
end;
CloseClipBoard;
Сергей М. (2006-11-30 14:40:00) [1]
> я и так использую ТStringList (в примере FClipBrdItems).
> разбиваю буфер на подстрокичерез разделители "#9" и "#13",
> которые и сохраняю в FClipBrdItems.
Ты же при этом дублируешь аналогичнуюфункциональность TStringList - он способен делать тоже самое.. Повода для такого дублирования я не вижу, потому и заострил твое внимание на его методе Text()
Krants (2006-11-30 14:09:00) [2]
> Сергей М. © (30.11.06 13:59) [12]
мы наверное друг-друга не правильно поняли...
да я и так использую ТStringList (в примере FClipBrdItems). разбиваю буфер на подстроки через разделители "#9" и "#13", которые и сохраняю в FClipBrdItems.
Но все равно спасибо.
Сергей М. (2006-11-30 13:59:00) [3]
> копировать с буфура
Причем здесь буфер ?
Есть некая строка (взятая хоть из буфера хоть с Луны - не суть как важно, лишь бы она заканчивалась нуль-терминирующим символом)
Задача: разбить эту строку на подстроки, используя заранее известный символ-разделитель.
Так ?
Я тоже думаю что так.
Пусть известно, что разделителем строк выступает либо символ #13, либо #10, либо их комбинация в любой последовательности.
Тогда вызов StringList.Text := t решает задачу
Krants (2006-11-30 13:40:00) [4]
> Сергей М. © (30.11.06 12:59) [5]
> А чем TStringList не угодил ?
>
> Он все это умеет делать, автоматически и в наилучшем виде ..
можно примерчик... каким образом он может разбивать на подстроки и копировать с буфура?
Сергей М. (2006-11-30 13:18:00) [5]"Закер"
Закер = замученный проблемами хакер)
Krants (2006-11-30 13:16:00) [6]
> Anatoly Podgoretsky © (30.11.06 13:11) [8]
А кто такой "Закер"?
Anatoly Podgoretsky (2006-11-30 13:11:00) [7]> Krants (30.11.2006 12:56:04) [4]
Ну вот из одной крайности в другую. Закер что ли?
Сергей М. (2006-11-30 13:09:00) [8]
> TStringList вроде так не может
Что он не может-то ? Разбить исх.строку, содержащую некие заранее известные символы-разделители, на подстроки ?
Да запросто !)
Krants (2006-11-30 13:05:00) [9]этот код для удобного получения индексов, которые могут браться как из текстовых редакторов так и из таблиц экселя и прочих.
TStringList вроде так не может...
Сергей М. (2006-11-30 12:59:00) [10]А чем TStringList не угодил ?
Он все это умеет делать, автоматически и в наилучшем виде ..
Krants (2006-11-30 12:56:00) [11]Сергей М. ©
try
t:=PChar(GlobalLock(h))+char(13);
finally
GlobalUnlock(h);
end;
- почти аналог TClipBoard.AsText
а проблема была решена заменой:
t:=PChar(GlobalLock(h))+char(13)
на
t:=PChar(GlobalLock(h))+#10#13;
Хотя особой причины возникновения ошибок я не понял...
Сергей М. (2006-11-30 12:54:00) [12]А, пардон ...
Я не обратил внимания на
t:=PChar(GlobalLock(h))+char(13);
Лучше бы, конечно, было сделать
t:=StrPas(GlobalLock(h)) + #13;
Здесь - явноекопирование.
А в каков формат имеют текстовые данные в буфере ?
Приведи образец ...
Сергей М. (2006-11-30 12:48:00) [13]Не знаю уж, где тут фигурирует "таблица", но GlobalUnlock ты рановато вызываешь : сначала д.б. упомянутый цикл и только потомвызов GlobalUnlock
Krants (2006-11-30 11:31:00) [14]При копировании таблицы, можно и текста копируется только 44 или 37 записей. Почему так, не понимаю. Может кто-то сталкивался с похожей проблемой?