1 Востаннє редагувалося incrome (15.06.2013 12:15:52)

Тема: WinApi - Drag&Drop проблема

Маю таку проблему будь ласка допомжіть якщо не важко!
Маю такий код:
Unit1.h

private:    // User declarations
    void __fastcall WmDropFiles(TWMDropFiles& Message);
public:     // User declarations
    __fastcall TForm4(TComponent* Owner);
    BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WmDropFiles)
    END_MESSAGE_MAP(TForm); 

Unit1.cpp

void __fastcall TForm4::FormCreate(TObject *Sender)
{
DragAcceptFiles(Form4->Handle,True);
}

void __fastcall TForm4::WmDropFiles(TWMDropFiles& Message)
{
wchar_t *chFileName;
int Count;
Count = DragQueryFile(HDROP (Message.Drop), 0xFFFFFFFF,chFileName,MAXPATH); // число перетащенных файлов
for (int i=0;i<Count;i++)//цикл по файлам
  {
   DragQueryFile(HDROP (Message.Drop),i,chFileName,MAXPATH); // запрос имени файла
   RichEdit1->Lines->Add(chFileName);
  }
DragFinish(HDROP (Message.Drop)); // завершение перетаскивания
 
  }

Добре , це функція яка дає змогу вилучати шлях файлів з середовища віндовс при перетягуванні на форму. Все працює, шлях я вилучаю але коли я хочу його записати в  RichEdit1 виникає така помилка, на рисунку 13.jpg
----------------------------------------------------------------------------------------------------------------
------------------------------------------------Вирішення помилки далі-----------------------------------------

  void __fastcall TForm4::WmDropFiles(TWMDropFiles& Message)
{
char *chFileName = "";
//AnsiString chFileName;
int Count;
Count = DragQueryFileA(HDROP (Message.Drop), 0xFFFFFFFF, chFileName, MAX_PATH);
//Count = DragQueryFile(HDROP (Message.Drop), 0xFFFFFFFF,chFileName.c_str(),MAXPATH);
for (int i=0;i<Count;i++)
  {
   if ( DragQueryFileA(HDROP (Message.Drop), i, chFileName, MAX_PATH) != 0 )
   {
        MessageBox( Form4->Handle, "Its allright", "good", MB_OK);
   } else
   {
        MessageBox( Form4->Handle, "Dont good, error", "error", MB_OK);
        chFileName = "Error";
   }


    for (int j=0; j < strlen( chFileName ); j++){
    //Тут треба передати шлях у глобальну змінну.
    Global = chFileName; 
   }
  }
DragFinish(HDROP (Message.Drop));
 
  }

Також треба зробити заміну "_TChar maps to: wchar_t на Char".Це заходиться у розділі "Опціі проекта".

Програмуваню необхідні знання! Друзі! Ми всі забули про виділення пам'яті!
Ось так повинно бути:

  void __fastcall TForm4::WmDropFiles(TWMDropFiles& Message)
{
char *chFileName = "";
int Count;
Count = DragQueryFileA(HDROP (Message.Drop), 0xFFFFFFFF, chFileName, MAX_PATH);
for (int i=0;i<Count;i++)
  {
   DWORD size = DragQueryFile((HDROP)Message.Drop, i, 0, 0);
   chFileName = new char[size + 1];
   if ( DragQueryFileA(HDROP (Message.Drop), i, chFileName, MAX_PATH) != 0 )
   {
        MessageBox( Form4->Handle, "Its allright", "good", MB_OK);
   } else
   {
        MessageBox( Form4->Handle, "Dont good, error", "error", MB_OK);
        chFileName = "Error";
   }


    for (int j=0; j < strlen( chFileName ); j++){
        RichEdit1->Lines->Strings[i] = RichEdit1->Lines->Strings[i] + chFileName[j];
        //abc = chFileName;
        //IcoGen(abc);
   }
  }
DragFinish(HDROP (Message.Drop));

  }

За пам'ятю необхідно слідкувати!)

Post's attachments

13.jpg 123.33 kb, 333 downloads since 2013-06-13 

Подякували: Chemist-i1

2 Востаннє редагувалося Chemist-i (13.06.2013 21:43:07)

Re: WinApi - Drag&Drop проблема

incrome
У функції FormCreate RichEdit ще не створений, а ви в нього вже намагаєтесь писати. Тому що по перше створюється форма, а потім всі контроли.
Як вирішення цієї проблеми, можу порадити писати шлях у глобальну змінну, а потім вже у FormShow, наприклад, закидувати у RichEdit

Подякували: Очі.завидющі1

3

Re: WinApi - Drag&Drop проблема

Як це не створений? Він вже на формі є! Така помилка виникає, при перетягненні на форму якогось файла! Форма вже є і всі елементи вже є на ній!

4

Re: WinApi - Drag&Drop проблема

incrome
Ой, соррі, я не туди глянув. Треба трохи подумати.

5

Re: WinApi - Drag&Drop проблема

сама проблемма в тому що навіть при передачі тексту через функцію, також помилка! Наприклад якщо я зроблю так:

