Войти

Показать полную графическую версию : [решено] проблема в #0 в CopyFilesToClipboard


che.ramzes
24-12-2011, 21:43
Привет Всем. У меня вот такая проблемка не понятная. использую процедуру
procedure CopyFilesToClipboard(FileList: string);
var
DropFiles: PDropFiles; hGlobal: THandle; iLen: Integer;
begin
iLen := Length(FileList) + 2;
FileList := FileList + #0#0;
hGlobal := GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE or GMEM_ZEROINIT,
SizeOf(TDropFiles) + iLen);
if (hGlobal = 0) then raise Exception.Create('Could not allocate memory.');
begin
DropFiles := GlobalLock(hGlobal);
DropFiles^.pFiles := SizeOf(TDropFiles);
Move(FileList[1], (PChar(DropFiles) + SizeOf(TDropFiles))^, iLen);
GlobalUnlock(hGlobal);
Clipboard.SetAsHandle(CF_HDROP, hGlobal);
end;
end;
Сама процедура рабочая.Вызывается она так CopyFilesToClipboard('C:\Bootlog.Txt'#0'C:\AutoExec.Bat');
Но у меня имена файлов заранее не извесны и сколько их тоже. Создал массив CHAR (типа string) и заполнил его именами файлов.
Вызываю проц. CopyFilesToClipboard(CHAR[1]#0CHAR[2]) и делфи ругается на #0. Если писать сразу имена 'File1.txt'#0'File2.txt' bce работает а с массивом и пробовал с переменными не работает. Может кто поможет, как она работает эта процедура.

BlackEric
25-12-2011, 14:42
Версия Delphi?
И что значит не работает?

Покажи описание TDropFiles.
А вообще в таких случаях вызывают процедуру с рабочими параметрами и идут дебаггером смотря где что нужно.
А потом по этим данным смотришь что тебе нужно подать на вход.

Если я правильно понял по коду, то тебе нужно передать в функцию строку содержащую имена файлов разделенные #0.
Т.е. вызываешь с константой, ставишь бряк на begin функции и смотришь что тебе пришло.

Потом сам сформируй такую же строку.

che.ramzes
25-12-2011, 17:51
Версия делфи 7,0
Вызываю вот так к примеру :
procedure TForm1.Button8Click(Sender: TObject);
begin
CopyFilesToClipboard(CHAR[1]#0CHAR[2]); ругается на эту строку, курсор стоит после #0
end;
Ошибка- Missing operator or semicolon
(массив естественно прописан в var)
если так:
procedure TForm1.Button8Click(Sender: TObject);
begin
CopyFilesToClipboard('File1.txt'#0'File2.txt' );
end;
Все работает, принимает имена а если имена возвращает переменная, массив или функция то уже не хочет. Если так CopyFilesToClipboard(CHAR[1]); - одна переменная или обект с массива то тоже работает
Как передать несколько имен ???
описание TDropFiles: Я не очень то еще опытный, с clipboard сталкиваюсь в первые

BlackEric
25-12-2011, 18:03
CHAR[1] + #0 + CHAR[2] не взлетит?

CHAR[1] - как это объявлено?

che.ramzes
25-12-2011, 22:10
CHAR[1] + #0 + CHAR[2] не взлетит? »
Сработала !!! ура Спасибо BlackEric, все перепробывал а с + как то недопер.
Тему можно считать закрытой. Спасибо oszony

Drongo
25-12-2011, 22:52
che.ramzes, Для изучения функционала форума, пожалуйста, отредактируйте ваши сообщения, оформив код тегом . Ну и пометьте тему решённой самостоятельно. :)




© OSzone.net 2001-2012