Re: WinApi - Drag&Drop проблема
Як же виявити момилку?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → WinApi - Drag&Drop проблема
Сторінки Попередня 1 2 3 4 Наступна
Для відправлення відповіді ви повинні увійти або зареєструватися
Змінив:
char *chFileName;
MAXPATH на MAX_PATH (до речі, перевірте, може вони в Вас різні константи вертають
ну і звісно
for (int j=1; j<MAX_PATH; j++){
RichEdit1->Lines->Strings[i] = RichEdit1->Lines->Strings[i] + chFileName[j];
}
Наскільки я зрозумів він зупиняється на цьому:
First chance exception at $0030002E. Exception class $C0000005 with message 'access violation at 0x0030002e: read of address 0x0030002e'. Process Project3.exe (4896)
[bcc32 Error] Unit4.cpp(187): E2034 Cannot convert 'char *' to 'wchar_t *'
Не хоче він Char
incrome
Ну та й що? Адреса не може буди прочитана (доступ), а це що значить, значить десь вказівник вказує не туди куди потрібно (а може взагалі його не існує, це рядок, може виходить за межі, намагається втулити, наприклад, зщамість 100 символьного рядку - 260-символів, а там і до форматування диску С, не далеко
Дізнайтеся в довідці від RAD Studio XE3, чи не використовуєте ви якихось застарілих функцій (Deprecated)
[bcc32 Error] Unit4.cpp(187): E2034 Cannot convert 'char *' to 'wchar_t *'
Не хоче він Char
Така істрорія, тількі що пишу як ви сказали, але з типом даних TCHAR! І що ви думаєте? Все запрацювало, але видав він мені щось незрозуміле перщі символи зі шляху а далі якісь символи. Подумав я може убрати цикл, та убрав! Він мені видав частину шляху, наступна спроба уже була з помилкою, вернув на цикл, тепер весь час помилки!
incrome
А до речі, спробуйте char у зв_язці з функцією DragQueryFileA замість юнікодної
Така істрорія, тількі що пишу як ви сказали, але з типом даних TCHAR! І що ви думаєте? Все запрацювало, але видав він мені щось незрозуміле перщі символи зі шляху а далі якісь символи. Подумав я може убрати цикл, та убрав! Він мені видав частину шляху, наступна спроба уже була з помилкою, вернув на цикл, тепер весь час помилки!
А як Ви компілюєте? Може краще Ctrl + F9 ?
incrome написав:Така істрорія, тількі що пишу як ви сказали, але з типом даних TCHAR! І що ви думаєте? Все запрацювало, але видав він мені щось незрозуміле перщі символи зі шляху а далі якісь символи. Подумав я може убрати цикл, та убрав! Він мені видав частину шляху, наступна спроба уже була з помилкою, вернув на цикл, тепер весь час помилки!
А як Ви компілюєте? Може краще Ctrl + F9 ?
Маєте на увазі дебаг? І так і так пробував! Все з Char розібрася, змінив! Все тепер з Char, але таж помилка!
First chance exception at $006605D9. Exception class $C0000005 with message 'access violation at 0x006605d9: read of address 0x555c3a2f'. Process Project3.exe (1600)
incrome
Це досить дивно, а якщо без річЕдіт, а замість нього вставити месседжБокс? Теж помилка є?
Якщо робити через DragQueryFileA і Char то також помилка! А якщо через AnsiStirng то помилки немає але нічого не виводить!
incrome
Це досить дивно, а якщо без річЕдіт, а замість нього вставити месседжБокс? Теж помилка є?
Яж писав, навіть якщо в глобальну змінну писати! Зараз я у Form4->Caption записував...
incrome
Наведіть будь ласка повник код програми, яка є зараз
Стоп стоп, це помилка якщо у Caption писати, а якщо у річедіт то така вилазить:
Не звертайте уваги там код крім того над чим ми думаємо не редагований)
//---------------------------------------------------------------------------
#ifndef Unit4H
#define Unit4H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <Vcl.ComCtrls.hpp>
#include <Vcl.DBGrids.hpp>
#include <Vcl.DBLookup.hpp>
#include <Vcl.FileCtrl.hpp>
#include <Vcl.Grids.hpp>
#include <Vcl.Outline.hpp>
#include <Vcl.Samples.DirOutln.hpp>
#include "shellapi.h"
#include <Vcl.AppEvnts.hpp>
//---------------------------------------------------------------------------
class TForm4 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TTimer *Timer1;
TDirectoryListBox *DirectoryListBox1;
TRichEdit *RichEdit1;
void __fastcall iClick(TObject *Sender);
void __fastcall iMove(TObject *Sender, TShiftState Shift, int X, int Y);
void __fastcall FormCreate(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
void __fastcall WmDropFiles(TWMDropFiles& Message);
protected:
public: // User declarations
__fastcall TForm4(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WmDropFiles)
END_MESSAGE_MAP(TForm);
void nImage(int num,UnicodeString path,int t,int l,int w,int h);
void Read(UnicodeString a);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm4 *Form4;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit4.h"
#include "Unit1.h"
#include <shellapi.hpp>
#include <windows.h>
#include <dir.h>
#include "string.h"
#include<stdlib.h>
#include <stdio.h>
#include <time.h>
#include <fstream>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm4 *Form4;
POINT Fx;
TColor R_G_B = (TColor)RGB(101,101,101);
int CountImage = 1;
int WM_FILEREADY = WM_USER + 2000;
int step = 0;
UnicodeString abc;
UnicodeString PP;
//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
: TForm(Owner)
{
}
void TForm4::nImage(int num,UnicodeString path,int l,int t,int w,int h){
/* TImage *_img[1];
_img[num] = new TImage (Form4);
_img[num]->Parent = Form4;
_img[num]->Top = t;
_img[num]->Left = l;
_img[num]->Width = w;
_img[num]->Height = h;
_img[num]->Picture->LoadFromFile(path);
_img[num]->OnClick = iClick;
_img[num]->OnMouseMove = iMove;
*/
TImage *Elements;
Elements = new TImage (Form4);
Elements->Parent = Form4;
Elements->Top = t;
Elements->Left = l;
Elements->Width = w;
Elements->Height = h;
Elements->Picture->LoadFromFile(path);
Elements->Transparent = true;
Elements->Picture->Bitmap->TransparentColor = R_G_B;
Elements->OnClick = iClick;
//Elements->BringToFront();
//Elements->OnMouseMove = iMove;
}
//---------------------------------------------------------------------------
void __fastcall TForm4::iClick(TObject *Sender){
int a;
exit(0);
}
void __fastcall TForm4::iMove(TObject *Sender, TShiftState Shift, int X, int Y){
Fx.x = X;
Fx.y = Y;
Form4->Caption = Fx.x;
}
//---------------------------------------------------------------------------
void __fastcall TForm4::FormCreate(TObject *Sender)
{
DragAcceptFiles(Form4->Handle,True);
Form4->Color = R_G_B + 2;
Form4->TransparentColor = True;
Form4->TransparentColorValue = R_G_B;
}
//---------------------------------------------------------------------------
/*
for (_x = 0; _x < Form4->Width ; _x++) {
for (_y = 0; _y < Form4->Width ; _y++) {
color = Canvas->Pixels[_x][_y];
if (color == R_G_B) {
_img[1]->Canvas->Pixels[_x][_y] = clBlack;
}
}
}
unsigned red = GetRValue(color); // красная составляющая
unsigned green = GetGValue(color); // зеленая составляющая
unsigned blue = GetBValue(color); // синяя составляющая
unsigned luminosity = (GetRValue(color)*77 + GetGValue(color)*151 + GetBValue(color)*28) >> 8;
ShowMessage(Canvas->Pixels[Fx.x][Fx.y]);
Form4->Caption = Form4->TransparentColorValue;
TColor color = Canvas->Pixels[Fx.x][Fx.y];
*/
//---------------------------------------------------------------------------
void __fastcall TForm4::Button1Click(TObject *Sender)
{
step += 50;
int x = GetSystemMetrics(SM_CXSCREEN);
int y = GetSystemMetrics(SM_CYSCREEN);
Form4->Caption = x;
Form1->Show();
for (int i = 0; i < 1000; i+=10) {
nImage(1,"D:\\Курсовой\\Программная часть(1%)\\Win32\\Release\\TollsBar2.bmp",x-125,y - 340-i,155,12);
}
nImage(1,"D:\\Курсовой\\Программная часть(1%)\\Win32\\Release\\TollsBar.bmp",x-125,y-340,155,267);
nImage(1,"D:\\Курсовой\\Программная часть(1%)\\Win32\\Release\\Улитка.bmp",x-300,y-300,1000,1000);
nImage(1,"D:\\Курсовой\\Программная часть(1%)\\Win32\\Release\\valik.bmp",x-200,y - 340,100,100);
nImage(1,"D:\\Курсовой\\Программная часть(1%)\\Win32\\Release\\Skroll.bmp",x-125,y - 500,60,67);
//Form4->Refresh();
TIcon * Ico = new TIcon;
TBitmap * Bmp = new TBitmap;
TBitmap * Out = new TBitmap;
SHFILEINFO FileInfo;
//SHGetFileInfo(abc.c_str(), 0, &FileInfo, sizeof(FileInfo), SHGFI_ICON);
Ico->Handle=FileInfo.hIcon;
Ico->SaveToFile("D:\\1.wma.ico");
Bmp->Width = Ico->Width;
Bmp->Height = Ico->Height;
Bmp->Canvas->Brush->Color = R_G_B;
Bmp->Canvas->FillRect(Rect(0,0,Bmp->Width,Bmp->Height));
Bmp->Canvas->Draw(0,0,Ico);
Out->Width = 50;
Out->Height = 50;
Out->Canvas->CopyRect(Rect(0,0,50,50),Bmp->Canvas,Rect(0,0,Ico->Width,Ico->Height));
Out->SaveToFile("D:\\123.bmp");
delete Ico;
int an = 300;
nImage(1,"D:\\123.bmp",(x-70)-300,(y-340)-step,300+an,280);
}
//---------------------------------------------------------------------------
/*
void __fastcall TForm4::WmDropFiles(TWMDropFiles& Message)
{
wchar_t *fName;
int a = DragQueryFile(HDROP (Message.Drop), 0, fName , MAXPATH);
//int filenum = DragQueryFileW(drop_handle, -1, NULL, NULL);
//for(int i = 0; i < filenum; i++){
//UnicodeString aaa;
DragQueryFile(HDROP (Message.Drop), 0, fName , a);
Form4->Caption = fName;
//ReadPath(fName);
DragFinish(HDROP (Message.Drop));
//}
} */
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++)//цикл по файлам
{
DragQueryFileA(HDROP (Message.Drop),i,chFileName,MAX_PATH); // запрос имени файла
//abc = DragQueryFile(HDROP (Message.Drop),i,chFileName.c_str(),MAXPATH); // запрос имени файла
//Form4->Caption = abc;
//UnicodeString a;
//Read(chFileName);
for (int j=1; j<MAX_PATH; j++){
RichEdit1->Lines->Strings[i] = RichEdit1->Lines->Strings[i] + chFileName[j];
//RichEdit1->Lines->Strings[i] = chFileName;
}
//Form4->Caption = chFileName;
}
DragFinish(HDROP (Message.Drop)); // завершение перетаскивания
}
Цікава штука, деякі файли нормально виводить, а деякі з помилкою