void __fastcall TForm4::WmDropFiles(TWMDropFiles& Message)
{
wchar_t *chFileName;
int Count;
Count = DragQueryFile(HDROP (Message.Drop), 0xFFFFFFFF,chFileName,MAXPATH); // число перетащенных файлов
for (int i=0;i<Count;i++)//цикл по файлам
  {
   DragQueryFile(HDROP (Message.Drop),i,chFileName,MAXPATH); // запрос имени файла
   Read(chFileName);
  }
DragFinish(HDROP (Message.Drop)); // завершение перетаскивания

void TForm4::Read(UnicodeString a){
RichEdit1->Lines->Add(a);
}
  }

6

Re: WinApi - Drag&Drop проблема

а! є ще дещо що, текст вписуэться але відразу ж ця помилка! І все кінець!

7 Востаннє редагувалося Chemist-i (13.06.2013 21:58:20)

Re: WinApi - Drag&Drop проблема

А якщо замість

RichEdit1->Lines->Add(a);

зробити

RichEdit1->Lines->Strings[0] = a;

8

Re: WinApi - Drag&Drop проблема

Зробив, але це нічого не змінило! Також помилка! Але ні є де що, тепер шлях зовсім не виводиться!

9

Re: WinApi - Drag&Drop проблема

incrome
Щось с кодуванням (або може з останнім символом, судячи з Вашого зауваження) я хотів швидко Ваш приклад скомпілювати, але в мене борляндія на другому компі, а він, щось не запускається =(

10

Re: WinApi - Drag&Drop проблема

Ось є де що! Я спробував записати у глобальну змінну , та побачив це:
http://www.pictureshack.ru/images/76458_aaaa.png

11

Re: WinApi - Drag&Drop проблема

А чого так багато повідомлень, ви групу файлів дропите?

12

Re: WinApi - Drag&Drop проблема

Знаєте є де що! Але це напевно безглуздо, але це працювало!
Якщо так:
Я замість "wchar_t *chFileName;" , написав так (UnicodeString  chFileName;)
A тут я замінив авжеж на  "DragQueryFile(HDROP (Message.Drop),i,chFileName.с_str(),MAXPATH);"
І все це виводив так:
DWORD a = DragQueryFile(HDROP (Message.Drop),i,chFileName.с_str(),MAXPATH);
RichEdit1->Text = a;
Все це працює! Але він не виводить перщі 5 символів!

13 Востаннє редагувалося Очі.завидющі (13.06.2013 22:16:04)

Re: WinApi - Drag&Drop проблема

я у VCL нічого не тямлю, але це схоже на трабли з вказівником на функцію. Я гадаю, що вам варто поствити точку зупину (брекпойнт) на 

DragQueryFile(HDROP (Message.Drop),i,chFileName_str(),MAXPATH) 

14

Re: WinApi - Drag&Drop проблема

Ні! Воно само так! Я думав що це грішить цикл , алеж ні! Якщо його убрати нічго не міняється...

15

Re: WinApi - Drag&Drop проблема

Очі.завидющі написав:

я у VCL нічого не тямлю, але це схоже на трабли з вказівником на функцію. Я гадаю, що вам варто поствити точку зупину (брекпойнт) на 

DragQueryFile(HDROP (Message.Drop),i,chFileName_str(),MAXPATH) 

Це не має ніякого сенсу тому що я точно знаю де помилка! Якщо закоментувати вивід інформації на RichEdit1 то ніяких помилок нема!

16

Re: WinApi - Drag&Drop проблема

Я дуже довго розбирався з самою технологією обробки повідомлення, і цієї проблеми ні в кого нема, тільки я такий щасливчик!

17

Re: WinApi - Drag&Drop проблема

Тут питання не тільки в якому рядку, а й за яких обставин (значень змінних).

18

Re: WinApi - Drag&Drop проблема

Білдер 6, працює:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm4 *Form4;
//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm4::FormCreate(TObject *Sender)
{
DragAcceptFiles(Form4->Handle,True);
}

void __fastcall TForm4::WmDropFiles(TWMDropFiles& Message)
{
char *chFileName;
int Count;
Count = DragQueryFile(HDROP (Message.Drop), 0xFFFFFFFF, chFileName, MAX_PATH);
for (int i=0; i<Count; i++)
  {
   DragQueryFile(HDROP (Message.Drop),i, chFileName, MAX_PATH);

   for (int j=1; j<MAX_PATH; j++){
        RichEdit1->Lines->Strings[i] = RichEdit1->Lines->Strings[i] + chFileName[j];
   }

   //RichEdit1->Lines->Add(chFileName);
   MessageBox( Form4->Handle, chFileName, chFileName, MB_OK);
  }
DragFinish(HDROP (Message.Drop));


//RichEdit1->Lines->Add(chFileName);
  }
//---------------------------------------------------------------------------
Подякували: incrome1

19 Востаннє редагувалося incrome (13.06.2013 22:39:36)

Re: WinApi - Drag&Drop проблема

Очі.завидющі написав:

Тут питання не тільки в якому рядку, а й за яких обставин (значень змінних).

Щось я ставлю і нічого не виходить! Я запускав в (Debug) він мені до помолки працює, а далі вибиває щось із ассемблеру! А я його не знаю :(

20

Re: WinApi - Drag&Drop проблема

Як же це важко, я так і знав що це мій RAD Studio XE3... Щож мені робити це дуже важлива частина в моїй роботі...