Конференция "KOL" » пример на Компонент dragnDrop [Delphi, Windows]
 
  • RusSun © (03.10.10 22:27) [0]
    Доброе время суток.Уважаемые мастера.

    Компонент для перетаскивания чего-либо с формы KOL в другое приложение
    с другого приложения на форму KOL.
    http://kolmck.net/Components/dragnDrop.zip

    Есть ли на него пример?
    не dnd перетаскивание в одном приложении с одного листвью в другое.
  • RusSun © (05.10.10 16:18) [1]
    Может простенький пример без этого компонента.
    Вроде бы был пример, но никак его не найду.
  • RusSun © (05.10.10 21:38) [2]
    Пока пытаю что-то вроде этого.

    program Project1;
    uses
     windows,//messages,
     kol,ShellApi;

    {$R *.res}
    var
    form,Memo:PControl;

    //область для функции
    procedure DropFiles(Dummy : Pointer;var Msg: tagMSG;Sender: PControl; );
    var
    f: THandle;
    buffer: array [0..MAX_PATH] of Char;
    i, numFiles: Integer; S:string;
    begin
    if not OpenClipboard( form.GetWindowHandle ) then Exit;
    OpenClipboard(0);
    try
    if IsClipboardFormatAvailable( CF_HDROP )then
    f := GetClipboardData(CF_HDROP);
    if f <> 0 then
      begin
     
        numFiles := DragQueryFile(f, $FFFFFFFF, nil, 0);
        S:='';
       for i :=0 to numfiles - 1  do
        begin
          buffer[0] := #0;
          DragQueryFile(f, i, buffer, SizeOf(buffer));

        S:=s + buffer+#13#10;
        end;
      end;
    finally
     // CloseClipboard;
      memo.add(s) ;
    DragFinish(f); //должен быть DragFinish
    end;

    end;
    Begin
    Applet := NewApplet('');
    form:=NewForm(Applet,'Memo').SetClientSize( 406, 252 ).centeronparent;
    //form.ExStyle := form.ExStyle or WS_EX_ACCEPTFILES;
    Memo := NewEditBox( form, [ eoMultiline, eoNoHScroll ] ).SetAlign(caclient);//.SetPosition( 8,38 );//SetClientSize( 377, 200)
    Memo.Color := clWindow;
    Memo.Text := '';
    form.StayOnTop:=true;
    DragAcceptFiles(form.Handle, true);
    //область для работы
    //form.OnMessage:=TOnMessage(MakeMethod(nil,@DropFiles));
    //здесь не знаю как
    Run(Applet);
    end.

  • Jon © (06.10.10 02:18) [3]

    program DragDrop;

    uses
     Windows, KOL;

    procedure DropFiles(Dummy: Pointer; Sender: PControl; const FileList: KOL_String; const Pt: TPoint);
    var
     FList: PStrList;
     I: Integer;
    begin
     FList := NewStrList;
     FList.Text := FileList;
     for I := 0 to FList.Count - 1 do
       Sender.Add(FList.Items[I] + #$0D#$0A);
     FList.Free;
    end;

    begin
     Applet := NewForm(nil, 'DragDrop');
     Applet.StayOnTop := True;
     with NewEditBox(Applet, [eoMultiline, eoNoHScroll])^ do
     begin
       Align := caClient;
       Color := clWindow;
       OnDropFiles := TOnDropFiles(MakeMethod(nil, @DropFiles));
     end;
     Run(Applet);
    end.

  • RusSun © (06.10.10 05:28) [4]
    Thank you very much for your quick reply:)
  • RusSun © (07.10.10 18:54) [5]
    Доброе время суток.
    Вообще посмотрел это [3] собственно KOL пример
    ! procedure TSomeObject.DropFiles( Sender: PControl; const FileList: AnsiString;
        !           const Pt: TPoint ); )
        ! var FList: PStrList;
        !     I: Integer;
        ! begin
        !   FList := NewStrList;
        !   FList.Text := FileList;
        !   for I := 0 to FList.Count-1 do
        !   begin
        !     // do something with FList.Items[ I ]
        !   end;
        !   FList.Free;
        ! end; }


    тогда для одного файла так:

    program Project1;
    uses
     windows,kol;

    {$R *.res}
    var
    form,Memo:PControl;
    //область для функции
    procedure DropFiles(Dummy : Pointer;Sender: PControl;const Filelist:string;Pt:Tpoint);
    begin
    //если бросить один файл
    memo.Text:='Путь к файлу: '#13#10+filelist+#13#10+
    'Содержимое файла: '#13#10+StrloadFromFile(filelist);
    end;

    Begin
    form:=NewForm(Applet,'Memo').SetClientSize( 456, 252 ).centeronparent;
    Memo := NewEditBox( form, [ eoMultiline, eoNoHScroll ] ).SetAlign(caclient);
    Memo.Color := clWindow;
    Memo.Text := '';
    form.StayOnTop:=true;
    //область для работы
    form.OnDropFiles :=TOnDropFiles(MakeMethod(nil,@DropFiles));
    Run(form);
    end.


    Только можно ли получить количество файлов на прямую ?
  • Dufa © (07.10.10 19:40) [6]
    Посчитать количество #13#10 в Filelist или надо еще прямее?)
  • RusSun © (07.10.10 20:55) [7]
    Спасибо:)  [6]
    Понятно, правда там #13, но от этого смысл не меняется;)
  • RusSun © (16.10.10 18:58) [8]
    Доброе время суток продолжение темы
    как сделать правильно обработку нескольких брошенных файлов?

    > Dufa ©   (07.10.10 19:40) [6]
    >
    > Посчитать количество #13#10 в Filelist или надо еще прямее?
    > )


    допустим бросаем два файла

    путь_1_файл#13путь_2_файл#13#10

    Пробую так:

       ...
    n:=Length(Filelist);
    s:=Filelist;//так как const Filelist:string; используем s:string
    for i := 0 to N do begin
                      if Filelist[i] = #13 then begin
    inc(j); a[j]:=copy(s,r,i-1);delete(s,r,i);r:=i;
                                                        ...


    r-начальная позиция i-1 -конечная позиция
    что вышло заносим в массив a: array[ 1..MAX_PATH ] of string;

    а конец-то #13#10 "он не видит" последний в "пролёте"?
  • Vladimir Kladov © (16.10.10 20:26) [9]
    Строки индексируют с 1.
    У copy третий параметр - число символов. Чем дальше продвинулся цикл, тем больше копирует и удаляет.
    В KOL есть такая функция Parse.

    s := Filelist;
    while s <> '' do
    begin
       inc(j); a[j] := Trim( Parse( s, #13 ) );
       s := Trim( s );
    end;

  • RusSun © (16.10.10 22:56) [10]
    procedure DropFiles(Dummy : Pointer;Sender: PControl;const Filelist:string;Pt:Tpoint);
    var a: array[ 1..MAX_PATH ] of string;
    j,k:integer; s:string;
    begin
    j:=0;
    s := Filelist;
    while s <> ' ' do
    begin
      inc(j); a[j] := Trim( Parse( s, #13 ) );
      s := Trim( s );
    end;
    for k:=1 to j do memo.Add(int2str(k)+') '+a[j]+#13#10);
    memo.Add(' '#13#10);
    memo.Add('Сама строка: '#13#10+Filelist);
    end;


    Почему то у меня все строки в полученном массиве одинаковые.
  • Vladimir Kladov © (17.10.10 06:59) [11]
    Не мудрено. +a[k]+
  • RusSun © (17.10.10 09:28) [12]
    (17.10.10 06:59) [11]
    Время отдохнуть Ч/з полчаса как выключил ноут понял где промах.
    Спасибо. Вопрос решен. Тема закрыта.
 
Конференция "KOL" » пример на Компонент dragnDrop [Delphi, Windows]
Есть новые Нет новых   [134430   +3][b:0][p:0.006]