bom que precisa de muita leitura eu sei ne ... e acredite que estou lendo, pesquisando fazendo testes e tudo mais, não estou repassando meu trabalho pros outros pelo fórum. a minha dificuldade era realmente não saber nada de delphi mas enfim, consegui achar as respostas que eu estava procurando e vo postar aqui, pois eu realmente penei pra conseguir fazer isso (devido ao meu nivel de conhecimento ) 1- se você quiser que um form reconheça o ctrl+v (eu achei esse modo de fazer o mais facil), você deve criar um hotkey: no PRIVATE, você deve colocar essa procedure: procedure WMHotkey(var Msg: TWMHotkey); message WM_HOTKEY;
"se você estiver so copiando o codigo beleza, mas se quiser entender o que esta sendo feito da uma procurada sobre mensagens do windows.
2- no FORM CREATE coloque isso
procedure TForm2.FormCreate(Sender: TObject);
begin
if not RegisterHotkey(Handle, 1, MOD_CONTROL, 86) then
ShowMessage('Erro ao programar Ctrl+V');
end;
ai você esta dizendo que quando apertar ctrl+v msg vai receber "1" (procure sobre RegisterHotkey)
3-agora montando a procedure:
procedure TForm2.WMHotkey(var Msg: TWMHotkey);
var
f: THandle;
buffer: Array [0..MAX_PATH] of Char;
i, numFiles: Integer;
path : string;
begin
if not Form2.Active then
Exit;
LisNom :=TStringList.Create;
case Msg.HotKey of
1:try
f:= Clipboard.GetAsHandle( CF_HDROP );
If f <> 0 Then Begin
numFiles := DragQueryFile( f, $FFFFFFFF, nil, 0 );
for i:= 0 to numfiles - 1 do begin
buffer[0] := #0;
DragQueryFile( f, i, buffer, sizeof(buffer));
path := StrPas(buffer);
LisNom.Add(path);
end;
end;
finally
end;
end;
end;
pontos importantes:
"if not Form2.Active then
Exit;" - isso serve pra fazer com que so o form em questao aceite o ctrl+v, e não a aplicação toda.
"case Msg.HotKey of
1:try" - lembra la em cima onde citei que quando for apertado ctrl+v msg receberia 1, e pra usar agora agora, você pode fazer outras definições depois trata-las no case.
tudo isso faz o seguinte:
quando você aperta o ctrl+v dentro do form2( e somente nele, não funciona se estive com outro form em foco) ele pega o caminho do arquivo que esta no clipboard. Eu fiz isso pegando caminho porque era o que eu precisava, mas você pode mudar a tratamento e pegar qualquer outra informação que você precise.
OK
a segunda pergunta:
2º como faço pra pegar o caminho absoluto de um arquivo do componente TbsSkinDirTreeView?
bom o tbsskindirtreeview e um componente bem parecido com o windows explorer do XP, onde ele mostra a aquitetura das pastas no seu pc.
na minha aplicação eu precisa mostrar um explorer pro cara arrastar um txt para uma tabela e assim ser mostrado os dados, e para isso eu precisava do caminho absoluto
procedure TForm2.Panel1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
path : string;
I:Integer;
begin
LisNom := TStringList.Create;
if Source <> Sender then begin
path:= TbsSkinDirTreeView(Source).SelectedFolder.PathName;
LisNom.Add(path);
end
end;
1- usei um event dragdrop de um componente para poder executar isso, quando eu soltar o arquivo no componente tpanel, ele tratara o arquivo.
2-TbsSkinDirTreeView(Source).SelectedFolder.PathName, esse comando pega o caminho absoluto do arquivo.
3-para que o o tpanel aceite que solte arquivo nele preciso desse codigo tb:
procedure TForm2.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:= Source is TbsSkinDirTreeView;
end; então e isso, sei que o post ta complicado e longo, mas como eu disse so novo ainda no delphi e não sei explicar muito bem, mas acho que já vai ajudar um pouco. Espero que ajude alguém :) ps*: jhonas, eu sei como usar o google, mas de qualquer forma obrigado pelo pela resposta de alguma maneira estaremos ajudando alguém! e por mim tópico resolvido.